// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import './interfaces/IVertoV2Factory.sol'; import './libraries/PairNamer.sol'; //import './token/VertoToken.sol'; import './VertoV2Pair.sol'; contract VertoV2Factory is IVertoV2Factory { address public feeTo; address public setter; // address public miner; mapping(address => mapping(address => address)) public getPair; // mapping(address => address) public token2Pair; // mapping(address => address) public pair2Token; address[] public allPairs; // address[] public pairTokens; constructor(address _setter) { require(_setter != address(0), 'VertoV2: SETTER INVALID'); setter = _setter; } function allPairsLength() external view returns (uint) { return allPairs.length; } function createPair(address tokenA, address tokenB) external returns (address pair) { // require(miner != address(0), 'VertoV2: MINER INVALID'); require(tokenA != tokenB, 'VertoV2: IDENTICAL_ADDRESSES'); (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'VertoV2: ZERO_ADDRESS'); require(getPair[token0][token1] == address(0), 'VertoV2: PAIR_EXISTS'); // single check is sufficient bytes memory bytecode = type(VertoV2Pair).creationCode; bytes32 salt = keccak256(abi.encodePacked(token0, token1)); // bytes memory bytecode1 = type(VertoToken).creationCode; assembly { pair := create2(0, add(bytecode, 32), mload(bytecode), salt) // pToken := create2(0, add(bytecode1, 32), mload(bytecode1), salt) } IVertoV2Pair(pair).initialize(token0, token1); // IVertoV2Token(pToken).initialize("Pair Token", PairNamer.pairPtSymbol(tokenA, tokenB, "V"), 5760000 * 10 ** 18); // IVertoV2Token(pToken).addIssuer(miner); // IVertoV2Token(pToken).transferOwnership(setter); getPair[token0][token1] = pair; getPair[token1][token0] = pair; // token2Pair[pToken] = pair; // pair2Token[pair] = pToken; // populate mapping in the reverse direction allPairs.push(pair); // pairTokens.push(pToken); emit PairCreated(token0, token1, pair, allPairs.length); } function setFeeTo(address _feeTo) external { require(msg.sender == setter, 'VertoV2: FORBIDDEN'); feeTo = _feeTo; } function isContract(address addr) internal view returns (bool) { uint size; assembly {size := extcodesize(addr)} return size > 0; } }