这可能是一个迟到的答案,但我只是偶然发现了同样的问题,并认为它可能对其他人有所帮助。
不幸的是,Etherscan 不擅长显示数字,目前不知道负数的概念。
以下是解码给定日志的方法:
在例如beaconcha.in,获取发出日志的原始数据:
0xffffffffffffffffffffffffffffffffffffffffffffffffdacb2cb45d2d800000000000000000000000000000000000000000000000016edc8bc819f8b8b50900000000000000000000000000000000000000324b97f19a3936459e285115b700000000000000000000000000000000000000000000053f31c5c8cac5d23340000000000000000000000000000000000000000000000000000000000001321a
正如您已经知道事件的参数,这些参数可用于解码这些数据。文档中缺少一件事:
前两个参数(发件人和收件人)已编入索引。索引参数不是日志数据的一部分。您可以在 source code 本身中找到它:
event Swap(
address indexed sender,
address indexed recipient,
int256 amount0,
int256 amount1,
uint160 sqrtPriceX96,
uint128 liquidity,
int24 tick
);
或者作为 pool's contract ABI on Etherscan 的一部分。
给定非索引参数类型int256,int256,uint160,uint128,int24,您可以使用online ABI decoder在线解码这些参数:
Example of how to input the data
这会按给定顺序生成解码后的参数:
-2681000000000000000,6767400346701675410697,3984803190183823086827191997879,24777563784443426124608,78362
要进一步了解它们,您必须知道池的token0和token1是什么。这必须仔细检查,因为它们只是按 UniswapV3 的字母顺序排序。对于给定的池,这些是:
token0 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 = WETH (18 decimals)
token1 = 0xf4d2888d29D722226FafA5d9B24F9164c092421E = LOOKS (18 decimals)
应用小数产生以下金额:
amount0 = -2.681000000000000000 WETH
amount1 = 6767.400346701675410697 LOOKS
正如文档中所定义的,两者都是“池中余额的增量”,措辞不同,可以理解为:
amount0: how many of token0 the pool received during this swap
amount1: how many of token1 the pool received during this swap
由于 amount0 为负(amount0 和 amount1 之一必须为负),这意味着矿池“损失”了 2.681 ETH 并“获得”了 ~6767.4 LOOKS。对于交换的发起者来说,情况恰恰相反,他们花费了 2.681 ETH 并获得了 ~6767.4 LOOKS。
或者正如 Etherscan 所说,他们将 ~6767.4 LOOKS 换成了 2.681 ETH。