feat(factory): add constant-product pair factory

This commit is contained in:
dualfroz committed 2026-08-26 11:44:00 +02:00
1 parent 7b365bb5b8
commit d5887a782e
1 file changed
+48
+48
View File
@@ -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;
}
}