看一下工厂合约的 pair
的 token0
和 token1
的细节。
1 | function createPair(address tokenA, address tokenB) external returns (address pair) { |
我们先看
(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
这句话的意思是地址更小的放在 token0
。
看下面的例子
AVXL = "0xBD29490383edFd560426C3B63d01534408bC2da6"
BNB = "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"
AVXL_BNB_pair = 0x0cA8Eafd9b851228c0C7A65a43aded02B964dfD6
经查询
token0 = "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c"
token1 = "0xbd29490383edfd560426c3b63d01534408bc2da6"
其中 token0 < token1
,但是如果使用 Web3.toChecksumAddress(address)
进行转化的话。
上面的
Web3.toChecksumAddress(token0) > Web3.toChecksumAddress(token1)
所以,比较大小的时候,双方比较的地址要么都是小写,要么,都是大写,不能转化为 ETH
大小写兼并的模式。
另外你可以参考我的另一个博客
经过我长时间的使用来看,有的时候上面的理论并不适合。理论是,pancakeswap
之流的 token0
和 token1
是按照大小写排列的,但是,总是有一些 pool
不是这样的。
所以,我最后选用的方法是,直接比较 token0
的地址和某一个 token
的地址,是否一致,然后进行赋值,这样就保证万无一失了。