diff --git a/src/FluxFactory.sol b/src/FluxFactory.sol new file mode 100644 index 0000000..4d6e5c2 --- /dev/null +++ b/src/FluxFactory.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.36; + +import {FluxPair} from "./FluxPair.sol"; +import {IFluxFactory} from "./interfaces/IFluxFactory.sol"; + +/// @title Deploys and registers constant-product pairs at deterministic CREATE2 addresses. +contract FluxFactory is IFluxFactory { + address public feeTo; + address public feeToSetter; + + mapping(address => mapping(address => address)) public getPair; + address[] public allPairs; + + constructor(address setter) { + feeToSetter = setter; + } + + function allPairsLength() external view returns (uint256) { + return allPairs.length; + } + + function createPair(address tokenA, address tokenB) external returns (address pair) { + require(tokenA != tokenB, "Flux: IDENTICAL_ADDRESSES"); + (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); + require(token0 != address(0), "Flux: ZERO_ADDRESS"); + require(getPair[token0][token1] == address(0), "Flux: PAIR_EXISTS"); + + bytes32 salt = keccak256(abi.encodePacked(token0, token1)); + pair = address(new FluxPair{salt: salt}()); + FluxPair(pair).initialize(token0, token1); + + getPair[token0][token1] = pair; + getPair[token1][token0] = pair; + allPairs.push(pair); + emit PairCreated(token0, token1, pair, allPairs.length); + } + + function setFeeTo(address to) external { + require(msg.sender == feeToSetter, "Flux: FORBIDDEN"); + feeTo = to; + } + + function setFeeToSetter(address setter) external { + require(msg.sender == feeToSetter, "Flux: FORBIDDEN"); + feeToSetter = setter; + } +}