The most obvious way to get the address for a pair is to call getPair on the factory. If the pair exists, this function will return its address, else address(0)
(0x0000000000000000000000000000000000000000
).
Thanks to some fancy footwork in the factory, we can also compute pair addresses without any on-chain lookups because of CREATE2. The following values are required for this technique:
address | The factory address |
salt | keccak256(abi.encodePacked(token0, token1)) |
keccak256(init_code) | 0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f |
token0
must be strictly less than token1
by sort order.keccak256
.address factory = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;address token0 = 0xCAFE000000000000000000000000000000000000; // change me!address token1 = 0xF00D000000000000000000000000000000000000; // change me!address pair = address(uint(keccak256(abi.encodePacked(hex'ff',factory,keccak256(abi.encodePacked(token0, token1)),hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f'))));
This example makes use of the Uniswap SDK. In reality, the SDK computes pair addresses behind the scenes, obviating the need to compute them manually like this.
import { FACTORY_ADDRESS, INIT_CODE_HASH } from '@uniswap/sdk'import { pack, keccak256 } from '@ethersproject/solidity'import { getCreate2Address } from '@ethersproject/address'const token0 = '0xCAFE000000000000000000000000000000000000' // change me!const token1 = '0xF00D000000000000000000000000000000000000' // change me!const pair = getCreate2Address(FACTORY_ADDRESS,keccak256(['bytes'], [pack(['address', 'address'], [token0, token1])]),INIT_CODE_HASH')