github.com/0xPolygon/supernets2-node@v0.0.0-20230711153321-2fe574524eaa/test/contracts/uniswap/v2/UniswapV2Factory.sol (about) 1 pragma solidity =0.5.16; 2 3 import './IUniswapV2Factory.sol'; 4 import './UniswapV2Pair.sol'; 5 6 contract UniswapV2Factory is IUniswapV2Factory { 7 address public feeTo; 8 address public feeToSetter; 9 10 mapping(address => mapping(address => address)) public getPair; 11 address[] public allPairs; 12 13 event PairCreated(address indexed token0, address indexed token1, address pair, uint); 14 15 constructor(address _feeToSetter) public { 16 feeToSetter = _feeToSetter; 17 } 18 19 function allPairsLength() external view returns (uint) { 20 return allPairs.length; 21 } 22 23 function createPair(address tokenA, address tokenB) external returns (address pair) { 24 require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES'); 25 (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); 26 require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS'); 27 require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient 28 bytes memory bytecode = type(UniswapV2Pair).creationCode; 29 bytes32 salt = keccak256(abi.encodePacked(token0, token1)); 30 assembly { 31 pair := create2(0, add(bytecode, 32), mload(bytecode), salt) 32 } 33 IUniswapV2Pair(pair).initialize(token0, token1); 34 getPair[token0][token1] = pair; 35 getPair[token1][token0] = pair; // populate mapping in the reverse direction 36 allPairs.push(pair); 37 emit PairCreated(token0, token1, pair, allPairs.length); 38 } 39 40 function setFeeTo(address _feeTo) external { 41 require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN'); 42 feeTo = _feeTo; 43 } 44 45 function setFeeToSetter(address _feeToSetter) external { 46 require(msg.sender == feeToSetter, 'UniswapV2: FORBIDDEN'); 47 feeToSetter = _feeToSetter; 48 } 49 }