Q1ngying

今朝梦醒与君别,遥盼春风寄相思

0%

UniswapV2-Factory

本文主要关注于 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);

如果tokenAtokenB交易对已经创建,返回交易对的地址;否则返回address(0)

  • tokenAtokenB顺序可互换
  • 还可以通过 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 如果tokenAtokenB还没有被创建

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);
}