#transfer #ethereum #transaction #blockchain #web3

erc20

从区块链中解析ERC20交易的简单实现

2个版本

0.1.1 2020年12月9日
0.1.0 2020年12月8日

#133 in #transfer

自定义许可

27KB
641

erc20

Current TravisCI build status. Current version. Current total lines. License.

Rust ERC20解析器

本项目旨在将web3中的以太坊交易解析为一种抽象,以便对以太坊或ERC20转账进行通用处理。

可在https://crates.io/crates/erc20找到

代码示例

解析转账

let serialized_str = "a9059cbb0000000000000000000000006748f50f686bfbca6fe8ad62b22228b87f31ff2b00000000000000000000000000000000000000000000003635c9adc5dea00000";

let transaction = Transaction {
    hash: string_to_h256("43a5d6d13b6a9dca381e3f4b4677a4b9e5d9f80d1a5b6cfa2b1404fab733bcee".to_string()).unwrap(),
    nonce: Default::default(),
    block_hash: None,
    block_number: None,
    transaction_index: None,
    from: H160::random(),
    to: Some(H160::random()),
    value: Default::default(),
    gas_price: Default::default(),
    gas: Default::default(),
    input: Bytes(hex::decode(serialized_str).unwrap()),
    raw: None,
};

let resp: Result<TransactionAndTransferType, ERC20Error> = transaction.clone().try_into();

识别ERC20合约地址

let tusd_address = H160::from_str("0000000000085d4780B73119b644AE5ecd22b376").unwrap();
assert_eq!("0x0000000000085d4780b73119b644ae5ecd22b376".to_string(), format!("{:?}", tusd_address));

let contract_address: ContractAddress = tusd_address.into();
assert_eq!(ContractAddress::TUSD, contract_address);

// let tusd_from_contract: H160 = contract_address.into();
// assert_eq!(tusd_address, tusd_from_contract);

参考资料

依赖项

~9.5MB
~140K SLoC