22
How Uniswap deployed contract to the same address?
I thought all the Ethereum-based contract address was random, just like how we access the wallet from the randomized private key.
Until I found interesting notes from Uniswap v2 Docs.
The Uniswap V2 router address is
0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
for all networks.Moreover, Uniswap LP token address can be deterministicly computed offline.
Wow, These are such a nice dev experience ✨. So I want to explore how they do it.
The address for an Ethereum contract is deterministically computed from the address of its creator (sender) and how many transactions the creator has sent (nonce)
So one simple way is to use the same wallet (address) to deploy all networks, and deploy with the first transaction of the wallet, so nonce will be the same. 🎉
But why?: I think this is quite convenient for the testnet development. The developers have no more need to google for the different testnet address, or make the config handle different addresses.
A new opcode,
CREATE2
was added in EIP-1014 that is another way that a contract can be created. For contract created byCREATE2
its address will be:
keccak256( 0xff ++ senderAddress ++ salt ++ keccak256(init_code))[12:]
Considering variable params needed...
-
init_code
is a byte code from the deployed contract -
salt
is something which can be changed.
So Uniswap utilized salt
to be a hash of token0
and token1
addresses. That's why it is always deterministic. 🎉
Which I think this is also helpful to Uniswap to avoid having a duplicate LP for the same pair of tokens.
But why?: This is quite useful to get the information of each LP without looking up LP address. We just need the addresses of 2 tokens, then compute the LP address to retrieve the information right away.
Thanks to a nice summary from: https://ethereum.stackexchange.com/a/761/76945
22