ETH Price: $3,445.89 (-4.67%)
 

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create Pool379966422025-11-10 13:50:3136 hrs ago1762782631IN
Aerodrome: Pool Factory
0 ETH0.000004250.00591894
Transfer379647202025-11-09 20:06:272 days ago1762718787IN
Aerodrome: Pool Factory
0.00000279 ETH0.000000120.00601428
Transfer379644872025-11-09 19:58:412 days ago1762718321IN
Aerodrome: Pool Factory
0.000051 ETH0.000000060.0032484
Create Pool378323752025-11-06 18:34:575 days ago1762454097IN
Aerodrome: Pool Factory
0 ETH0.00000330.00459796
Create Pool378254472025-11-06 14:44:015 days ago1762440241IN
Aerodrome: Pool Factory
0 ETH0.000014480.01976712
Create Pool377862712025-11-05 16:58:096 days ago1762361889IN
Aerodrome: Pool Factory
0 ETH0.000011230.0156297
Create Pool375145932025-10-30 10:02:1312 days ago1761818533IN
Aerodrome: Pool Factory
0 ETH0.000003750.0052259
Create Pool375119942025-10-30 8:35:3512 days ago1761813335IN
Aerodrome: Pool Factory
0 ETH0.000005190.00723715
Create Pool375111282025-10-30 8:06:4312 days ago1761811603IN
Aerodrome: Pool Factory
0 ETH0.000004470.00623097
Create Pool375097222025-10-30 7:19:5112 days ago1761808791IN
Aerodrome: Pool Factory
0 ETH0.000014910.02077145
Create Pool375086462025-10-30 6:43:5912 days ago1761806639IN
Aerodrome: Pool Factory
0 ETH0.000009280.01293404
Create Pool375072702025-10-30 5:58:0712 days ago1761803887IN
Aerodrome: Pool Factory
0 ETH0.000017590.02449836
Create Pool374746282025-10-29 11:50:0313 days ago1761738603IN
Aerodrome: Pool Factory
0 ETH0.000006440.0089779
Create Pool374729192025-10-29 10:53:0513 days ago1761735185IN
Aerodrome: Pool Factory
0 ETH0.000005230.00728584
Create Pool374711192025-10-29 9:53:0513 days ago1761731585IN
Aerodrome: Pool Factory
0 ETH0.000003070.0042875
Create Pool374700992025-10-29 9:19:0513 days ago1761729545IN
Aerodrome: Pool Factory
0 ETH0.000002990.00417772
Create Pool374685402025-10-29 8:27:0713 days ago1761726427IN
Aerodrome: Pool Factory
0 ETH0.00000690.00961628
Create Pool374673412025-10-29 7:47:0913 days ago1761724029IN
Aerodrome: Pool Factory
0 ETH0.000006290.00876328
Create Pool374659282025-10-29 7:00:0313 days ago1761721203IN
Aerodrome: Pool Factory
0 ETH0.00000390.00544016
Create Pool374643942025-10-29 6:08:5513 days ago1761718135IN
Aerodrome: Pool Factory
0 ETH0.000003630.00506764
Create Pool374633122025-10-29 5:32:5113 days ago1761715971IN
Aerodrome: Pool Factory
0 ETH0.000004720.00658415
Create Pool374622322025-10-29 4:56:5113 days ago1761713811IN
Aerodrome: Pool Factory
0 ETH0.000002310.00321754
Create Pool374610012025-10-29 4:15:4913 days ago1761711349IN
Aerodrome: Pool Factory
0 ETH0.000003580.00499611
Create Pool374595322025-10-29 3:26:5113 days ago1761708411IN
Aerodrome: Pool Factory
0 ETH0.000003170.00442145
Create Pool374580872025-10-29 2:38:4113 days ago1761705521IN
Aerodrome: Pool Factory
0 ETH0.000002560.00357871
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
380601392025-11-12 1:07:0556 mins ago1762909625
Aerodrome: Pool Factory
 Contract Creation0 ETH
380601082025-11-12 1:06:0357 mins ago1762909563
Aerodrome: Pool Factory
 Contract Creation0 ETH
380590282025-11-12 0:30:031 hr ago1762907403
Aerodrome: Pool Factory
 Contract Creation0 ETH
380584742025-11-12 0:11:351 hr ago1762906295
Aerodrome: Pool Factory
 Contract Creation0 ETH
380579752025-11-11 23:54:572 hrs ago1762905297
Aerodrome: Pool Factory
 Contract Creation0 ETH
380569852025-11-11 23:21:572 hrs ago1762903317
Aerodrome: Pool Factory
 Contract Creation0 ETH
380558282025-11-11 22:43:233 hrs ago1762901003
Aerodrome: Pool Factory
 Contract Creation0 ETH
380557942025-11-11 22:42:153 hrs ago1762900935
Aerodrome: Pool Factory
 Contract Creation0 ETH
380557562025-11-11 22:40:593 hrs ago1762900859
Aerodrome: Pool Factory
 Contract Creation0 ETH
380556972025-11-11 22:39:013 hrs ago1762900741
Aerodrome: Pool Factory
 Contract Creation0 ETH
380556092025-11-11 22:36:053 hrs ago1762900565
Aerodrome: Pool Factory
 Contract Creation0 ETH
380553492025-11-11 22:27:253 hrs ago1762900045
Aerodrome: Pool Factory
 Contract Creation0 ETH
380553092025-11-11 22:26:053 hrs ago1762899965
Aerodrome: Pool Factory
 Contract Creation0 ETH
380552502025-11-11 22:24:073 hrs ago1762899847
Aerodrome: Pool Factory
 Contract Creation0 ETH
380550432025-11-11 22:17:133 hrs ago1762899433
Aerodrome: Pool Factory
 Contract Creation0 ETH
380550112025-11-11 22:16:093 hrs ago1762899369
Aerodrome: Pool Factory
 Contract Creation0 ETH
380549502025-11-11 22:14:073 hrs ago1762899247
Aerodrome: Pool Factory
 Contract Creation0 ETH
380545182025-11-11 21:59:434 hrs ago1762898383
Aerodrome: Pool Factory
 Contract Creation0 ETH
380543212025-11-11 21:53:094 hrs ago1762897989
Aerodrome: Pool Factory
 Contract Creation0 ETH
380540422025-11-11 21:43:514 hrs ago1762897431
Aerodrome: Pool Factory
 Contract Creation0 ETH
380540092025-11-11 21:42:454 hrs ago1762897365
Aerodrome: Pool Factory
 Contract Creation0 ETH
380539952025-11-11 21:42:174 hrs ago1762897337
Aerodrome: Pool Factory
 Contract Creation0 ETH
380536422025-11-11 21:30:314 hrs ago1762896631
Aerodrome: Pool Factory
 Contract Creation0 ETH
380535392025-11-11 21:27:054 hrs ago1762896425
Aerodrome: Pool Factory
 Contract Creation0 ETH
380535122025-11-11 21:26:114 hrs ago1762896371
Aerodrome: Pool Factory
 Contract Creation0 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PoolFactory

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, BSL 1.1 license
/**
 *Submitted for verification at basescan.org on 2023-08-28
*/

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.19;

interface IPoolFactory {
    event SetFeeManager(address feeManager);
    event SetPauser(address pauser);
    event SetPauseState(bool state);
    event SetVoter(address voter);
    event PoolCreated(address indexed token0, address indexed token1, bool indexed stable, address pool, uint256);
    event SetCustomFee(address indexed pool, uint256 fee);

    error FeeInvalid();
    error FeeTooHigh();
    error InvalidPool();
    error NotFeeManager();
    error NotPauser();
    error NotVoter();
    error PoolAlreadyExists();
    error SameAddress();
    error ZeroFee();
    error ZeroAddress();

    /// @notice returns the number of pools created from this factory
    function allPoolsLength() external view returns (uint256);

    /// @notice Is a valid pool created by this factory.
    /// @param .
    function isPool(address pool) external view returns (bool);

    /// @notice Return address of pool created by this factory
    /// @param tokenA .
    /// @param tokenB .
    /// @param stable True if stable, false if volatile
    function getPool(address tokenA, address tokenB, bool stable) external view returns (address);

    /// @notice Support for v3-style pools which wraps around getPool(tokenA,tokenB,stable)
    /// @dev fee is converted to stable boolean.
    /// @param tokenA .
    /// @param tokenB .
    /// @param fee  1 if stable, 0 if volatile, else returns address(0)
    function getPool(address tokenA, address tokenB, uint24 fee) external view returns (address);

    /// @dev Only called once to set to Voter.sol - Voter does not have a function
    ///      to call this contract method, so once set it's immutable.
    ///      This also follows convention of setVoterAndDistributor() in VotingEscrow.sol
    /// @param _voter .
    function setVoter(address _voter) external;

    function setPauser(address _pauser) external;

    function setPauseState(bool _state) external;

    function setFeeManager(address _feeManager) external;

    /// @notice Set default fee for stable and volatile pools.
    /// @dev Throws if higher than maximum fee.
    ///      Throws if fee is zero.
    /// @param _stable Stable or volatile pool.
    /// @param _fee .
    function setFee(bool _stable, uint256 _fee) external;

    /// @notice Set overriding fee for a pool from the default
    /// @dev A custom fee of zero means the default fee will be used.
    function setCustomFee(address _pool, uint256 _fee) external;

    /// @notice Returns fee for a pool, as custom fees are possible.
    function getFee(address _pool, bool _stable) external view returns (uint256);

    /// @notice Create a pool given two tokens and if they're stable/volatile
    /// @dev token order does not matter
    /// @param tokenA .
    /// @param tokenB .
    /// @param stable .
    function createPool(address tokenA, address tokenB, bool stable) external returns (address pool);

    /// @notice Support for v3-style pools which wraps around createPool(tokena,tokenB,stable)
    /// @dev fee is converted to stable boolean
    /// @dev token order does not matter
    /// @param tokenA .
    /// @param tokenB .
    /// @param fee 1 if stable, 0 if volatile, else revert
    function createPool(address tokenA, address tokenB, uint24 fee) external returns (address pool);

    function isPaused() external view returns (bool);

    function voter() external view returns (address);

    function implementation() external view returns (address);
}

interface IPool {
    error DepositsNotEqual();
    error BelowMinimumK();
    error FactoryAlreadySet();
    error InsufficientLiquidity();
    error InsufficientLiquidityMinted();
    error InsufficientLiquidityBurned();
    error InsufficientOutputAmount();
    error InsufficientInputAmount();
    error IsPaused();
    error InvalidTo();
    error K();
    error NotEmergencyCouncil();

    event Fees(address indexed sender, uint256 amount0, uint256 amount1);
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(address indexed sender, address indexed to, uint256 amount0, uint256 amount1);
    event Swap(
        address indexed sender,
        address indexed to,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out
    );
    event Sync(uint256 reserve0, uint256 reserve1);
    event Claim(address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1);

    // Struct to capture time period obervations every 30 minutes, used for local oracles
    struct Observation {
        uint256 timestamp;
        uint256 reserve0Cumulative;
        uint256 reserve1Cumulative;
    }

    /// @notice Returns the decimal (dec), reserves (r), stable (st), and tokens (t) of token0 and token1
    function metadata()
        external
        view
        returns (uint256 dec0, uint256 dec1, uint256 r0, uint256 r1, bool st, address t0, address t1);

    /// @notice Claim accumulated but unclaimed fees (claimable0 and claimable1)
    function claimFees() external returns (uint256, uint256);

    /// @notice Returns [token0, token1]
    function tokens() external view returns (address, address);

    /// @notice Address of token in the pool with the lower address value
    function token0() external view returns (address);

    /// @notice Address of token in the poool with the higher address value
    function token1() external view returns (address);

    /// @notice Address of linked PoolFees.sol
    function poolFees() external view returns (address);

    /// @notice Address of PoolFactory that created this contract
    function factory() external view returns (address);

    /// @notice Capture oracle reading every 30 minutes (1800 seconds)
    function periodSize() external view returns (uint256);

    /// @notice Amount of token0 in pool
    function reserve0() external view returns (uint256);

    /// @notice Amount of token1 in pool
    function reserve1() external view returns (uint256);

    /// @notice Timestamp of last update to pool
    function blockTimestampLast() external view returns (uint256);

    /// @notice Cumulative of reserve0 factoring in time elapsed
    function reserve0CumulativeLast() external view returns (uint256);

    /// @notice Cumulative of reserve1 factoring in time elapsed
    function reserve1CumulativeLast() external view returns (uint256);

    /// @notice Accumulated fees of token0 (global)
    function index0() external view returns (uint256);

    /// @notice Accumulated fees of token1 (global)
    function index1() external view returns (uint256);

    /// @notice Get an LP's relative index0 to index0
    function supplyIndex0(address) external view returns (uint256);

    /// @notice Get an LP's relative index1 to index1
    function supplyIndex1(address) external view returns (uint256);

    /// @notice Amount of unclaimed, but claimable tokens from fees of token0 for an LP
    function claimable0(address) external view returns (uint256);

    /// @notice Amount of unclaimed, but claimable tokens from fees of token1 for an LP
    function claimable1(address) external view returns (uint256);

    /// @notice Returns the value of K in the Pool, based on its reserves.
    function getK() external returns (uint256);

    /// @notice Set pool name
    ///         Only callable by Voter.emergencyCouncil()
    /// @param __name String of new name
    function setName(string calldata __name) external;

    /// @notice Set pool symbol
    ///         Only callable by Voter.emergencyCouncil()
    /// @param __symbol String of new symbol
    function setSymbol(string calldata __symbol) external;

    /// @notice Get the number of observations recorded
    function observationLength() external view returns (uint256);

    /// @notice Get the value of the most recent observation
    function lastObservation() external view returns (Observation memory);

    /// @notice True if pool is stable, false if volatile
    function stable() external view returns (bool);

    /// @notice Produces the cumulative price using counterfactuals to save gas and avoid a call to sync.
    function currentCumulativePrices()
        external
        view
        returns (uint256 reserve0Cumulative, uint256 reserve1Cumulative, uint256 blockTimestamp);

    /// @notice Provides twap price with user configured granularity, up to the full window size
    /// @param tokenIn .
    /// @param amountIn .
    /// @param granularity .
    /// @return amountOut .
    function quote(address tokenIn, uint256 amountIn, uint256 granularity) external view returns (uint256 amountOut);

    /// @notice Returns a memory set of TWAP prices
    ///         Same as calling sample(tokenIn, amountIn, points, 1)
    /// @param tokenIn .
    /// @param amountIn .
    /// @param points Number of points to return
    /// @return Array of TWAP prices
    function prices(address tokenIn, uint256 amountIn, uint256 points) external view returns (uint256[] memory);

    /// @notice Same as prices with with an additional window argument.
    ///         Window = 2 means 2 * 30min (or 1 hr) between observations
    /// @param tokenIn .
    /// @param amountIn .
    /// @param points .
    /// @param window .
    /// @return Array of TWAP prices
    function sample(
        address tokenIn,
        uint256 amountIn,
        uint256 points,
        uint256 window
    ) external view returns (uint256[] memory);

    /// @notice This low-level function should be called from a contract which performs important safety checks
    /// @param amount0Out   Amount of token0 to send to `to`
    /// @param amount1Out   Amount of token1 to send to `to`
    /// @param to           Address to recieve the swapped output
    /// @param data         Additional calldata for flashloans
    function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;

    /// @notice This low-level function should be called from a contract which performs important safety checks
    ///         standard uniswap v2 implementation
    /// @param to Address to receive token0 and token1 from burning the pool token
    /// @return amount0 Amount of token0 returned
    /// @return amount1 Amount of token1 returned
    function burn(address to) external returns (uint256 amount0, uint256 amount1);

    /// @notice This low-level function should be called by addLiquidity functions in Router.sol, which performs important safety checks
    ///         standard uniswap v2 implementation
    /// @param to           Address to receive the minted LP token
    /// @return liquidity   Amount of LP token minted
    function mint(address to) external returns (uint256 liquidity);

    /// @notice Update reserves and, on the first call per block, price accumulators
    /// @return _reserve0 .
    /// @return _reserve1 .
    /// @return _blockTimestampLast .
    function getReserves() external view returns (uint256 _reserve0, uint256 _reserve1, uint256 _blockTimestampLast);

    /// @notice Get the amount of tokenOut given the amount of tokenIn
    /// @param amountIn Amount of token in
    /// @param tokenIn  Address of token
    /// @return Amount out
    function getAmountOut(uint256 amountIn, address tokenIn) external view returns (uint256);

    /// @notice Force balances to match reserves
    /// @param to Address to receive any skimmed rewards
    function skim(address to) external;

    /// @notice Force reserves to match balances
    function sync() external;

    /// @notice Called on pool creation by PoolFactory
    /// @param _token0 Address of token0
    /// @param _token1 Address of token1
    /// @param _stable True if stable, false if volatile
    function initialize(address _token0, address _token1, bool _stable) external;
}

// OpenZeppelin Contracts (last updated v4.8.0) (proxy/Clones.sol)

/**
 * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
 * deploying minimal proxy contracts, also known as "clones".
 *
 * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
 * > a minimal bytecode implementation that delegates all calls to a known, fixed address.
 *
 * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
 * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
 * deterministic method.
 *
 * _Available since v3.4._
 */
library Clones {
    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone(address implementation) internal returns (address instance) {
        /// @solidity memory-safe-assembly
        assembly {
            // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
            // of the `implementation` address with the bytecode before the address.
            mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
            // Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
            mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
            instance := create(0, 0x09, 0x37)
        }
        require(instance != address(0), "ERC1167: create failed");
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
        /// @solidity memory-safe-assembly
        assembly {
            // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
            // of the `implementation` address with the bytecode before the address.
            mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
            // Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
            mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
            instance := create2(0, 0x09, 0x37, salt)
        }
        require(instance != address(0), "ERC1167: create2 failed");
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        /// @solidity memory-safe-assembly
        assembly {
            let ptr := mload(0x40)
            mstore(add(ptr, 0x38), deployer)
            mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff)
            mstore(add(ptr, 0x14), implementation)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73)
            mstore(add(ptr, 0x58), salt)
            mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37))
            predicted := keccak256(add(ptr, 0x43), 0x55)
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt
    ) internal view returns (address predicted) {
        return predictDeterministicAddress(implementation, salt, address(this));
    }
}

contract PoolFactory is IPoolFactory {
    address public immutable implementation;

    bool public isPaused;
    address public pauser;

    uint256 public stableFee;
    uint256 public volatileFee;
    uint256 public constant MAX_FEE = 300; // 3%
    // Override to indicate there is custom 0% fee - as a 0 value in the customFee mapping indicates
    // that no custom fee rate has been set
    uint256 public constant ZERO_FEE_INDICATOR = 420;
    address public feeManager;

    /// @dev used to change the name/symbol of the pool by calling emergencyCouncil
    address public voter;

    mapping(address => mapping(address => mapping(bool => address))) private _getPool;
    address[] public allPools;
    mapping(address => bool) private _isPool; // simplified check if its a pool, given that `stable` flag might not be available in peripherals
    mapping(address => uint256) public customFee; // override for custom fees

    address internal _temp0;
    address internal _temp1;
    bool internal _temp;

    constructor(address _implementation) {
        implementation = _implementation;
        voter = msg.sender;
        pauser = msg.sender;
        feeManager = msg.sender;
        isPaused = false;
        stableFee = 5; // 0.05%
        volatileFee = 30; // 0.3%
    }

    /// @inheritdoc IPoolFactory
    function allPoolsLength() external view returns (uint256) {
        return allPools.length;
    }

    /// @inheritdoc IPoolFactory
    function getPool(address tokenA, address tokenB, uint24 fee) external view returns (address) {
        return fee > 1 ? address(0) : fee == 1 ? _getPool[tokenA][tokenB][true] : _getPool[tokenA][tokenB][false];
    }

    /// @inheritdoc IPoolFactory
    function getPool(address tokenA, address tokenB, bool stable) external view returns (address) {
        return _getPool[tokenA][tokenB][stable];
    }

    /// @inheritdoc IPoolFactory
    function isPool(address pool) external view returns (bool) {
        return _isPool[pool];
    }

    /// @inheritdoc IPoolFactory
    function setVoter(address _voter) external {
        if (msg.sender != voter) revert NotVoter();
        voter = _voter;
        emit SetVoter(_voter);
    }

    function setPauser(address _pauser) external {
        if (msg.sender != pauser) revert NotPauser();
        if (_pauser == address(0)) revert ZeroAddress();
        pauser = _pauser;
        emit SetPauser(_pauser);
    }

    function setPauseState(bool _state) external {
        if (msg.sender != pauser) revert NotPauser();
        isPaused = _state;
        emit SetPauseState(_state);
    }

    function setFeeManager(address _feeManager) external {
        if (msg.sender != feeManager) revert NotFeeManager();
        if (_feeManager == address(0)) revert ZeroAddress();
        feeManager = _feeManager;
        emit SetFeeManager(_feeManager);
    }

    /// @inheritdoc IPoolFactory
    function setFee(bool _stable, uint256 _fee) external {
        if (msg.sender != feeManager) revert NotFeeManager();
        if (_fee > MAX_FEE) revert FeeTooHigh();
        if (_fee == 0) revert ZeroFee();
        if (_stable) {
            stableFee = _fee;
        } else {
            volatileFee = _fee;
        }
    }

    /// @inheritdoc IPoolFactory
    function setCustomFee(address pool, uint256 fee) external {
        if (msg.sender != feeManager) revert NotFeeManager();
        if (fee > MAX_FEE && fee != ZERO_FEE_INDICATOR) revert FeeTooHigh();
        if (!_isPool[pool]) revert InvalidPool();

        customFee[pool] = fee;
        emit SetCustomFee(pool, fee);
    }

    /// @inheritdoc IPoolFactory
    function getFee(address pool, bool _stable) public view returns (uint256) {
        uint256 fee = customFee[pool];
        return fee == ZERO_FEE_INDICATOR ? 0 : fee != 0 ? fee : _stable ? stableFee : volatileFee;
    }

    /// @inheritdoc IPoolFactory
    function createPool(address tokenA, address tokenB, uint24 fee) external returns (address pool) {
        if (fee > 1) revert FeeInvalid();
        bool stable = fee == 1;
        return createPool(tokenA, tokenB, stable);
    }

    /// @inheritdoc IPoolFactory
    function createPool(address tokenA, address tokenB, bool stable) public returns (address pool) {
        if (tokenA == tokenB) revert SameAddress();
        (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        if (token0 == address(0)) revert ZeroAddress();
        if (_getPool[token0][token1][stable] != address(0)) revert PoolAlreadyExists();
        bytes32 salt = keccak256(abi.encodePacked(token0, token1, stable)); // salt includes stable as well, 3 parameters
        pool = Clones.cloneDeterministic(implementation, salt);
        IPool(pool).initialize(token0, token1, stable);
        _getPool[token0][token1][stable] = pool;
        _getPool[token1][token0][stable] = pool; // populate mapping in the reverse direction
        allPools.push(pool);
        _isPool[pool] = true;
        emit PoolCreated(token0, token1, stable, pool, allPools.length);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FeeInvalid","type":"error"},{"inputs":[],"name":"FeeTooHigh","type":"error"},{"inputs":[],"name":"InvalidPool","type":"error"},{"inputs":[],"name":"NotFeeManager","type":"error"},{"inputs":[],"name":"NotPauser","type":"error"},{"inputs":[],"name":"NotVoter","type":"error"},{"inputs":[],"name":"PoolAlreadyExists","type":"error"},{"inputs":[],"name":"SameAddress","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroFee","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":true,"internalType":"bool","name":"stable","type":"bool"},{"indexed":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"PoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SetCustomFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeManager","type":"address"}],"name":"SetFeeManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"SetPauseState","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pauser","type":"address"}],"name":"SetPauser","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"voter","type":"address"}],"name":"SetVoter","type":"event"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO_FEE_INDICATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPoolsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"createPool","outputs":[{"internalType":"address","name":"pool","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"createPool","outputs":[{"internalType":"address","name":"pool","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"customFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bool","name":"_stable","type":"bool"}],"name":"getFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"}],"name":"getPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"isPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setCustomFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_stable","type":"bool"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeManager","type":"address"}],"name":"setFeeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPauseState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pauser","type":"address"}],"name":"setPauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_voter","type":"address"}],"name":"setVoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stableFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"volatileFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a060405234801561001057600080fd5b50604051610e9a380380610e9a83398101604081905261002f9161008c565b6001600160a01b031660805260048054336001600160a01b03199182168117909255600080546003805490931684179092556001600160a81b031990911661010090920260ff19169190911790556005600155601e6002556100bc565b60006020828403121561009e57600080fd5b81516001600160a01b03811681146100b557600080fd5b9392505050565b608051610dbc6100de6000396000818161028b01526106090152610dbc6000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80635c60da1b116100c3578063cc56b2c51161007c578063cc56b2c514610332578063cdb88ad114610345578063d0fb020314610358578063d49466a81461036b578063e1f76b441461037e578063efde4e641461039157600080fd5b80635c60da1b1461028657806379bc57d5146102ad5780639fd0506d146102f1578063a167129514610309578063b187bd261461031c578063bc063e1a1461032957600080fd5b806346c96aac1161011557806346c96aac146101e8578063472d35b9146101fb5780634bc2a6571461020e5780634d419abc146102215780635084ed03146102415780635b16ebb71461024a57600080fd5b80631698ee821461015d5780632d88af4a1461018d57806336bf95a0146101a257806338c55d46146101b557806340bbd775146101cc57806341d1de97146101d5575b600080fd5b61017061016b366004610c15565b610399565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a061019b366004610c64565b61042b565b005b6101706101b0366004610c96565b6104df565b6101be6101a481565b604051908152602001610184565b6101be60015481565b6101706101e3366004610cd9565b61079e565b600454610170906001600160a01b031681565b6101a0610209366004610c64565b6107c8565b6101a061021c366004610c64565b610868565b6101be61022f366004610c64565b60086020526000908152604090205481565b6101be60025481565b610276610258366004610c64565b6001600160a01b031660009081526007602052604090205460ff1690565b6040519015158152602001610184565b6101707f000000000000000000000000000000000000000000000000000000000000000081565b6101706102bb366004610c96565b6001600160a01b039283166000908152600560209081526040808320948616835293815283822092151582529190915220541690565b6000546101709061010090046001600160a01b031681565b610170610317366004610c15565b6108e1565b6000546102769060ff1681565b6101be61012c81565b6101be610340366004610cf2565b610927565b6101a0610353366004610d25565b610979565b600354610170906001600160a01b031681565b6101a0610379366004610d40565b6109ea565b6101a061038c366004610d6a565b610ad7565b6006546101be565b600060018262ffffff1611610420578162ffffff166001146103ea576001600160a01b0380851660009081526005602090815260408083208785168452825280832083805290915290205416610423565b6001600160a01b038085166000908152600560209081526040808320878516845282528083206001845290915290205416610423565b60005b949350505050565b60005461010090046001600160a01b0316331461045b5760405163492f678160e01b815260040160405180910390fd5b6001600160a01b0381166104825760405163d92e233d60e01b815260040160405180910390fd5b60008054610100600160a81b0319166101006001600160a01b038416908102919091179091556040519081527fe02efb9e8f0fc21546730ab32d594f62d586e1bbb15bb5045edd0b1878a77b35906020015b60405180910390a150565b6000826001600160a01b0316846001600160a01b0316036105135760405163367558c360e01b815260040160405180910390fd5b600080846001600160a01b0316866001600160a01b031610610536578486610539565b85855b90925090506001600160a01b0382166105655760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03828116600090815260056020908152604080832085851684528252808320881515845290915290205416156105b557604051630188c99160e11b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015284151560f81b604882015260009060490160405160208183030381529060405280519060200120905061062e7f000000000000000000000000000000000000000000000000000000000000000082610b58565b604051631c9776b560e31b81526001600160a01b038581166004830152848116602483015287151560448301529195509085169063e4bbb5a890606401600060405180830381600087803b15801561068557600080fd5b505af1158015610699573d6000803e3d6000fd5b505050506001600160a01b0383811660008181526005602081815260408084208887168086529083528185208c15158087529084528286208054988d166001600160a01b0319998a16811790915582875294845282862087875284528286208187528452828620805489168617905560068054600181810183557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f9091018054909a1687179099558587526007855295839020805460ff191690981790975593548151938452918301919091529192917f2128d88d14c80cb081c1252a5acff7a264671bf199ce226b53788fb26065005e910160405180910390a45050509392505050565b600681815481106107ae57600080fd5b6000918252602090912001546001600160a01b0316905081565b6003546001600160a01b031633146107f35760405163f5d267eb60e01b815260040160405180910390fd5b6001600160a01b03811661081a5760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f5d0517e3a4eabea892d9750138cd21d4a6cf3b935b43d0598df7055f463819b2906020016104d4565b6004546001600160a01b031633146108935760405163c18384c160e01b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527fc6ff127433b785c51da9ae4088ee184c909b1a55b9afd82ae6c64224d3bc15d2906020016104d4565b600060018262ffffff16111561090a576040516352dadcf960e01b815260040160405180910390fd5b600162ffffff83161461091e8585836104df565b95945050505050565b6001600160a01b0382166000908152600860205260408120546101a4811461096c5780600003610966578261095e5760025461096f565b60015461096f565b8061096f565b60005b9150505b92915050565b60005461010090046001600160a01b031633146109a95760405163492f678160e01b815260040160405180910390fd5b6000805460ff19168215159081179091556040519081527f0d76538efc408318a051137c2720a9e82902acdbd46b802d488b74ca3a09a116906020016104d4565b6003546001600160a01b03163314610a155760405163f5d267eb60e01b815260040160405180910390fd5b61012c81118015610a2857506101a48114155b15610a465760405163cd4e616760e01b815260040160405180910390fd5b6001600160a01b03821660009081526007602052604090205460ff16610a7e5760405162820f3560e61b815260040160405180910390fd5b6001600160a01b03821660008181526008602052604090819020839055517fae468ce586f9a87660fdffc1448cee942042c16ae2f02046b134b5224f31936b90610acb9084815260200190565b60405180910390a25050565b6003546001600160a01b03163314610b025760405163f5d267eb60e01b815260040160405180910390fd5b61012c811115610b255760405163cd4e616760e01b815260040160405180910390fd5b80600003610b465760405163af13986d60e01b815260040160405180910390fd5b8115610b525760015550565b60025550565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166109735760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c6564000000000000000000604482015260640160405180910390fd5b80356001600160a01b0381168114610c1057600080fd5b919050565b600080600060608486031215610c2a57600080fd5b610c3384610bf9565b9250610c4160208501610bf9565b9150604084013562ffffff81168114610c5957600080fd5b809150509250925092565b600060208284031215610c7657600080fd5b610c7f82610bf9565b9392505050565b80358015158114610c1057600080fd5b600080600060608486031215610cab57600080fd5b610cb484610bf9565b9250610cc260208501610bf9565b9150610cd060408501610c86565b90509250925092565b600060208284031215610ceb57600080fd5b5035919050565b60008060408385031215610d0557600080fd5b610d0e83610bf9565b9150610d1c60208401610c86565b90509250929050565b600060208284031215610d3757600080fd5b610c7f82610c86565b60008060408385031215610d5357600080fd5b610d5c83610bf9565b946020939093013593505050565b60008060408385031215610d7d57600080fd5b610d5c83610c8656fea26469706673582212205695ea637811b33134d53c6be15ff2bdac0f660e3ea084930f6d55aeed48342064736f6c63430008130033000000000000000000000000a4e46b4f701c62e14df11b48dce76a7d793cd6d7

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101585760003560e01c80635c60da1b116100c3578063cc56b2c51161007c578063cc56b2c514610332578063cdb88ad114610345578063d0fb020314610358578063d49466a81461036b578063e1f76b441461037e578063efde4e641461039157600080fd5b80635c60da1b1461028657806379bc57d5146102ad5780639fd0506d146102f1578063a167129514610309578063b187bd261461031c578063bc063e1a1461032957600080fd5b806346c96aac1161011557806346c96aac146101e8578063472d35b9146101fb5780634bc2a6571461020e5780634d419abc146102215780635084ed03146102415780635b16ebb71461024a57600080fd5b80631698ee821461015d5780632d88af4a1461018d57806336bf95a0146101a257806338c55d46146101b557806340bbd775146101cc57806341d1de97146101d5575b600080fd5b61017061016b366004610c15565b610399565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a061019b366004610c64565b61042b565b005b6101706101b0366004610c96565b6104df565b6101be6101a481565b604051908152602001610184565b6101be60015481565b6101706101e3366004610cd9565b61079e565b600454610170906001600160a01b031681565b6101a0610209366004610c64565b6107c8565b6101a061021c366004610c64565b610868565b6101be61022f366004610c64565b60086020526000908152604090205481565b6101be60025481565b610276610258366004610c64565b6001600160a01b031660009081526007602052604090205460ff1690565b6040519015158152602001610184565b6101707f000000000000000000000000a4e46b4f701c62e14df11b48dce76a7d793cd6d781565b6101706102bb366004610c96565b6001600160a01b039283166000908152600560209081526040808320948616835293815283822092151582529190915220541690565b6000546101709061010090046001600160a01b031681565b610170610317366004610c15565b6108e1565b6000546102769060ff1681565b6101be61012c81565b6101be610340366004610cf2565b610927565b6101a0610353366004610d25565b610979565b600354610170906001600160a01b031681565b6101a0610379366004610d40565b6109ea565b6101a061038c366004610d6a565b610ad7565b6006546101be565b600060018262ffffff1611610420578162ffffff166001146103ea576001600160a01b0380851660009081526005602090815260408083208785168452825280832083805290915290205416610423565b6001600160a01b038085166000908152600560209081526040808320878516845282528083206001845290915290205416610423565b60005b949350505050565b60005461010090046001600160a01b0316331461045b5760405163492f678160e01b815260040160405180910390fd5b6001600160a01b0381166104825760405163d92e233d60e01b815260040160405180910390fd5b60008054610100600160a81b0319166101006001600160a01b038416908102919091179091556040519081527fe02efb9e8f0fc21546730ab32d594f62d586e1bbb15bb5045edd0b1878a77b35906020015b60405180910390a150565b6000826001600160a01b0316846001600160a01b0316036105135760405163367558c360e01b815260040160405180910390fd5b600080846001600160a01b0316866001600160a01b031610610536578486610539565b85855b90925090506001600160a01b0382166105655760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03828116600090815260056020908152604080832085851684528252808320881515845290915290205416156105b557604051630188c99160e11b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015284151560f81b604882015260009060490160405160208183030381529060405280519060200120905061062e7f000000000000000000000000a4e46b4f701c62e14df11b48dce76a7d793cd6d782610b58565b604051631c9776b560e31b81526001600160a01b038581166004830152848116602483015287151560448301529195509085169063e4bbb5a890606401600060405180830381600087803b15801561068557600080fd5b505af1158015610699573d6000803e3d6000fd5b505050506001600160a01b0383811660008181526005602081815260408084208887168086529083528185208c15158087529084528286208054988d166001600160a01b0319998a16811790915582875294845282862087875284528286208187528452828620805489168617905560068054600181810183557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f9091018054909a1687179099558587526007855295839020805460ff191690981790975593548151938452918301919091529192917f2128d88d14c80cb081c1252a5acff7a264671bf199ce226b53788fb26065005e910160405180910390a45050509392505050565b600681815481106107ae57600080fd5b6000918252602090912001546001600160a01b0316905081565b6003546001600160a01b031633146107f35760405163f5d267eb60e01b815260040160405180910390fd5b6001600160a01b03811661081a5760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f5d0517e3a4eabea892d9750138cd21d4a6cf3b935b43d0598df7055f463819b2906020016104d4565b6004546001600160a01b031633146108935760405163c18384c160e01b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527fc6ff127433b785c51da9ae4088ee184c909b1a55b9afd82ae6c64224d3bc15d2906020016104d4565b600060018262ffffff16111561090a576040516352dadcf960e01b815260040160405180910390fd5b600162ffffff83161461091e8585836104df565b95945050505050565b6001600160a01b0382166000908152600860205260408120546101a4811461096c5780600003610966578261095e5760025461096f565b60015461096f565b8061096f565b60005b9150505b92915050565b60005461010090046001600160a01b031633146109a95760405163492f678160e01b815260040160405180910390fd5b6000805460ff19168215159081179091556040519081527f0d76538efc408318a051137c2720a9e82902acdbd46b802d488b74ca3a09a116906020016104d4565b6003546001600160a01b03163314610a155760405163f5d267eb60e01b815260040160405180910390fd5b61012c81118015610a2857506101a48114155b15610a465760405163cd4e616760e01b815260040160405180910390fd5b6001600160a01b03821660009081526007602052604090205460ff16610a7e5760405162820f3560e61b815260040160405180910390fd5b6001600160a01b03821660008181526008602052604090819020839055517fae468ce586f9a87660fdffc1448cee942042c16ae2f02046b134b5224f31936b90610acb9084815260200190565b60405180910390a25050565b6003546001600160a01b03163314610b025760405163f5d267eb60e01b815260040160405180910390fd5b61012c811115610b255760405163cd4e616760e01b815260040160405180910390fd5b80600003610b465760405163af13986d60e01b815260040160405180910390fd5b8115610b525760015550565b60025550565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166109735760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c6564000000000000000000604482015260640160405180910390fd5b80356001600160a01b0381168114610c1057600080fd5b919050565b600080600060608486031215610c2a57600080fd5b610c3384610bf9565b9250610c4160208501610bf9565b9150604084013562ffffff81168114610c5957600080fd5b809150509250925092565b600060208284031215610c7657600080fd5b610c7f82610bf9565b9392505050565b80358015158114610c1057600080fd5b600080600060608486031215610cab57600080fd5b610cb484610bf9565b9250610cc260208501610bf9565b9150610cd060408501610c86565b90509250925092565b600060208284031215610ceb57600080fd5b5035919050565b60008060408385031215610d0557600080fd5b610d0e83610bf9565b9150610d1c60208401610c86565b90509250929050565b600060208284031215610d3757600080fd5b610c7f82610c86565b60008060408385031215610d5357600080fd5b610d5c83610bf9565b946020939093013593505050565b60008060408385031215610d7d57600080fd5b610d5c83610c8656fea26469706673582212205695ea637811b33134d53c6be15ff2bdac0f660e3ea084930f6d55aeed48342064736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000a4e46b4f701c62e14df11b48dce76a7d793cd6d7

-----Decoded View---------------
Arg [0] : _implementation (address): 0xA4e46b4f701c62e14DF11B48dCe76A7d793CD6d7

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a4e46b4f701c62e14df11b48dce76a7d793cd6d7


Deployed Bytecode Sourcemap

16228:5204:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17734:217;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;783:32:1;;;765:51;;753:2;738:18;17734:217:0;;;;;;;;18496:227;;;;;;:::i;:::-;;:::i;:::-;;20503:926;;;;;;:::i;:::-;;:::i;16638:48::-;;16683:3;16638:48;;;;;1662:25:1;;;1650:2;1635:18;16638:48:0;1516:177:1;16377:24:0;;;;;;16929:25;;;;;;:::i;:::-;;:::i;16812:20::-;;;;;-1:-1:-1;;;;;16812:20:0;;;18912:263;;;;;;:::i;:::-;;:::i;18327:161::-;;;;;;:::i;:::-;;:::i;17106:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;16408:26;;;;;;18187:98;;;;;;:::i;:::-;-1:-1:-1;;;;;18264:13:0;18240:4;18264:13;;;:7;:13;;;;;;;;;18187:98;;;;2048:14:1;;2041:22;2023:41;;2011:2;1996:18;18187:98:0;1883:187:1;16272:39:0;;;;;17993:152;;;;;;:::i;:::-;-1:-1:-1;;;;;18105:16:0;;;18078:7;18105:16;;;:8;:16;;;;;;;;:24;;;;;;;;;;;:32;;;;;;;;;;;;;17993:152;16347:21;;;;;;;;-1:-1:-1;;;;;16347:21:0;;;20229:232;;;;;;:::i;:::-;;:::i;16320:20::-;;;;;;;;;16441:37;;16475:3;16441:37;;19965:222;;;;;;:::i;:::-;;:::i;18731:173::-;;;;;;:::i;:::-;;:::i;16693:25::-;;;;;-1:-1:-1;;;;;16693:25:0;;;19592:331;;;;;;:::i;:::-;;:::i;19217:333::-;;;;;;:::i;:::-;;:::i;17593:99::-;17669:8;:15;17593:99;;17734:217;17818:7;17851:1;17845:3;:7;;;:98;;17868:3;:8;;17875:1;17868:8;:75;;-1:-1:-1;;;;;17912:16:0;;;;;;;:8;:16;;;;;;;;:24;;;;;;;;;;:31;;;;;;;;;;17845:98;;17868:75;-1:-1:-1;;;;;17879:16:0;;;;;;;:8;:16;;;;;;;;:24;;;;;;;;;;17904:4;17879:30;;;;;;;;;17845:98;;;17863:1;17845:98;17838:105;17734:217;-1:-1:-1;;;;17734:217:0:o;18496:227::-;18570:6;;;;;-1:-1:-1;;;;;18570:6:0;18556:10;:20;18552:44;;18585:11;;-1:-1:-1;;;18585:11:0;;;;;;;;;;;18552:44;-1:-1:-1;;;;;18611:21:0;;18607:47;;18641:13;;-1:-1:-1;;;18641:13:0;;;;;;;;;;;18607:47;18665:6;:16;;-1:-1:-1;;;;;;18665:16:0;;-1:-1:-1;;;;;18665:16:0;;;;;;;;;;;;18697:18;;765:51:1;;;18697:18:0;;753:2:1;738:18;18697::0;;;;;;;;18496:227;:::o;20503:926::-;20584:12;20623:6;-1:-1:-1;;;;;20613:16:0;:6;-1:-1:-1;;;;;20613:16:0;;20609:42;;20638:13;;-1:-1:-1;;;20638:13:0;;;;;;;;;;;20609:42;20663:14;20679;20706:6;-1:-1:-1;;;;;20697:15:0;:6;-1:-1:-1;;;;;20697:15:0;;:53;;20735:6;20743;20697:53;;;20716:6;20724;20697:53;20662:88;;-1:-1:-1;20662:88:0;-1:-1:-1;;;;;;20765:20:0;;20761:46;;20794:13;;-1:-1:-1;;;20794:13:0;;;;;;;;;;;20761:46;-1:-1:-1;;;;;20822:16:0;;;20866:1;20822:16;;;:8;:16;;;;;;;;:24;;;;;;;;;;:32;;;;;;;;;;;;:46;20818:78;;20877:19;;-1:-1:-1;;;20877:19:0;;;;;;;;;;;20818:78;20932:40;;-1:-1:-1;;3280:2:1;3276:15;;;3272:24;;20932:40:0;;;3260:37:1;3331:15;;;3327:24;3313:12;;;3306:46;3398:14;;3391:22;3386:3;3382:32;3368:12;;;3361:54;20907:12:0;;3431::1;;20932:40:0;;;;;;;;;;;;20922:51;;;;;;20907:66;;21037:47;21063:14;21079:4;21037:25;:47::i;:::-;21095:46;;-1:-1:-1;;;21095:46:0;;-1:-1:-1;;;;;3706:15:1;;;21095:46:0;;;3688:34:1;3758:15;;;3738:18;;;3731:43;3817:14;;3810:22;3790:18;;;3783:50;21030:54:0;;-1:-1:-1;21095:22:0;;;;;;3623:18:1;;21095:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;21152:16:0;;;;;;;:8;:16;;;;;;;;:24;;;;;;;;;;;;:32;;;;;;;;;;;;:39;;;;;-1:-1:-1;;;;;;21152:39:0;;;;;;;;21202:16;;;;;;;;;:24;;;;;;;;:32;;;;;;;;:39;;;;;;;;21297:8;:19;;-1:-1:-1;21297:19:0;;;;;;;;;;;;;;;;;;;21327:13;;;:7;:13;;;;;;:20;;-1:-1:-1;;21327:20:0;;;;;;;21405:15;;21363:58;;4018:51:1;;;4085:18;;;4078:34;;;;21152:24:0;;:16;21363:58;;3991:18:1;21363:58:0;;;;;;;20598:831;;;20503:926;;;;;:::o;16929:25::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16929:25:0;;-1:-1:-1;16929:25:0;:::o;18912:263::-;18994:10;;-1:-1:-1;;;;;18994:10:0;18980;:24;18976:52;;19013:15;;-1:-1:-1;;;19013:15:0;;;;;;;;;;;18976:52;-1:-1:-1;;;;;19043:25:0;;19039:51;;19077:13;;-1:-1:-1;;;19077:13:0;;;;;;;;;;;19039:51;19101:10;:24;;-1:-1:-1;;;;;;19101:24:0;-1:-1:-1;;;;;19101:24:0;;;;;;;;19141:26;;765:51:1;;;19141:26:0;;753:2:1;738:18;19141:26:0;619:203:1;18327:161:0;18399:5;;-1:-1:-1;;;;;18399:5:0;18385:10;:19;18381:42;;18413:10;;-1:-1:-1;;;18413:10:0;;;;;;;;;;;18381:42;18434:5;:14;;-1:-1:-1;;;;;;18434:14:0;-1:-1:-1;;;;;18434:14:0;;;;;;;;18464:16;;765:51:1;;;18464:16:0;;753:2:1;738:18;18464:16:0;619:203:1;20229:232:0;20311:12;20346:1;20340:3;:7;;;20336:32;;;20356:12;;-1:-1:-1;;;20356:12:0;;;;;;;;;;;20336:32;20400:1;20393:8;;;;20419:34;20430:6;20438;20393:8;20419:10;:34::i;:::-;20412:41;20229:232;-1:-1:-1;;;;;20229:232:0:o;19965:222::-;-1:-1:-1;;;;;20064:15:0;;20030:7;20064:15;;;:9;:15;;;;;;16683:3;20097:25;;:82;;20129:3;20136:1;20129:8;:50;;20146:7;:33;;20168:11;;20097:82;;20146:33;20156:9;;20097:82;;20129:50;20140:3;20097:82;;;20125:1;20097:82;20090:89;;;19965:222;;;;;:::o;18731:173::-;18805:6;;;;;-1:-1:-1;;;;;18805:6:0;18791:10;:20;18787:44;;18820:11;;-1:-1:-1;;;18820:11:0;;;;;;;;;;;18787:44;18842:8;:17;;-1:-1:-1;;18842:17:0;;;;;;;;;;18875:21;;2023:41:1;;;18875:21:0;;2011:2:1;1996:18;18875:21:0;1883:187:1;19592:331:0;19679:10;;-1:-1:-1;;;;;19679:10:0;19665;:24;19661:52;;19698:15;;-1:-1:-1;;;19698:15:0;;;;;;;;;;;19661:52;16475:3;19728;:13;:42;;;;;16683:3;19745;:25;;19728:42;19724:67;;;19779:12;;-1:-1:-1;;;19779:12:0;;;;;;;;;;;19724:67;-1:-1:-1;;;;;19807:13:0;;;;;;:7;:13;;;;;;;;19802:40;;19829:13;;-1:-1:-1;;;19829:13:0;;;;;;;;;;;19802:40;-1:-1:-1;;;;;19855:15:0;;;;;;:9;:15;;;;;;;:21;;;19892:23;;;;;19873:3;1662:25:1;;1650:2;1635:18;;1516:177;19892:23:0;;;;;;;;19592:331;;:::o;19217:333::-;19299:10;;-1:-1:-1;;;;;19299:10:0;19285;:24;19281:52;;19318:15;;-1:-1:-1;;;19318:15:0;;;;;;;;;;;19281:52;16475:3;19348:4;:14;19344:39;;;19371:12;;-1:-1:-1;;;19371:12:0;;;;;;;;;;;19344:39;19398:4;19406:1;19398:9;19394:31;;19416:9;;-1:-1:-1;;;19416:9:0;;;;;;;;;;;19394:31;19440:7;19436:107;;;19464:9;:16;-1:-1:-1;19217:333:0:o;19436:107::-;19513:11;:18;-1:-1:-1;19217:333:0:o;14258:805::-;14342:16;14679:48;14661:14;14655:4;14651:25;14645:4;14641:36;14638:90;14632:4;14625:104;14888:32;14871:14;14865:4;14861:25;14858:63;14852:4;14845:77;14971:4;14965;14959;14956:1;14948:28;14936:40;-1:-1:-1;;;;;;15005:22:0;;14997:58;;;;-1:-1:-1;;;14997:58:0;;4325:2:1;14997:58:0;;;4307:21:1;4364:2;4344:18;;;4337:30;4403:25;4383:18;;;4376:53;4446:18;;14997:58:0;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:422::-;268:6;276;284;337:2;325:9;316:7;312:23;308:32;305:52;;;353:1;350;343:12;305:52;376:29;395:9;376:29;:::i;:::-;366:39;;424:38;458:2;447:9;443:18;424:38;:::i;:::-;414:48;;512:2;501:9;497:18;484:32;556:8;549:5;545:20;538:5;535:31;525:59;;580:1;577;570:12;525:59;603:5;593:15;;;192:422;;;;;:::o;827:186::-;886:6;939:2;927:9;918:7;914:23;910:32;907:52;;;955:1;952;945:12;907:52;978:29;997:9;978:29;:::i;:::-;968:39;827:186;-1:-1:-1;;;827:186:1:o;1018:160::-;1083:20;;1139:13;;1132:21;1122:32;;1112:60;;1168:1;1165;1158:12;1183:328;1257:6;1265;1273;1326:2;1314:9;1305:7;1301:23;1297:32;1294:52;;;1342:1;1339;1332:12;1294:52;1365:29;1384:9;1365:29;:::i;:::-;1355:39;;1413:38;1447:2;1436:9;1432:18;1413:38;:::i;:::-;1403:48;;1470:35;1501:2;1490:9;1486:18;1470:35;:::i;:::-;1460:45;;1183:328;;;;;:::o;1698:180::-;1757:6;1810:2;1798:9;1789:7;1785:23;1781:32;1778:52;;;1826:1;1823;1816:12;1778:52;-1:-1:-1;1849:23:1;;1698:180;-1:-1:-1;1698:180:1:o;2075:254::-;2140:6;2148;2201:2;2189:9;2180:7;2176:23;2172:32;2169:52;;;2217:1;2214;2207:12;2169:52;2240:29;2259:9;2240:29;:::i;:::-;2230:39;;2288:35;2319:2;2308:9;2304:18;2288:35;:::i;:::-;2278:45;;2075:254;;;;;:::o;2334:180::-;2390:6;2443:2;2431:9;2422:7;2418:23;2414:32;2411:52;;;2459:1;2456;2449:12;2411:52;2482:26;2498:9;2482:26;:::i;2519:254::-;2587:6;2595;2648:2;2636:9;2627:7;2623:23;2619:32;2616:52;;;2664:1;2661;2654:12;2616:52;2687:29;2706:9;2687:29;:::i;:::-;2677:39;2763:2;2748:18;;;;2735:32;;-1:-1:-1;;;2519:254:1:o;2778:248::-;2843:6;2851;2904:2;2892:9;2883:7;2879:23;2875:32;2872:52;;;2920:1;2917;2910:12;2872:52;2943:26;2959:9;2943:26;:::i

Swarm Source

ipfs://5695ea637811b33134d53c6be15ff2bdac0f660e3ea084930f6d55aeed483420

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.