我正在检查Uniswap承包github回购公司,我不明白它们如何在不导入代码或拥有ERC20令牌智能契约地址的情况下动态使用任何ERC20令牌。
我知道魔术在这个函数中,特别是在程序集create2函数中,但是不能正确地理解它。
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);
}有人能提供进一步的信息吗?
发布于 2021-03-17 23:26:19
createPair以两个ERC20契约地址作为输入,并返回此对的地址。此地址是使用CREATE2 2操作码确定计算的。因此,所有信息本身都是可用的,不需要硬编码地址。getPair被动态填充成对地址。
https://ethereum.stackexchange.com/questions/94814
复制相似问题