Solidity

三元運算符 Uniswap createPair 函式是做什麼的?

  • November 8, 2021
function createPair(address tokenA, address tokenB) external returns (address pair) {
       require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES');
       (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
       require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS');
       require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient
       bytes memory bytecode = type(UniswapV2Pair).creationCode;
       bytes32 salt = keccak256(abi.encodePacked(token0, token1));
       assembly {
           pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
       }
       IUniswapV2Pair(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);
   }

我無法理解這行程式碼的作用。它正在將 tokenA 與地址類型的 tokenB 進行比較。任何更多的解釋都會非常有幫助。 (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);

提前致謝 !!!

如果您要詢問三元運算符的作用,它相當於以更緊湊(且不太明顯)形式的 if /else 語句。

condition ? do_that_if_condition_is_true : do_that_if_condition_is_false;

在您的特定程式碼段中,它用於在創建令牌對之前以特定方式對地址進行排序。排序確保第一個令牌地址的數字小於第二個令牌地址(您的地址只是本質上是整數的十六進製表示,您可以進行比較)。

例如:令牌A = 地址(100)和令牌B = 地址(50)

  • 令牌0 = 令牌B
  • 令牌1 = 令牌A

其中:pair 總是等於 (token1, token2)。

這基本上就是這條線的作用:

(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);

鑑於 :

  1. 地址是唯一的
  2. 令牌地址不能相等 ( require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES');)

保證排序為給定對提供唯一標識符。

最後,一個簡單的檢查就足以驗證該對是否已經存在:

require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient

如果沒有,則可以創建它。

引用自:https://ethereum.stackexchange.com/questions/113113