Factory 컨트랙트는 공장에서 물건을 만들듯이, 토큰 교환을 위한 Pool 을 만드는 컨트랙트이다.
각 Token pair 마다 하나의 컨트랙트가 생성되며, 생성되는 컨트랙트의 주소를 미리 계산하기 위해 create2 를 사용한다.
Factory 의 인터페이스를 살펴보았다.
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
feeTo() : pool 을 생성되면서 Protocol fee 가 지불되는 주소이다.
feeToSetter() : feeTo 를 설정할 수 있는 일종의 관리자 계정 주소이다.
getPair() : 두 개의 토큰 pair pool 을 제공하는 컨트랙트의 주소이다.
allPairs() : allPairs 는 동적 배열로 선언되어 있다. int 를 넣으면 해당 인덱스의 pair 컨트랙트 주소가 반환된다.
allPairsLength() : allPairs 배열의 길이를 반환한다. 전체 pair pool 의 갯수이다.
createPair : 두 개의 토큰으로 이루어진 pair pool 을 생성한다.
setFeeTo() : feeTo 의 주소를 변경한다.
setFeeToSetter() : feeToSetter 의 주소를 변경한다.
순서대로 Factory 코드를 이해해보았다.
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;
}