feat(factory): add constant-product pair factory
This commit is contained in:
1 parent
7b365bb5b8
commit
d5887a782e
1 file changed
+48
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user