use anyhow::Result;
use ethnum::U256;
use serde_derive::{Deserialize, Serialize};
use serde_hex::{SerHex, StrictPfx};
use std::io::{self, Read, Write};
pub trait SmartContract {
fn receive_inputs(&mut self, inputs: &mut SmartContractInputs) -> Result<()>;
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct SmartContractInputs {
pub version: i32,
pub account_info: AccountInfo,
pub protocol_input: ProtocolInputs,
pub contract_input: ContractInputs,
}
impl SmartContractInputs {
pub fn gather() -> Result<Self> {
let mut json_data: Vec<u8> = vec![];
let _num_bytes = io::stdin().read_to_end(&mut json_data)?;
Ok(serde_json::from_slice(&json_data)?)
}
pub fn account_info(&self) -> AccountInfo {
self.account_info.clone()
}
pub fn account_addr(&self) -> Address {
self.account_info.account_address.clone()
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ContractInputs {
pub contract_fn: String,
pub function_inputs: FunctionInputs,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ProtocolInputs {
pub version: i32,
pub block_height: u64,
pub block_time: u64,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct AccountInfo {
pub account_address: Address,
pub account_balance: U256,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub enum FunctionInputs {
Erc20(crate::eip20::Erc20Inputs),
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct SmartContractOutputs {
pub result: Vec<ContractResult>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub enum ContractResult {
Erc20(crate::eip20::Erc20Result),
Erc721(()),
}
impl SmartContractOutputs {
pub fn commit(&self) -> Result<()> {
Ok(io::stdout().write_all(serde_json::to_string(&self)?.as_bytes())?)
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Address(#[serde(with = "SerHex::<StrictPfx>")] pub [u8; 20]);