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