0%

defi | pair 的 token0 和 token1

看一下工厂合约的 pairtoken0token1 的细节。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function createPair(address tokenA, address tokenB) external returns (address pair) {
require(tokenA != tokenB, 'Pancake: IDENTICAL_ADDRESSES');
(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), 'Pancake: ZERO_ADDRESS');
require(getPair[token0][token1] == address(0), 'Pancake: PAIR_EXISTS'); // single check is sufficient
bytes memory bytecode = type(PancakePair).creationCode;
bytes32 salt = keccak256(abi.encodePacked(token0, token1));
assembly {
pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
}
IPancakePair(pair).initialize(token0, token1);
getPair[token0][token1] = pair;
getPair[token1][token0] = pair; // populate mapping in the reverse direction
allPairs.push(pair);
emit PairCreated(token0, token1, pair, allPairs.length);
}

我们先看

(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 之流的 token0token1 是按照大小写排列的,但是,总是有一些 pool 不是这样的。

所以,我最后选用的方法是,直接比较 token0 的地址和某一个 token 的地址,是否一致,然后进行赋值,这样就保证万无一失了。

请我喝杯咖啡吧~