本文主要关注于 Uniswap V2 合约中 Factory 合约部分
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| pragma solidity =0.5.16;
import './interfaces/IUniswapV2Factory.sol'; import './UniswapV2Pair.sol';
contract UniswapV2Factory is IUniswapV2Factory { address public feeTo; address public feeToSetter;
mapping(address => mapping(address => address)) public getPair; address[] public allPairs;
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
constructor(address _feeToSetter) public { feeToSetter = _feeToSetter; }
function allPairsLength() external view returns (uint) { return allPairs.length; }
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); }
function setFeeTo(address _feeTo) external { require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN'); feeTo = _feeTo; }
function setFeeToSetter(address _feeToSetter) external { require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN'); feeToSetter = _feeToSetter; } }
|
Address
在以太坊主网上,UniswapV2Factory
部署在0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
。
Event
PairCreated
1
| event PairCreated(address indexed token0, address indexed token1, address pair, uint);
|
每次createPair时触发该事件
- 按排序顺序保证
token0
严格小于 token1
。
- 对于创建的第一个对,
uint
日志是1
,对于第二对,日志是2
以此类推…(seeallPairs/getPair)
Read-Only Functions
getPair
1
| function getPair(address tokenA, address tokenB) external view returns(address pair);
|
如果tokenA
和tokenB
交易对已经创建,返回交易对的地址;否则返回address(0)
tokenA
和tokenB
顺序可互换
- 还可以通过 SDK 确定性地计算对地址。
allPairs
1
| function allPairs(uint) external view returns (address pair);
|
返回通过 Factory 创建的第 n 个 Pair 地址,如果尚未创建足够多的 Pair,返回address(0)
- 第一个创建的 Pair 对应
0
,第二个创建的 Pair 对应1
,以此类推…
allPairsLength
1
| function allPairsLength() external view returns(uint);
|
返回迄今为止通过 Factory 创建的 Pairs 总数
feeTo
1
| function feeTo() external view returns (address);
|
参阅费用计算
feeToSetter
1
| function feeToSetter() external view returns (address);
|
允许去修改 feeTo
的地址
State-Changing Function
createPair
1
| function createPair(address tokenA, address tokenB) external returns (address pair);
|
创建一个 pair 如果tokenA
和tokenB
还没有被创建
Interface
1
| import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol';
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| pragma solidity >=0.5.0;
interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external biew returns(address pair); function allPairsLength() external view returns (uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function createPair(address tokenA, address tokenB) external returns (address pair); }
|