use std::{fmt::Debug, str::FromStr};
use axiom_sdk::{
axiom::{AxiomAPI, AxiomComputeFn, AxiomComputeInput, AxiomResult},
cmd::run_cli,
ethers::types::{Address, H256},
halo2_base::AssignedValue,
subquery::{AccountField, HeaderField, TxField},
Fr, HiLo,
};
#[AxiomComputeInput]
pub struct QuickstartInput {
pub block: u64,
pub addr: Address,
pub tx_block_number: u64,
pub tx_idx: u64,
pub slot: H256,
pub mapping_slot: H256,
}
impl AxiomComputeFn for QuickstartInput {
fn compute(
api: &mut AxiomAPI,
assigned_inputs: QuickstartCircuitInput<AssignedValue<Fr>>,
) -> Vec<AxiomResult> {
let _timestamp = api
.get_header(assigned_inputs.block)
.call(HeaderField::Timestamp);
let _gas_limit = api
.get_header(assigned_inputs.block)
.call(HeaderField::GasLimit);
let _balance = api
.get_account(assigned_inputs.block, assigned_inputs.addr)
.call(AccountField::Balance);
let _nonce = api
.get_account(assigned_inputs.block, assigned_inputs.addr)
.call(AccountField::Nonce);
let storage = api.get_storage(assigned_inputs.block, assigned_inputs.addr);
let _slot_val = storage.slot(assigned_inputs.slot);
let key = [0, 3].map(|i| api.ctx().load_constant(Fr::from(i)));
let mapping = api.get_mapping(
assigned_inputs.block,
assigned_inputs.addr,
assigned_inputs.mapping_slot,
);
let _mapping_val = mapping.key(HiLo::from_hi_lo(key));
let _function_selector = api
.get_tx(assigned_inputs.tx_block_number, assigned_inputs.tx_idx)
.call(TxField::FunctionSelector);
let calldata_idx = api.ctx().load_constant(Fr::from(1));
let _calldata = api
.get_tx(assigned_inputs.tx_block_number, assigned_inputs.tx_idx)
.calldata(calldata_idx);
let event_schema =
H256::from_str("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef")
.unwrap();
let log_idx = api.ctx().load_constant(Fr::from(0));
let topic_idx = api.ctx().load_constant(Fr::from(1));
let data_idx = api.ctx().load_constant(Fr::from(0));
let _addr = api
.get_receipt(assigned_inputs.tx_block_number, assigned_inputs.tx_idx)
.log(log_idx)
.address();
let _topic = api
.get_receipt(assigned_inputs.tx_block_number, assigned_inputs.tx_idx)
.log(log_idx)
.topic(topic_idx, Some(event_schema));
let _data = api
.get_receipt(assigned_inputs.tx_block_number, assigned_inputs.tx_idx)
.log(log_idx)
.data(data_idx, Some(event_schema));
vec![]
}
}
fn main() {
env_logger::init();
run_cli::<QuickstartInput>();
}