Skip to content

Commit

Permalink
add implementation of Readable::read for Contract
Browse files Browse the repository at this point in the history
  • Loading branch information
saibatizoku committed Sep 15, 2021
1 parent 0f20b89 commit 08530cc
Showing 1 changed file with 52 additions and 3 deletions.
55 changes: 52 additions & 3 deletions 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},
Expand All @@ -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
Expand All @@ -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<Self, chain_core::mempack::ReadError> {
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))
}
}
}
}

Expand Down

0 comments on commit 08530cc

Please sign in to comment.