From 08530ccbb08bd89c8e6ce219ad3487afef1fb21e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20Rosales?= Date: Mon, 13 Sep 2021 15:46:01 -0500 Subject: [PATCH] add implementation of Readable::read for Contract --- chain-impl-mockchain/src/smartcontract/mod.rs | 55 ++++++++++++++++++- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/chain-impl-mockchain/src/smartcontract/mod.rs b/chain-impl-mockchain/src/smartcontract/mod.rs index e48b289ca..d1958aac4 100644 --- a/chain-impl-mockchain/src/smartcontract/mod.rs +++ b/chain-impl-mockchain/src/smartcontract/mod.rs @@ -1,6 +1,6 @@ //! EVM Smart Contract transactions -use chain_core::mempack::Readable; +use chain_core::mempack::{ReadError, Readable}; #[cfg(feature = "evm")] use chain_evm::{ machine::{Gas, GasPrice, Value}, @@ -10,6 +10,7 @@ use chain_evm::{ use crate::transaction::Payload; /// Variants of Smart Contract deployment +#[derive(Clone, Debug, PartialEq, Eq)] pub enum Contract { #[cfg(feature = "evm")] /// Deploys a smart contract from a given `AccountAddress`, as @@ -30,11 +31,59 @@ pub enum Contract { }, } +impl Contract {} + impl Readable for Contract { fn read( - _buf: &mut chain_core::mempack::ReadBuf, + buf: &mut chain_core::mempack::ReadBuf, ) -> Result { - todo!(); + let contract_type = buf.get_u8()?; + match contract_type { + 0 => { + #[cfg(not(feature = "evm"))] + { + Err(ReadError::UnknownTag(0)) + } + #[cfg(feature = "evm")] + { + // EVM Contract + let from = AccountAddress::from_slice(buf.get_slice(20)?); + let to = match buf.get_u8()? { + 0 => None, + _ => Some(AccountAddress::from_slice(buf.get_slice(20)?)), + }; + let gas = match buf.get_u8()? { + 0 => None, + _ => Some(Gas::from(buf.get_slice(32)?)), + }; + let gas_price = match buf.get_u8()? { + 0 => None, + _ => Some(GasPrice::from(buf.get_slice(32)?)), + }; + let value = match buf.get_u8()? { + 0 => None, + _ => Some(GasPrice::from(buf.get_slice(32)?)), + }; + let data = match buf.get_u8()? { + 0 => None, + _ => Some(ByteCode::from(buf.get_slice_end())), + }; + let contract = Contract::EVM { + from, + to, + gas, + gas_price, + value, + data, + }; + Ok(contract) + } + } + n => { + // + Err(ReadError::UnknownTag(n as u32)) + } + } } }