Skip to content
This repository has been archived by the owner on Oct 19, 2024. It is now read-only.

Create decode_tx_input.rs #1054

Merged
merged 3 commits into from
Mar 17, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions examples/decode_tx_input.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
use ethers::{abi::AbiDecode, prelude::*};
use eyre::Result;

// Abigen creates a SwapExactTokensForTokensCall struct that can be used to decode
// the call data for the swapExactTokensForTokens function in the IUniswapV2Router02 contract
abigen!(
IUniswapV2Router02,
r#"[
swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline)
]"#,
);
fn main() -> Result<()> {
println!("Decoding https://etherscan.io/tx/0xd1b449d8b1552156957309bffb988924569de34fbf21b51e7af31070cc80fe9a");
let tx_input = "0x38ed173900000000000000000000000000000000000000000001a717cc0a3e4f84c00000000000000000000000000000000000000000000000000000000000000283568400000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000201f129111c60401630932d9f9811bd5b5fff34e000000000000000000000000000000000000000000000000000000006227723d000000000000000000000000000000000000000000000000000000000000000200000000000000000000000095ad61b0a150d79219dcf64e1e6cc01f0b64c4ce000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7";
let calldata: Bytes = tx_input.parse().unwrap();
let decoded = SwapExactTokensForTokensCall::decode(&calldata)?;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this makes me think wether we should add a decode_hex function?

cc @gakonst

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah decode_hex(data: &str) which does the conversion internally, is blanked impl'ed on the trait and forwards to decode seems right


let from = decoded.path.into_iter().next().unwrap();
println!(
"Swapped {} of token {} for {} of token {}",
decoded.amount_in, from, decoded.amount_out_min, decoded.to
);

Ok(())
}