The Modulus Blockchain Explorer

Contract Address Details

0x0E47c8606a2Ce2149e2Ba6Ab3BC73aF3A0B79C69

Overview

CULT BALANCE

0 CULT

USD VALUE

More Info

CONTRACT CREATOR

TOKEN TRACKER

Multi Chain

MULTICHAIN ADDRESSES

Contract name:

StoneSwapFactory

Optimization enabled

true

Compiler version

v0.8.9+commit.e5eed63a

Optimization runs

200

EVM Version

default

Verified at

2023-07-31T19:32:42.890291Z

Constructor Arguments
0x000000000000000000000000115a8405b51f3d98b6f470bc6edcf10e76d92c93

Arg [0] (address) : 0x115a8405b51f3d98b6f470bc6edcf10e76d92c93

                
contracts/StoneSwapFactory.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.8.9;

import "./interfaces/IStoneSwapFactory.sol";
import "./StoneSwapPair.sol";

contract StoneSwapFactory is IStoneSwapFactory {
    bytes32 public constant PAIR_HASH =
        keccak256(type(StoneSwapPair).creationCode);

    address public override feeTo;
    address public override cultFeeTo;
    address public override feeToSetter;

    mapping(address => mapping(address => address)) public override getPair;
    address[] public override allPairs;

    constructor(address _feeToSetter) {
        feeToSetter = _feeToSetter;
    }

    function allPairsLength() external view override returns (uint256) {
        return allPairs.length;
    }

    function createPair(
        address tokenA,
        address tokenB
    ) external override returns (address pair) {
        require(tokenA != tokenB, "StoneSwap: IDENTICAL_ADDRESSES");
        (address token0, address token1) = tokenA < tokenB
            ? (tokenA, tokenB)
            : (tokenB, tokenA);
        require(token0 != address(0), "StoneSwap: ZERO_ADDRESS");
        require(
            getPair[token0][token1] == address(0),
            "StoneSwap: PAIR_EXISTS"
        ); // single check is sufficient

        pair = address(
            new StoneSwapPair{
                salt: keccak256(abi.encodePacked(token0, token1))
            }()
        );
        IStoneSwapPair(pair).initialize(token0, token1);
        getPair[token0][token1] = pair;
        getPair[token1][token0] = pair; // populate mapping in the reverse direction
        allPairs.push(pair);
        emit PairCreated(token0, token1, pair, allPairs.length);
    }

    function setFeeTo(address _feeTo) external override {
        require(msg.sender == feeToSetter, "StoneSwap: FORBIDDEN");
        feeTo = _feeTo;
    }

    function setCultFeeTo(address _cultFeeTo) external override {
        require(msg.sender == feeToSetter, "StoneSwap: FORBIDDEN");
        cultFeeTo = _cultFeeTo;
    }

    function setFeeSetter(address _feeToSetter) external override {
        require(msg.sender == feeToSetter, "StoneSwap: FORBIDDEN");
        feeToSetter = _feeToSetter;
    }
}
          
contracts/StoneSwapERC20.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.8.9;

import "./interfaces/IStoneSwapERC20.sol";

//solhint-disable var-name-mixedcase
//solhint-disable reason-string
//solhint-disable const-name-snakecase

contract StoneSwapERC20 is IStoneSwapERC20 {
    string public constant override name = "StoneSwap-V1";
    string public constant override symbol = "STONE-V1";
    uint8 public constant override decimals = 18;
    uint256 public override totalSupply;
    mapping(address => uint256) public override balanceOf;
    mapping(address => mapping(address => uint256)) public override allowance;

    bytes32 public override DOMAIN_SEPARATOR;
    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant override PERMIT_TYPEHASH =
        0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
    mapping(address => uint256) public override nonces;

    constructor() {
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256(
                    "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
                ),
                keccak256(bytes(name)),
                keccak256(bytes("1")),
                block.chainid,
                address(this)
            )
        );
    }

    function _mint(address to, uint256 value) internal {
        totalSupply += value;
        balanceOf[to] += value;
        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint256 value) internal {
        balanceOf[from] -= value;
        totalSupply -= value;
        emit Transfer(from, address(0), value);
    }

    function _approve(address owner, address spender, uint256 value) private {
        allowance[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _transfer(address from, address to, uint256 value) private {
        balanceOf[from] -= value;
        balanceOf[to] += value;
        emit Transfer(from, to, value);
    }

    function approve(
        address spender,
        uint256 value
    ) external override returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transfer(
        address to,
        uint256 value
    ) external override returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external override returns (bool) {
        if (allowance[from][msg.sender] != type(uint256).max) {
            allowance[from][msg.sender] -= value;
        }
        _transfer(from, to, value);
        return true;
    }

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external override {
        //solhint-disable-next-line not-rely-on-time
        require(deadline >= block.timestamp, "StoneSwap: EXPIRED");
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                DOMAIN_SEPARATOR,
                keccak256(
                    abi.encode(
                        PERMIT_TYPEHASH,
                        owner,
                        spender,
                        value,
                        nonces[owner]++,
                        deadline
                    )
                )
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(
            recoveredAddress != address(0) && recoveredAddress == owner,
            "StoneSwap: INVALID_SIGNATURE"
        );
        _approve(owner, spender, value);
    }
}
            
contracts/StoneSwapPair.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.8.9;

import "./interfaces/IStoneSwapPair.sol";
import "./StoneSwapERC20.sol";
import "./libraries/Math.sol";
import "./libraries/UQ112x112.sol";
import "./interfaces/IERC20.sol";
import "./interfaces/IStoneSwapFactory.sol";
import "./interfaces/IStoneSwapCallee.sol";

//solhint-disable func-name-mixedcase
//solhint-disable avoid-low-level-calls
//solhint-disable reason-string
//solhint-disable not-rely-on-time

contract StoneSwapPair is IStoneSwapPair, StoneSwapERC20 {
    using UQ112x112 for uint224;

    uint256 public constant override MINIMUM_LIQUIDITY = 10 ** 3;

    address public override factory;
    address public override token0;
    address public override token1;

    uint112 private reserve0; // uses single storage slot, accessible via getReserves
    uint112 private reserve1; // uses single storage slot, accessible via getReserves
    uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves

    uint256 public override price0CumulativeLast;
    uint256 public override price1CumulativeLast;
    uint256 public override kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event

    uint256 private unlocked = 1;
    modifier lock() {
        require(unlocked == 1, "StoneSwap: LOCKED");
        unlocked = 0;
        _;
        unlocked = 1;
    }

    function getReserves()
        public
        view
        override
        returns (
            uint112 _reserve0,
            uint112 _reserve1,
            uint32 _blockTimestampLast
        )
    {
        _reserve0 = reserve0;
        _reserve1 = reserve1;
        _blockTimestampLast = blockTimestampLast;
    }

    function _safeTransfer(address token, address to, uint256 value) private {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(IERC20.transfer.selector, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "StoneSwap: TRANSFER_FAILED"
        );
    }

    constructor() {
        factory = msg.sender;
    }

    // called once by the factory at time of deployment
    function initialize(address _token0, address _token1) external override {
        require(msg.sender == factory, "StoneSwap: FORBIDDEN"); // sufficient check
        token0 = _token0;
        token1 = _token1;
    }

    // update reserves and, on the first call per block, price accumulators
    function _update(
        uint256 balance0,
        uint256 balance1,
        uint112 _reserve0,
        uint112 _reserve1
    ) private {
        require(
            balance0 <= type(uint112).max && balance1 <= type(uint112).max,
            "StoneSwap: OVERFLOW"
        );
        uint32 blockTimestamp = uint32(block.timestamp % 2 ** 32);
        unchecked {
            uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired
            if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {
                // * never overflows, and + overflow is desired
                price0CumulativeLast +=
                    uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) *
                    timeElapsed;
                price1CumulativeLast +=
                    uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) *
                    timeElapsed;
            }
        }
        reserve0 = uint112(balance0);
        reserve1 = uint112(balance1);
        blockTimestampLast = blockTimestamp;
        emit Sync(reserve0, reserve1);
    }

    // mint liquidity equivalent to 1/3th of the growth in sqrt(k)
    function _mintCultFee(
        uint112 _reserve0,
        uint112 _reserve1
    ) private returns (bool cultFeeOn) {
        address cultFeeTo = IStoneSwapFactory(factory).cultFeeTo();
        cultFeeOn =
            cultFeeTo != address(0) &&
            cultFeeTo != token0 &&
            cultFeeTo != token1;
        uint256 _kLast = kLast; // gas savings
        if (cultFeeOn) {
            if (_kLast != 0) {
                uint256 rootK = Math.sqrt(uint256(_reserve0) * _reserve1);
                uint256 rootKLast = Math.sqrt(_kLast);
                if (rootK > rootKLast) {
                    uint256 numerator = totalSupply * (rootK - rootKLast);
                    uint256 denominator = rootK * 5 + rootKLast;
                    uint256 liquidity = numerator / denominator;
                    if (liquidity * 2 > 0) _mint(cultFeeTo, liquidity * 2);
                }
            }
        } else if (_kLast != 0) {
            kLast = 0;
        }
    }

    // if fee is on, mint liquidity equivalent to 1/6th of the growth in sqrt(k)
    function _mintFee(
        uint112 _reserve0,
        uint112 _reserve1
    ) private returns (bool feeOn) {
        address feeTo = IStoneSwapFactory(factory).feeTo();
        feeOn = feeTo != address(0);
        uint256 _kLast = kLast; // gas savings
        if (feeOn) {
            if (_kLast != 0) {
                uint256 rootK = Math.sqrt(uint256(_reserve0) * _reserve1);
                uint256 rootKLast = Math.sqrt(_kLast);
                if (rootK > rootKLast) {
                    uint256 numerator = totalSupply * (rootK - rootKLast);
                    uint256 denominator = rootK * 5 + rootKLast;
                    uint256 liquidity = numerator / denominator;
                    if (liquidity > 0) _mint(feeTo, liquidity);
                }
            }
        } else if (_kLast != 0) {
            kLast = 0;
        }
    }

    // this low-level function should be called from a contract which performs important safety checks
    function mint(
        address to
    ) external override lock returns (uint256 liquidity) {
        (uint112 _reserve0, uint112 _reserve1, ) = getReserves(); // gas savings
        uint256 balance0 = IERC20(token0).balanceOf(address(this));
        uint256 balance1 = IERC20(token1).balanceOf(address(this));
        uint256 amount0 = balance0 - _reserve0;
        uint256 amount1 = balance1 - _reserve1;

        bool cultFeeOn = _mintCultFee(_reserve0, _reserve1);
        bool feeOn = _mintFee(_reserve0, _reserve1);
        uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        if (_totalSupply == 0) {
            liquidity = Math.sqrt(amount0 * amount1) - MINIMUM_LIQUIDITY;
            _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
        } else {
            liquidity = Math.min(
                (amount0 * _totalSupply) / _reserve0,
                (amount1 * _totalSupply) / _reserve1
            );
        }
        require(liquidity > 0, "StoneSwap: INSUFFICIENT_LIQUIDITY_MINTED");
        _mint(to, liquidity);

        _update(balance0, balance1, _reserve0, _reserve1);
        if (feeOn || cultFeeOn) kLast = uint256(reserve0) * reserve1; // reserve0 and reserve1 are up-to-date
        emit Mint(msg.sender, amount0, amount1);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function burn(
        address to
    ) external override lock returns (uint256 amount0, uint256 amount1) {
        (uint112 _reserve0, uint112 _reserve1, ) = getReserves(); // gas savings
        address _token0 = token0; // gas savings
        address _token1 = token1; // gas savings
        uint256 balance0 = IERC20(_token0).balanceOf(address(this));
        uint256 balance1 = IERC20(_token1).balanceOf(address(this));
        uint256 liquidity = balanceOf[address(this)];

        bool cultFeeOn = _mintCultFee(_reserve0, _reserve1);
        bool feeOn = _mintFee(_reserve0, _reserve1);
        uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        amount0 = (liquidity * balance0) / _totalSupply; // using balances ensures pro-rata distribution
        amount1 = (liquidity * balance1) / _totalSupply; // using balances ensures pro-rata distribution
        require(
            amount0 > 0 && amount1 > 0,
            "StoneSwap: INSUFFICIENT_LIQUIDITY_BURNED"
        );
        _burn(address(this), liquidity);
        _safeTransfer(_token0, to, amount0);
        _safeTransfer(_token1, to, amount1);
        balance0 = IERC20(_token0).balanceOf(address(this));
        balance1 = IERC20(_token1).balanceOf(address(this));

        _update(balance0, balance1, _reserve0, _reserve1);
        if (feeOn || cultFeeOn) kLast = uint256(reserve0) * reserve1; // reserve0 and reserve1 are up-to-date
        emit Burn(msg.sender, amount0, amount1, to);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external override lock {
        require(
            amount0Out > 0 || amount1Out > 0,
            "StoneSwap: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        (uint112 _reserve0, uint112 _reserve1, ) = getReserves(); // gas savings
        require(
            amount0Out < _reserve0 && amount1Out < _reserve1,
            "StoneSwap: INSUFFICIENT_LIQUIDITY"
        );

        uint256 balance0;
        uint256 balance1;
        {
            // scope for _token{0,1}, avoids stack too deep errors
            address _token0 = token0;
            address _token1 = token1;
            require(to != _token0 && to != _token1, "StoneSwap: INVALID_TO");
            if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
            if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
            if (data.length > 0)
                IStoneSwapCallee(to).uniswapV2Call(
                    msg.sender,
                    amount0Out,
                    amount1Out,
                    data
                );
            balance0 = IERC20(_token0).balanceOf(address(this));
            balance1 = IERC20(_token1).balanceOf(address(this));
        }
        uint256 amount0In = balance0 > _reserve0 - amount0Out
            ? balance0 - (_reserve0 - amount0Out)
            : 0;
        uint256 amount1In = balance1 > _reserve1 - amount1Out
            ? balance1 - (_reserve1 - amount1Out)
            : 0;
        require(
            amount0In > 0 || amount1In > 0,
            "StoneSwap: INSUFFICIENT_INPUT_AMOUNT"
        );
        {
            // scope for reserve{0,1}Adjusted, avoids stack too deep errors
            uint256 balance0Adjusted = balance0 * 1000 - amount0In * 4;
            uint256 balance1Adjusted = balance1 * 1000 - amount1In * 4;
            require(
                balance0Adjusted * balance1Adjusted >=
                    uint256(_reserve0) * _reserve1 * 1e6,
                "StoneSwap: K"
            );
        }

        _update(balance0, balance1, _reserve0, _reserve1);
        emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);
    }

    // force balances to match reserves
    function skim(address to) external override lock {
        address _token0 = token0; // gas savings
        address _token1 = token1; // gas savings
        _safeTransfer(
            _token0,
            to,
            IERC20(_token0).balanceOf(address(this)) - reserve0
        );
        _safeTransfer(
            _token1,
            to,
            IERC20(_token1).balanceOf(address(this)) - reserve1
        );
    }

    // force reserves to match balances
    function sync() external override lock {
        _update(
            IERC20(token0).balanceOf(address(this)),
            IERC20(token1).balanceOf(address(this)),
            reserve0,
            reserve1
        );
    }
}
            
contracts/interfaces/IERC20.sol
// SPDX-License-Identifier: GPL-3.0-or-later

//solhint-disable-next-line compiler-version
pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);
}
            
contracts/interfaces/IStoneSwapCallee.sol
// SPDX-License-Identifier: GPL-3.0-or-later

//solhint-disable-next-line compiler-version
pragma solidity >=0.5.0;

interface IStoneSwapCallee {
    function uniswapV2Call(
        address sender,
        uint256 amount0,
        uint256 amount1,
        bytes calldata data
    ) external;
}
            
contracts/interfaces/IStoneSwapERC20.sol
// SPDX-License-Identifier: GPL-3.0-or-later

//solhint-disable-next-line compiler-version
pragma solidity >=0.5.0;

//solhint-disable func-name-mixedcase
interface IStoneSwapERC20 {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}
            
contracts/interfaces/IStoneSwapFactory.sol
// SPDX-License-Identifier: GPL-3.0-or-later

//solhint-disable-next-line compiler-version
pragma solidity >=0.5.0;

interface IStoneSwapFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function cultFeeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);

    function setFeeTo(address) external;

    function setCultFeeTo(address) external;

    function setFeeSetter(address) external;
}
            
contracts/interfaces/IStoneSwapPair.sol
// SPDX-License-Identifier: GPL-3.0-or-later

//solhint-disable-next-line compiler-version
pragma solidity >=0.5.0;

//solhint-disable func-name-mixedcase

import "./IStoneSwapERC20.sol";

interface IStoneSwapPair is IStoneSwapERC20 {
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(
        address to
    ) external returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}
            
contracts/libraries/Math.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.8.9;

// a library for performing various math operations

library Math {
    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}
            
contracts/libraries/UQ112x112.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.8.9;

// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))

// range: [0, 2**112 - 1]
// resolution: 1 / 2**112

library UQ112x112 {
    //solhint-disable-next-line state-visibility
    uint224 constant Q112 = 2 ** 112;

    // encode a uint112 as a UQ112x112
    function encode(uint112 y) internal pure returns (uint224 z) {
        z = uint224(y) * Q112; // never overflows
    }

    // divide a UQ112x112 by a uint112, returning a UQ112x112
    function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
        z = x / uint224(y);
    }
}
            
Contract ABI
[{"type":"constructor","inputs":[{"type":"address","name":"_feeToSetter","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"PAIR_HASH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"allPairs","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allPairsLength","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"address","name":"pair","internalType":"address"}],"name":"createPair","inputs":[{"type":"address","name":"tokenA","internalType":"address"},{"type":"address","name":"tokenB","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"cultFeeTo","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"feeTo","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"feeToSetter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getPair","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCultFeeTo","inputs":[{"type":"address","name":"_cultFeeTo","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeSetter","inputs":[{"type":"address","name":"_feeToSetter","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeTo","inputs":[{"type":"address","name":"_feeTo","internalType":"address"}]},{"type":"event","name":"PairCreated","inputs":[{"type":"address","name":"token0","indexed":true},{"type":"address","name":"token1","indexed":true},{"type":"address","name":"pair","indexed":false},{"type":"uint256","name":"","indexed":false}],"anonymous":false}]
              
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100a95760003560e01c806364f91c721161007157806364f91c72146101295780637bf8df4c14610131578063b19805af14610146578063c9c6539614610159578063e6a439051461016c578063f46901ed146101a057600080fd5b8063017e7e58146100ae578063094b7415146100de5780630cd96770146100f15780631e3dd18b14610104578063574f2ba314610117575b600080fd5b6000546100c1906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6002546100c1906001600160a01b031681565b6001546100c1906001600160a01b031681565b6100c16101123660046105f8565b6101b3565b6004545b6040519081526020016100d5565b61011b6101dd565b61014461013f36600461062d565b61020a565b005b61014461015436600461062d565b61025f565b6100c161016736600461064f565b6102ab565b6100c161017a36600461064f565b60036020908152600092835260408084209091529082529020546001600160a01b031681565b6101446101ae36600461062d565b61059f565b600481815481106101c357600080fd5b6000918252602090912001546001600160a01b0316905081565b6040516101ec602082016105eb565b6020820181038252601f19601f820116604052508051906020012081565b6002546001600160a01b0316331461023d5760405162461bcd60e51b815260040161023490610682565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146102895760405162461bcd60e51b815260040161023490610682565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000816001600160a01b0316836001600160a01b0316141561030f5760405162461bcd60e51b815260206004820152601e60248201527f53746f6e65537761703a204944454e544943414c5f41444452455353455300006044820152606401610234565b600080836001600160a01b0316856001600160a01b031610610332578385610335565b84845b90925090506001600160a01b0382166103905760405162461bcd60e51b815260206004820152601760248201527f53746f6e65537761703a205a45524f5f414444524553530000000000000000006044820152606401610234565b6001600160a01b038281166000908152600360209081526040808320858516845290915290205416156103fe5760405162461bcd60e51b815260206004820152601660248201527553746f6e65537761703a20504149525f45584953545360501b6044820152606401610234565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015260480160405160208183030381529060405280519060200120604051610449906105eb565b8190604051809103906000f5905080158015610469573d6000803e3d6000fd5b5060405163485cc95560e01b81526001600160a01b03848116600483015283811660248301529194509084169063485cc95590604401600060405180830381600087803b1580156104b957600080fd5b505af11580156104cd573d6000803e3d6000fd5b505050506001600160a01b0382811660008181526003602081815260408084208787168086529083528185208054978b166001600160a01b031998891681179091559383528185208686528352818520805488168517905560048054600181018255958190527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9095018054909716841790965592548351928352908201527f0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9910160405180910390a3505092915050565b6002546001600160a01b031633146105c95760405162461bcd60e51b815260040161023490610682565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b612406806106b183390190565b60006020828403121561060a57600080fd5b5035919050565b80356001600160a01b038116811461062857600080fd5b919050565b60006020828403121561063f57600080fd5b61064882610611565b9392505050565b6000806040838503121561066257600080fd5b61066b83610611565b915061067960208401610611565b90509250929050565b60208082526014908201527329ba37b732a9bbb0b81d102327a92124a22222a760611b60408201526060019056fe60806040526001600c5534801561001557600080fd5b50604080518082018252600c81526b53746f6e65537761702d563160a01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527fd37bbe150c13a7d470602e404e57dffd3d42908a171968473de3599ea1e92553918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f198184030181529190528051602090910120600355600580546001600160a01b031916331790556122f6806101106000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80636a627842116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a71461040c578063d505accf1461041f578063dd62ed3e14610432578063fff6cae91461045d57600080fd5b8063ba9a7a56146103dd578063bc25cf77146103e6578063c45a0155146103f957600080fd5b80637ecebe00116100d35780637ecebe001461035b57806389afcb441461037b57806395d89b41146103a3578063a9059cbb146103ca57600080fd5b80636a6278421461031f57806370a08231146103325780637464fc3d1461035257600080fd5b806323b872dd116101665780633644e515116101405780633644e515146102f1578063485cc955146102fa5780635909c0d51461030d5780635a3d54931461031657600080fd5b806323b872dd1461029d57806330adf81f146102b0578063313ce567146102d757600080fd5b8063022c0d9f146101ae57806306fdde03146101c35780630902f1ac14610204578063095ea7b3146102385780630dfe16811461025b57806318160ddd14610286575b600080fd5b6101c16101bc366004611e90565b610465565b005b6101ee6040518060400160405280600c81526020016b53746f6e65537761702d563160a01b81525081565b6040516101fb9190611f56565b60405180910390f35b61020c61099d565b604080516001600160701b03948516815293909216602084015263ffffffff16908201526060016101fb565b61024b610246366004611f89565b6109c7565b60405190151581526020016101fb565b60065461026e906001600160a01b031681565b6040516001600160a01b0390911681526020016101fb565b61028f60005481565b6040519081526020016101fb565b61024b6102ab366004611fb5565b6109dd565b61028f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6102df601281565b60405160ff90911681526020016101fb565b61028f60035481565b6101c1610308366004611ff6565b610a57565b61028f60095481565b61028f600a5481565b61028f61032d36600461202f565b610ad6565b61028f61034036600461202f565b60016020526000908152604090205481565b61028f600b5481565b61028f61036936600461202f565b60046020526000908152604090205481565b61038e61038936600461202f565b610dd6565b604080519283526020830191909152016101fb565b6101ee6040518060400160405280600881526020016753544f4e452d563160c01b81525081565b61024b6103d8366004611f89565b61118e565b61028f6103e881565b6101c16103f436600461202f565b61119b565b60055461026e906001600160a01b031681565b60075461026e906001600160a01b031681565b6101c161042d36600461204c565b6112bd565b61028f610440366004611ff6565b600260209081526000928352604080842090915290825290205481565b6101c16114d1565b600c546001146104905760405162461bcd60e51b8152600401610487906120c3565b60405180910390fd5b6000600c55841515806104a35750600084115b6104fd5760405162461bcd60e51b815260206004820152602560248201527f53746f6e65537761703a20494e53554646494349454e545f4f55545055545f416044820152641353d5539560da1b6064820152608401610487565b60008061050861099d565b5091509150816001600160701b03168710801561052d5750806001600160701b031686105b6105835760405162461bcd60e51b815260206004820152602160248201527f53746f6e65537761703a20494e53554646494349454e545f4c495155494449546044820152605960f81b6064820152608401610487565b60065460075460009182916001600160a01b039182169190811690891682148015906105c15750806001600160a01b0316896001600160a01b031614155b6106055760405162461bcd60e51b815260206004820152601560248201527453746f6e65537761703a20494e56414c49445f544f60581b6044820152606401610487565b8a1561061657610616828a8d611613565b891561062757610627818a8c611613565b8615610694576040516304347a1760e21b81526001600160a01b038a16906310d1e85c906106619033908f908f908e908e906004016120ee565b600060405180830381600087803b15801561067b57600080fd5b505af115801561068f573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b1580156106d357600080fd5b505afa1580156106e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070b919061213a565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a082319060240160206040518083038186803b15801561074d57600080fd5b505afa158015610761573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610785919061213a565b92505050600089856001600160701b03166107a09190612169565b83116107ad5760006107ca565b6107c08a6001600160701b038716612169565b6107ca9084612169565b905060006107e18a6001600160701b038716612169565b83116107ee57600061080b565b6108018a6001600160701b038716612169565b61080b9084612169565b9050600082118061081c5750600081115b6108745760405162461bcd60e51b8152602060048201526024808201527f53746f6e65537761703a20494e53554646494349454e545f494e5055545f414d60448201526313d5539560e21b6064820152608401610487565b6000610881836004612180565b61088d866103e8612180565b6108979190612169565b905060006108a6836004612180565b6108b2866103e8612180565b6108bc9190612169565b90506108d46001600160701b03808916908a16612180565b6108e190620f4240612180565b6108eb8284612180565b10156109285760405162461bcd60e51b815260206004820152600c60248201526b53746f6e65537761703a204b60a01b6044820152606401610487565b50506109368484888861172e565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001600c55505050505050505050565b6008546001600160701b0380821692600160701b830490911691600160e01b900463ffffffff1690565b60006109d43384846118e6565b50600192915050565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610a42576001600160a01b038416600090815260026020908152604080832033845290915281208054849290610a3c908490612169565b90915550505b610a4d848484611948565b5060019392505050565b6005546001600160a01b03163314610aa85760405162461bcd60e51b815260206004820152601460248201527329ba37b732a9bbb0b81d102327a92124a22222a760611b6044820152606401610487565b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b6000600c54600114610afa5760405162461bcd60e51b8152600401610487906120c3565b6000600c81905580610b0a61099d565b506006546040516370a0823160e01b81523060048201529294509092506000916001600160a01b03909116906370a082319060240160206040518083038186803b158015610b5757600080fd5b505afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f919061213a565b6007546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b158015610bd857600080fd5b505afa158015610bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c10919061213a565b90506000610c276001600160701b03861684612169565b90506000610c3e6001600160701b03861684612169565b90506000610c4c87876119e9565b90506000610c5a8888611b82565b60005490915080610c98576103e8610c7a610c758688612180565b611cb0565b610c849190612169565b9950610c9360006103e8611d20565b610cdf565b610cdc6001600160701b038a16610caf8388612180565b610cb991906121b5565b6001600160701b038a16610ccd8488612180565b610cd791906121b5565b611da9565b99505b60008a11610d405760405162461bcd60e51b815260206004820152602860248201527f53746f6e65537761703a20494e53554646494349454e545f4c495155494449546044820152671657d3525395115160c21b6064820152608401610487565b610d4a8b8b611d20565b610d5687878b8b61172e565b8180610d5f5750825b15610d8757600854610d83906001600160701b03600160701b820481169116612180565b600b555b604080518681526020810186905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001600c555095979650505050505050565b600080600c54600114610dfb5760405162461bcd60e51b8152600401610487906120c3565b6000600c81905580610e0b61099d565b506006546007546040516370a0823160e01b81523060048201529395509193506001600160a01b039081169291169060009083906370a082319060240160206040518083038186803b158015610e6057600080fd5b505afa158015610e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e98919061213a565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b158015610edd57600080fd5b505afa158015610ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f15919061213a565b30600090815260016020526040812054919250610f3288886119e9565b90506000610f408989611b82565b60005490915080610f518786612180565b610f5b91906121b5565b9b5080610f688686612180565b610f7291906121b5565b9a5060008c118015610f84575060008b115b610fe15760405162461bcd60e51b815260206004820152602860248201527f53746f6e65537761703a20494e53554646494349454e545f4c495155494449546044820152671657d0955493915160c21b6064820152608401610487565b610feb3085611dc1565b610ff6888e8e611613565b611001878e8d611613565b6040516370a0823160e01b81523060048201526001600160a01b038916906370a082319060240160206040518083038186803b15801561104057600080fd5b505afa158015611054573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611078919061213a565b6040516370a0823160e01b81523060048201529096506001600160a01b038816906370a082319060240160206040518083038186803b1580156110ba57600080fd5b505afa1580156110ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f2919061213a565b945061110086868c8c61172e565b81806111095750825b156111315760085461112d906001600160701b03600160701b820481169116612180565b600b555b604080518d8152602081018d90526001600160a01b038f169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a3505050505050505050506001600c81905550915091565b60006109d4338484611948565b600c546001146111bd5760405162461bcd60e51b8152600401610487906120c3565b6000600c556006546007546008546040516370a0823160e01b81523060048201526001600160a01b03938416939092169161126b91849186916001600160701b03169083906370a08231906024015b60206040518083038186803b15801561122457600080fd5b505afa158015611238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125c919061213a565b6112669190612169565b611613565b6008546040516370a0823160e01b81523060048201526112b39183918691600160701b90046001600160701b0316906001600160a01b038416906370a082319060240161120c565b50506001600c5550565b428410156113025760405162461bcd60e51b815260206004820152601260248201527114dd1bdb9954ddd85c0e881156141254915160721b6044820152606401610487565b6003546001600160a01b038816600090815260046020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611355836121c9565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e001604051602081830303815290604052805190602001206040516020016113ce92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611439573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061146f5750886001600160a01b0316816001600160a01b0316145b6114bb5760405162461bcd60e51b815260206004820152601c60248201527f53746f6e65537761703a20494e56414c49445f5349474e4154555245000000006044820152606401610487565b6114c68989896118e6565b505050505050505050565b600c546001146114f35760405162461bcd60e51b8152600401610487906120c3565b6000600c556006546040516370a0823160e01b815230600482015261160c916001600160a01b0316906370a082319060240160206040518083038186803b15801561153d57600080fd5b505afa158015611551573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611575919061213a565b6007546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156115b857600080fd5b505afa1580156115cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f0919061213a565b6008546001600160701b0380821691600160701b90041661172e565b6001600c55565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161166f91906121e4565b6000604051808303816000865af19150503d80600081146116ac576040519150601f19603f3d011682016040523d82523d6000602084013e6116b1565b606091505b50915091508180156116db5750805115806116db5750808060200190518101906116db9190612200565b6117275760405162461bcd60e51b815260206004820152601a60248201527f53746f6e65537761703a205452414e534645525f4641494c45440000000000006044820152606401610487565b5050505050565b6001600160701b03841180159061174c57506001600160701b038311155b61178e5760405162461bcd60e51b815260206004820152601360248201527253746f6e65537761703a204f564552464c4f5760681b6044820152606401610487565b600061179f64010000000042612222565b60085490915063ffffffff600160e01b90910481168203908116158015906117cf57506001600160701b03841615155b80156117e357506001600160701b03831615155b1561184e578063ffffffff1661180b856117fc86611e44565b6001600160e01b031690611e63565b600980546001600160e01b03929092169290920201905563ffffffff8116611836846117fc87611e44565b600a80546001600160e01b0392909216929092020190555b506008805463ffffffff8316600160e01b026001600160e01b036001600160701b03888116600160701b9081026001600160e01b03199095168b83161794909417918216831794859055604080519382169282169290921783529290930490911660208201527f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1910160405180910390a15050505050565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831660009081526001602052604081208054839290611970908490612169565b90915550506001600160a01b0382166000908152600160205260408120805483929061199d908490612236565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161193b91815260200190565b600080600560009054906101000a90046001600160a01b03166001600160a01b0316630cd967706040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3a57600080fd5b505afa158015611a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a72919061224e565b90506001600160a01b03811615801590611a9a57506006546001600160a01b03828116911614155b8015611ab457506007546001600160a01b03828116911614155b600b549092508215611b6e578015611b69576000611ae1610c756001600160701b03808816908916612180565b90506000611aee83611cb0565b905080821115611b66576000611b048284612169565b600054611b119190612180565b9050600082611b21856005612180565b611b2b9190612236565b90506000611b3982846121b5565b90506000611b48826002612180565b1115611b6257611b6287611b5d836002612180565b611d20565b5050505b50505b611b7a565b8015611b7a576000600b555b505092915050565b600080600560009054906101000a90046001600160a01b03166001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b158015611bd357600080fd5b505afa158015611be7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0b919061224e565b600b546001600160a01b038216158015945091925090611b6e578015611b69576000611c46610c756001600160701b03808816908916612180565b90506000611c5383611cb0565b905080821115611b66576000611c698284612169565b600054611c769190612180565b9050600082611c86856005612180565b611c909190612236565b90506000611c9e82846121b5565b90508015611b6257611b628782611d20565b60006003821115611d115750806000611cca6002836121b5565b611cd5906001612236565b90505b81811015611d0b57905080600281611cf081866121b5565b611cfa9190612236565b611d0491906121b5565b9050611cd8565b50919050565b8115611d1b575060015b919050565b80600080828254611d319190612236565b90915550506001600160a01b03821660009081526001602052604081208054839290611d5e908490612236565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000818310611db85781611dba565b825b9392505050565b6001600160a01b03821660009081526001602052604081208054839290611de9908490612169565b9250508190555080600080828254611e019190612169565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611d9d565b6000611e5d600160701b6001600160701b03841661226b565b92915050565b6000611dba6001600160701b0383168461229a565b6001600160a01b0381168114611e8d57600080fd5b50565b600080600080600060808688031215611ea857600080fd5b85359450602086013593506040860135611ec181611e78565b9250606086013567ffffffffffffffff80821115611ede57600080fd5b818801915088601f830112611ef257600080fd5b813581811115611f0157600080fd5b896020828501011115611f1357600080fd5b9699959850939650602001949392505050565b60005b83811015611f41578181015183820152602001611f29565b83811115611f50576000848401525b50505050565b6020815260008251806020840152611f75816040850160208701611f26565b601f01601f19169190910160400192915050565b60008060408385031215611f9c57600080fd5b8235611fa781611e78565b946020939093013593505050565b600080600060608486031215611fca57600080fd5b8335611fd581611e78565b92506020840135611fe581611e78565b929592945050506040919091013590565b6000806040838503121561200957600080fd5b823561201481611e78565b9150602083013561202481611e78565b809150509250929050565b60006020828403121561204157600080fd5b8135611dba81611e78565b600080600080600080600060e0888a03121561206757600080fd5b873561207281611e78565b9650602088013561208281611e78565b95506040880135945060608801359350608088013560ff811681146120a657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60208082526011908201527014dd1bdb9954ddd85c0e881313d0d2d151607a1b604082015260600190565b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b60006020828403121561214c57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561217b5761217b612153565b500390565b600081600019048311821515161561219a5761219a612153565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826121c4576121c461219f565b500490565b60006000198214156121dd576121dd612153565b5060010190565b600082516121f6818460208701611f26565b9190910192915050565b60006020828403121561221257600080fd5b81518015158114611dba57600080fd5b6000826122315761223161219f565b500690565b6000821982111561224957612249612153565b500190565b60006020828403121561226057600080fd5b8151611dba81611e78565b60006001600160e01b038281168482168115158284048211161561229157612291612153565b02949350505050565b60006001600160e01b03838116806122b4576122b461219f565b9216919091049291505056fea264697066735822122060a4303525eabd2dd72423e5804fbad3a48c7e19e9a37450a55a563c02b89fbe64736f6c63430008090033a264697066735822122054093f168e623d1ced997a758cc43994688485c62e86c23c3f97390a6ddb967e64736f6c63430008090033