false
true
0

Contract Address Details

0x4e1a5ad0716d5AeD378BceE9Daf5a08abA3F637D

Contract Name
NeonLiquidityAdder
Creator
0x4718cc–d384f6 at 0x732398–dd5bb7
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
2 Transactions
Transfers
17,004 Transfers
Gas Used
74,749
Last Balance Update
26783620
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
NeonLiquidityAdder




Optimization enabled
true
Compiler version
v0.8.31+commit.fd3a2265




Optimization runs
1
EVM Version
shanghai




Verified at
2026-04-19T17:18:47.128209Z

Constructor Arguments

000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27000000000000000000000000f2da3942616880e52e841e5c504b5a9fba23fff0000000000000000000000000f6f8db0aba00007681f8faf16a0fda1c9b030b11000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d90000000000000000000000000000000000000000000096a2d971e4861af51d4900000000000000000000000000000000000000000007904097a9ff8b14ac532b

Arg [0] (address) : 0xa1077a294dde1b09bb078844df40758a5d0f9a27
Arg [1] (address) : 0xf2da3942616880e52e841e5c504b5a9fba23fff0
Arg [2] (address) : 0xf6f8db0aba00007681f8faf16a0fda1c9b030b11
Arg [3] (address) : 0x165c3410fc91ef562c50559f7d2289febed552d9
Arg [4] (uint256) : 711359013526230957104457
Arg [5] (uint256) : 9143693031003294148612907

              

contracts/Tokens/NeonLiquidityAdder.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

interface IERC20_NLA {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
}

interface IWPLS_NLA {
    function deposit() external payable;
    function balanceOf(address account) external view returns (uint256);
}

interface IPulseXRouter {
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
    function factory() external view returns (address);
}

interface IPulseXFactory {
    function getPair(address tokenA, address tokenB) external view returns (address);
}

/**
 * @title NeonLiquidityAdder
 * @notice Receives PLS from token tax processing. Every Nth deposit auto-triggers
 *         LP addition to a single configurable pair on PulseX V2.
 *         Owner can change the pair, trigger frequency, and withdraw anything.
 */
contract NeonLiquidityAdder {
    address public owner;

    address public immutable WPLS;
    address public immutable router;

    /// @notice The two tokens of the LP pair to add liquidity to
    address public tokenA;
    address public tokenB;

    /// @notice How many PLS receives before auto-processing
    uint256 public processEveryN = 10;

    /// @notice Current receive counter
    uint256 public receiveCount;

    /// @notice Minimum WPLS balance required to process
    uint256 public minProcessAmount = 1 ether;

    /// @notice Cumulative tokenA bought via swaps (e.g. NEON)
    uint256 public totalTokenABought;

    /// @notice Cumulative PLS received
    uint256 public totalPlsReceived;

    event LiquidityAdded(address indexed pair, uint256 lpAmount);
    event AutoProcessTriggered(uint256 wplsAmount);
    event PairUpdated(address tokenA, address tokenB);
    event ProcessEveryNUpdated(uint256 newN);
    event MinProcessAmountUpdated(uint256 newMin);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }

    constructor(
        address _wpls,
        address _tokenA,
        address _tokenB,
        address _router,
        uint256 _initialTokenABought,
        uint256 _initialPlsReceived
    ) {
        require(_wpls != address(0) && _tokenA != address(0) && _tokenB != address(0) && _router != address(0), "Zero address");
        owner = msg.sender;
        WPLS = _wpls;
        router = _router;
        tokenA = _tokenA;
        tokenB = _tokenB;
        totalTokenABought = _initialTokenABought;
        totalPlsReceived = _initialPlsReceived;

        IERC20_NLA(_wpls).approve(_router, type(uint256).max);
        IERC20_NLA(_tokenA).approve(_router, type(uint256).max);
        IERC20_NLA(_tokenB).approve(_router, type(uint256).max);
    }

    // ─── Auto-trigger on receive ─────────────────────────────────────

    receive() external payable {
        totalPlsReceived += msg.value;
        receiveCount++;
        if (receiveCount >= processEveryN) {
            receiveCount = 0;
            _tryProcess();
        }
    }

    // ─── Core ────────────────────────────────────────────────────────

    /// @notice Manual trigger — anyone can call
    function processLiquidity() external {
        _wrapPLS();
        uint256 wplsBal = IWPLS_NLA(WPLS).balanceOf(address(this));
        require(wplsBal >= minProcessAmount, "Below min");
        _addLiquidity(wplsBal);
    }

    // ─── Internal ────────────────────────────────────────────────────

    function _tryProcess() internal {
        _wrapPLS();
        uint256 wplsBal = IWPLS_NLA(WPLS).balanceOf(address(this));
        if (wplsBal < minProcessAmount) return;
        emit AutoProcessTriggered(wplsBal);
        _addLiquidity(wplsBal);
    }

    function _wrapPLS() internal {
        uint256 plsBal = address(this).balance;
        if (plsBal > 0) {
            IWPLS_NLA(WPLS).deposit{value: plsBal}();
        }
    }

    /**
     * @dev Swap half WPLS → tokenA (if != WPLS), swap half WPLS → tokenB (if != WPLS),
     *      then addLiquidity(tokenA, tokenB). LP tokens stay in contract.
     */
    function _addLiquidity(uint256 wplsAmount) internal {
        uint256 half = wplsAmount / 2;
        if (half == 0) return;

        address _tokenA = tokenA;
        address _tokenB = tokenB;
        uint256 amountA;
        uint256 amountB;

        // Get tokenA
        if (_tokenA == WPLS) {
            amountA = half;
        } else {
            uint256 before = IERC20_NLA(_tokenA).balanceOf(address(this));
            address[] memory path = new address[](2);
            path[0] = WPLS;
            path[1] = _tokenA;
            try IPulseXRouter(router).swapExactTokensForTokensSupportingFeeOnTransferTokens(
                half, 0, path, address(this), block.timestamp
            ) {} catch { return; }
            amountA = IERC20_NLA(_tokenA).balanceOf(address(this)) - before;
            if (amountA == 0) return;
            totalTokenABought += amountA;
        }

        // Get tokenB
        uint256 otherHalf = wplsAmount - half;
        if (_tokenB == WPLS) {
            amountB = otherHalf;
        } else {
            uint256 before = IERC20_NLA(_tokenB).balanceOf(address(this));
            address[] memory path = new address[](2);
            path[0] = WPLS;
            path[1] = _tokenB;
            try IPulseXRouter(router).swapExactTokensForTokensSupportingFeeOnTransferTokens(
                otherHalf, 0, path, address(this), block.timestamp
            ) {} catch { return; }
            amountB = IERC20_NLA(_tokenB).balanceOf(address(this)) - before;
            if (amountB == 0) return;
        }

        try IPulseXRouter(router).addLiquidity(
            _tokenA, _tokenB, amountA, amountB, 0, 0, address(this), block.timestamp
        ) returns (uint256, uint256, uint256 liquidity) {
            address pair = IPulseXFactory(IPulseXRouter(router).factory()).getPair(_tokenA, _tokenB);
            emit LiquidityAdded(pair, liquidity);
        } catch {}
    }

    // ─── View ──────────────────────────────────────────────────────────

    /// @notice Returns cumulative stats
    function getStats() external view returns (uint256 tokenABought, uint256 plsReceived) {
        return (totalTokenABought, totalPlsReceived);
    }

    // ─── Owner Controls ──────────────────────────────────────────────

    /// @notice Change the LP pair. Approves router for new tokens.
    function setPair(address _tokenA, address _tokenB) external onlyOwner {
        require(_tokenA != address(0) && _tokenB != address(0), "Zero address");
        tokenA = _tokenA;
        tokenB = _tokenB;
        if (_tokenA != WPLS) {
            IERC20_NLA(_tokenA).approve(router, type(uint256).max);
        }
        if (_tokenB != WPLS) {
            IERC20_NLA(_tokenB).approve(router, type(uint256).max);
        }
        emit PairUpdated(_tokenA, _tokenB);
    }

    function setProcessEveryN(uint256 _n) external onlyOwner {
        require(_n > 0, "Must be > 0");
        processEveryN = _n;
        emit ProcessEveryNUpdated(_n);
    }

    function setMinProcessAmount(uint256 _min) external onlyOwner {
        minProcessAmount = _min;
        emit MinProcessAmountUpdated(_min);
    }

    function withdrawToken(address token, uint256 amount) external onlyOwner {
        require(token != address(0), "Zero address");
        IERC20_NLA(token).transfer(owner, amount);
    }

    function withdrawPLS(uint256 amount) external onlyOwner {
        (bool ok, ) = owner.call{value: amount}("");
        require(ok, "Transfer failed");
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "Zero address");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }
}
        

Compiler Settings

{"remappings":[":@1inch/solidity-utils/=lib/solidity-utils/",":@chainlink/=lib/foundry-chainlink-toolkit/",":@chainlink/contracts/=lib/foundry-chainlink-toolkit/lib/chainlink-brownie-contracts/contracts/src/",":@forge-std/=lib/forge-std/src/",":@gearbox-protocol/core-v2/=lib/core-v2/",":@gearbox-protocol/core-v3/=lib/core-v3/",":@gearbox-protocol/sdk-gov/=lib/sdk-gov/",":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",":@redstone-finance/=lib/integrations-v3/node_modules/@redstone-finance/",":@uniswap/v2-core/=lib/v2-core/",":@uniswap/v2-periphery/=lib/v2-periphery/",":chainlink-brownie-contracts/=lib/foundry-chainlink-toolkit/lib/chainlink-brownie-contracts/contracts/src/v0.6/vendor/@arbitrum/nitro-contracts/src/",":chainlink/=lib/chainlink/",":core-v2/=lib/core-v2/contracts/",":core-v3/=lib/core-v3/contracts/",":ds-test/=lib/forge-std/lib/ds-test/src/",":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",":forge-std/=lib/forge-std/src/",":foundry-chainlink-toolkit/=lib/foundry-chainlink-toolkit/",":foundry-devops/=lib/foundry-devops/",":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",":integrations-v3/=lib/integrations-v3/",":openzeppelin-contracts copy/=lib/openzeppelin-contracts copy/",":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",":openzeppelin-contracts/=lib/openzeppelin-contracts/",":sdk-gov/=lib/sdk-gov/",":solidity-lib/=lib/solidity-lib/contracts/",":solidity-utils/=lib/solidity-utils/contracts/",":v2-core/=lib/v2-core/contracts/",":v2-periphery/=lib/v2-periphery/contracts/"],"optimizer":{"runs":1,"enabled":true},"metadata":{"bytecodeHash":"none"},"libraries":{},"evmVersion":"shanghai","compilationTarget":{"contracts/Tokens/NeonLiquidityAdder.sol":"NeonLiquidityAdder"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_wpls","internalType":"address"},{"type":"address","name":"_tokenA","internalType":"address"},{"type":"address","name":"_tokenB","internalType":"address"},{"type":"address","name":"_router","internalType":"address"},{"type":"uint256","name":"_initialTokenABought","internalType":"uint256"},{"type":"uint256","name":"_initialPlsReceived","internalType":"uint256"}]},{"type":"event","name":"AutoProcessTriggered","inputs":[{"type":"uint256","name":"wplsAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LiquidityAdded","inputs":[{"type":"address","name":"pair","internalType":"address","indexed":true},{"type":"uint256","name":"lpAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MinProcessAmountUpdated","inputs":[{"type":"uint256","name":"newMin","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"PairUpdated","inputs":[{"type":"address","name":"tokenA","internalType":"address","indexed":false},{"type":"address","name":"tokenB","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"ProcessEveryNUpdated","inputs":[{"type":"uint256","name":"newN","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"WPLS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"tokenABought","internalType":"uint256"},{"type":"uint256","name":"plsReceived","internalType":"uint256"}],"name":"getStats","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minProcessAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"processEveryN","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"processLiquidity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"receiveCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinProcessAmount","inputs":[{"type":"uint256","name":"_min","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPair","inputs":[{"type":"address","name":"_tokenA","internalType":"address"},{"type":"address","name":"_tokenB","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setProcessEveryN","inputs":[{"type":"uint256","name":"_n","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"tokenA","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"tokenB","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalPlsReceived","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalTokenABought","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawPLS","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawToken","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x60c0604052600a600355670de0b6b3a7640000600555348015610020575f5ffd5b5060405161189e38038061189e83398101604081905261003f91610282565b6001600160a01b0386161580159061005f57506001600160a01b03851615155b801561007357506001600160a01b03841615155b801561008757506001600160a01b03831615155b6100c65760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b604482015260640160405180910390fd5b5f8054336001600160a01b0319918216179091556001600160a01b03878116608081905285821660a05260018054841689841617905560028054909316918716919091179091556006839055600782905560405163095ea7b360e01b815263095ea7b39061013b9086905f19906004016102e6565b6020604051808303815f875af1158015610157573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017b91906102ff565b5060405163095ea7b360e01b81526001600160a01b0386169063095ea7b3906101ab9086905f19906004016102e6565b6020604051808303815f875af11580156101c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101eb91906102ff565b5060405163095ea7b360e01b81526001600160a01b0385169063095ea7b39061021b9086905f19906004016102e6565b6020604051808303815f875af1158015610237573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061025b91906102ff565b50505050505050610325565b80516001600160a01b038116811461027d575f5ffd5b919050565b5f5f5f5f5f5f60c08789031215610297575f5ffd5b6102a087610267565b95506102ae60208801610267565b94506102bc60408801610267565b93506102ca60608801610267565b608088015160a090980151969995985093969395939492505050565b6001600160a01b03929092168252602082015260400190565b5f6020828403121561030f575f5ffd5b8151801515811461031e575f5ffd5b9392505050565b60805160a0516114ef6103af5f395f8181610345015281816107720152818161083c01528181610cae01528181610f320152818161108301526110f001525f81816102f3015281816103880152818161053301528181610729015281816107e101528181610abc01528181610b6201528181610c2401528181610dd50152610ea801526114ef5ff3fe6080604052600436106100db575f3560e01c80630f695da7146101275780630fc63d101461014f578063217ccf021461017b578063279c4ebf146101905780633923411c146101af5780634ccd4097146101c35780635f64b55b146101e25780637209d3b9146102015780637ba85592146102165780638da5cb5b1461022b57806395c5c5e31461024957806397eac8e8146102685780639e281a981461027d578063c59d48471461029c578063d5dcaeee146102c3578063ef8ef56f146102e2578063f2fde38b14610315578063f887ea4014610334575f5ffd5b36610123573460075f8282546100f19190611241565b909155505060048054905f6101058361125a565b919050555060035460045410610121575f600455610121610367565b005b5f5ffd5b348015610132575f5ffd5b5061013c60065481565b6040519081526020015b60405180910390f35b34801561015a575f5ffd5b5060015461016e906001600160a01b031681565b6040516101469190611272565b348015610186575f5ffd5b5061013c60075481565b34801561019b575f5ffd5b506101216101aa366004611286565b61044a565b3480156101ba575f5ffd5b50610121610512565b3480156101ce575f5ffd5b506101216101dd366004611286565b6105f0565b3480156101ed575f5ffd5b5060025461016e906001600160a01b031681565b34801561020c575f5ffd5b5061013c60035481565b348015610221575f5ffd5b5061013c60045481565b348015610236575f5ffd5b505f5461016e906001600160a01b031681565b348015610254575f5ffd5b506101216102633660046112b1565b610692565b348015610273575f5ffd5b5061013c60055481565b348015610288575f5ffd5b506101216102973660046112e8565b6108e6565b3480156102a7575f5ffd5b5060065460075460408051928352602083019190915201610146565b3480156102ce575f5ffd5b506101216102dd366004611286565b6109ad565b3480156102ed575f5ffd5b5061016e7f000000000000000000000000000000000000000000000000000000000000000081565b348015610320575f5ffd5b5061012161032f366004611312565b610a0b565b34801561033f575f5ffd5b5061016e7f000000000000000000000000000000000000000000000000000000000000000081565b61036f610ab3565b6040516370a0823160e01b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906103bd903090600401611272565b602060405180830381865afa1580156103d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103fc9190611334565b905060055481101561040b5750565b6040518181527fd4e1cd91d2707400c53a3fc4822006215c498a3d424b95eabedaf574d2bb64019060200160405180910390a161044781610b2d565b50565b5f546001600160a01b0316331461047c5760405162461bcd60e51b81526004016104739061134b565b60405180910390fd5b5f80546040516001600160a01b039091169083908381818185875af1925050503d805f81146104c6576040519150601f19603f3d011682016040523d82523d5f602084013e6104cb565b606091505b505090508061050e5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610473565b5050565b61051a610ab3565b6040516370a0823160e01b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610568903090600401611272565b602060405180830381865afa158015610583573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a79190611334565b90506005548110156105e75760405162461bcd60e51b81526020600482015260096024820152682132b637bb9036b4b760b91b6044820152606401610473565b61044781610b2d565b5f546001600160a01b031633146106195760405162461bcd60e51b81526004016104739061134b565b5f81116106565760405162461bcd60e51b815260206004820152600b60248201526a04d757374206265203e20360ac1b6044820152606401610473565b60038190556040518181527faece30ec52bb020d80a8b6a0a5688f46722d23cbe2e7d80e1313c42675f2bf6a906020015b60405180910390a150565b5f546001600160a01b031633146106bb5760405162461bcd60e51b81526004016104739061134b565b6001600160a01b038216158015906106db57506001600160a01b03811615155b6106f75760405162461bcd60e51b81526004016104739061136e565b600180546001600160a01b038085166001600160a01b03199283168117909355600280548583169316929092179091557f000000000000000000000000000000000000000000000000000000000000000016146107df5760405163095ea7b360e01b81526001600160a01b0383169063095ea7b39061079d907f0000000000000000000000000000000000000000000000000000000000000000905f1990600401611394565b6020604051808303815f875af11580156107b9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107dd91906113ad565b505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316146108a95760405163095ea7b360e01b81526001600160a01b0382169063095ea7b390610867907f0000000000000000000000000000000000000000000000000000000000000000905f1990600401611394565b6020604051808303815f875af1158015610883573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a791906113ad565b505b7f2daa13478b8265a01977bdca6d2719323c82f5d97ff95449c85592b27f65560482826040516108da9291906113cc565b60405180910390a15050565b5f546001600160a01b0316331461090f5760405162461bcd60e51b81526004016104739061134b565b6001600160a01b0382166109355760405162461bcd60e51b81526004016104739061136e565b5f5460405163a9059cbb60e01b81526001600160a01b038481169263a9059cbb9261096892909116908590600401611394565b6020604051808303815f875af1158015610984573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a891906113ad565b505050565b5f546001600160a01b031633146109d65760405162461bcd60e51b81526004016104739061134b565b60058190556040518181527fb42aeb1dff935605cccca8f17007a26258bcc6bde46312d3aaae9ecbac66748490602001610687565b5f546001600160a01b03163314610a345760405162461bcd60e51b81526004016104739061134b565b6001600160a01b038116610a5a5760405162461bcd60e51b81526004016104739061136e565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b478015610447577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015610b13575f5ffd5b505af1158015610b25573d5f5f3e3d5ffd5b505050505050565b5f610b396002836113e6565b9050805f03610b46575050565b6001546002546001600160a01b0391821691908116905f9081907f0000000000000000000000000000000000000000000000000000000000000000168403610b9057849150610dc6565b6040516370a0823160e01b81525f906001600160a01b038616906370a0823190610bbe903090600401611272565b602060405180830381865afa158015610bd9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bfd9190611334565b6040805160028082526060820183529293505f9290916020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110610c5557610c55611405565b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110610c8957610c89611405565b6001600160a01b039283166020918202929092010152604051635c11d79560e01b81527f000000000000000000000000000000000000000000000000000000000000000090911690635c11d79590610ced908a905f90869030904290600401611419565b5f604051808303815f87803b158015610d04575f5ffd5b505af1925050508015610d15575060015b610d23575050505050505050565b6040516370a0823160e01b815282906001600160a01b038816906370a0823190610d51903090600401611272565b602060405180830381865afa158015610d6c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d909190611334565b610d9a9190611489565b9350835f03610dad575050505050505050565b8360065f828254610dbe9190611241565b909155505050505b5f610dd18688611489565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603610e1457809150611036565b6040516370a0823160e01b81525f906001600160a01b038616906370a0823190610e42903090600401611272565b602060405180830381865afa158015610e5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e819190611334565b6040805160028082526060820183529293505f9290916020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110610ed957610ed9611405565b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110610f0d57610f0d611405565b6001600160a01b039283166020918202929092010152604051635c11d79560e01b81527f000000000000000000000000000000000000000000000000000000000000000090911690635c11d79590610f719086905f90869030904290600401611419565b5f604051808303815f87803b158015610f88575f5ffd5b505af1925050508015610f99575060015b610fa857505050505050505050565b6040516370a0823160e01b815282906001600160a01b038816906370a0823190610fd6903090600401611272565b602060405180830381865afa158015610ff1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110159190611334565b61101f9190611489565b9350835f0361103357505050505050505050565b50505b60405162e8e33760e81b81526001600160a01b038681166004830152858116602483015260448201859052606482018490525f6084830181905260a48301523060c48301524260e48301527f0000000000000000000000000000000000000000000000000000000000000000169063e8e3370090610104016060604051808303815f875af19250505080156110e8575060408051601f3d908101601f191682019092526110e59181019061149c565b60015b15611224575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561114a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116e91906114c7565b6001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040161119b9291906113cc565b602060405180830381865afa1580156111b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111da91906114c7565b9050806001600160a01b03167fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb3120888360405161121791815260200190565b60405180910390a2505050505b50505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156112545761125461122d565b92915050565b5f6001820161126b5761126b61122d565b5060010190565b6001600160a01b0391909116815260200190565b5f60208284031215611296575f5ffd5b5035919050565b6001600160a01b0381168114610447575f5ffd5b5f5f604083850312156112c2575f5ffd5b82356112cd8161129d565b915060208301356112dd8161129d565b809150509250929050565b5f5f604083850312156112f9575f5ffd5b82356113048161129d565b946020939093013593505050565b5f60208284031215611322575f5ffd5b813561132d8161129d565b9392505050565b5f60208284031215611344575f5ffd5b5051919050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b6001600160a01b03929092168252602082015260400190565b5f602082840312156113bd575f5ffd5b8151801515811461132d575f5ffd5b6001600160a01b0392831681529116602082015260400190565b5f8261140057634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156114695783516001600160a01b0316835260209384019390920191600101611442565b50506001600160a01b039590951660608401525050608001529392505050565b818103818111156112545761125461122d565b5f5f5f606084860312156114ae575f5ffd5b5050815160208301516040909301519094929350919050565b5f602082840312156114d7575f5ffd5b815161132d8161129d56fea164736f6c634300081f000a000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27000000000000000000000000f2da3942616880e52e841e5c504b5a9fba23fff0000000000000000000000000f6f8db0aba00007681f8faf16a0fda1c9b030b11000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d90000000000000000000000000000000000000000000096a2d971e4861af51d4900000000000000000000000000000000000000000007904097a9ff8b14ac532b

Deployed ByteCode

0x6080604052600436106100db575f3560e01c80630f695da7146101275780630fc63d101461014f578063217ccf021461017b578063279c4ebf146101905780633923411c146101af5780634ccd4097146101c35780635f64b55b146101e25780637209d3b9146102015780637ba85592146102165780638da5cb5b1461022b57806395c5c5e31461024957806397eac8e8146102685780639e281a981461027d578063c59d48471461029c578063d5dcaeee146102c3578063ef8ef56f146102e2578063f2fde38b14610315578063f887ea4014610334575f5ffd5b36610123573460075f8282546100f19190611241565b909155505060048054905f6101058361125a565b919050555060035460045410610121575f600455610121610367565b005b5f5ffd5b348015610132575f5ffd5b5061013c60065481565b6040519081526020015b60405180910390f35b34801561015a575f5ffd5b5060015461016e906001600160a01b031681565b6040516101469190611272565b348015610186575f5ffd5b5061013c60075481565b34801561019b575f5ffd5b506101216101aa366004611286565b61044a565b3480156101ba575f5ffd5b50610121610512565b3480156101ce575f5ffd5b506101216101dd366004611286565b6105f0565b3480156101ed575f5ffd5b5060025461016e906001600160a01b031681565b34801561020c575f5ffd5b5061013c60035481565b348015610221575f5ffd5b5061013c60045481565b348015610236575f5ffd5b505f5461016e906001600160a01b031681565b348015610254575f5ffd5b506101216102633660046112b1565b610692565b348015610273575f5ffd5b5061013c60055481565b348015610288575f5ffd5b506101216102973660046112e8565b6108e6565b3480156102a7575f5ffd5b5060065460075460408051928352602083019190915201610146565b3480156102ce575f5ffd5b506101216102dd366004611286565b6109ad565b3480156102ed575f5ffd5b5061016e7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2781565b348015610320575f5ffd5b5061012161032f366004611312565b610a0b565b34801561033f575f5ffd5b5061016e7f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d981565b61036f610ab3565b6040516370a0823160e01b81525f906001600160a01b037f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2716906370a08231906103bd903090600401611272565b602060405180830381865afa1580156103d8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103fc9190611334565b905060055481101561040b5750565b6040518181527fd4e1cd91d2707400c53a3fc4822006215c498a3d424b95eabedaf574d2bb64019060200160405180910390a161044781610b2d565b50565b5f546001600160a01b0316331461047c5760405162461bcd60e51b81526004016104739061134b565b60405180910390fd5b5f80546040516001600160a01b039091169083908381818185875af1925050503d805f81146104c6576040519150601f19603f3d011682016040523d82523d5f602084013e6104cb565b606091505b505090508061050e5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610473565b5050565b61051a610ab3565b6040516370a0823160e01b81525f906001600160a01b037f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2716906370a0823190610568903090600401611272565b602060405180830381865afa158015610583573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a79190611334565b90506005548110156105e75760405162461bcd60e51b81526020600482015260096024820152682132b637bb9036b4b760b91b6044820152606401610473565b61044781610b2d565b5f546001600160a01b031633146106195760405162461bcd60e51b81526004016104739061134b565b5f81116106565760405162461bcd60e51b815260206004820152600b60248201526a04d757374206265203e20360ac1b6044820152606401610473565b60038190556040518181527faece30ec52bb020d80a8b6a0a5688f46722d23cbe2e7d80e1313c42675f2bf6a906020015b60405180910390a150565b5f546001600160a01b031633146106bb5760405162461bcd60e51b81526004016104739061134b565b6001600160a01b038216158015906106db57506001600160a01b03811615155b6106f75760405162461bcd60e51b81526004016104739061136e565b600180546001600160a01b038085166001600160a01b03199283168117909355600280548583169316929092179091557f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2716146107df5760405163095ea7b360e01b81526001600160a01b0383169063095ea7b39061079d907f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d9905f1990600401611394565b6020604051808303815f875af11580156107b9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107dd91906113ad565b505b7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276001600160a01b0316816001600160a01b0316146108a95760405163095ea7b360e01b81526001600160a01b0382169063095ea7b390610867907f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d9905f1990600401611394565b6020604051808303815f875af1158015610883573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a791906113ad565b505b7f2daa13478b8265a01977bdca6d2719323c82f5d97ff95449c85592b27f65560482826040516108da9291906113cc565b60405180910390a15050565b5f546001600160a01b0316331461090f5760405162461bcd60e51b81526004016104739061134b565b6001600160a01b0382166109355760405162461bcd60e51b81526004016104739061136e565b5f5460405163a9059cbb60e01b81526001600160a01b038481169263a9059cbb9261096892909116908590600401611394565b6020604051808303815f875af1158015610984573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a891906113ad565b505050565b5f546001600160a01b031633146109d65760405162461bcd60e51b81526004016104739061134b565b60058190556040518181527fb42aeb1dff935605cccca8f17007a26258bcc6bde46312d3aaae9ecbac66748490602001610687565b5f546001600160a01b03163314610a345760405162461bcd60e51b81526004016104739061134b565b6001600160a01b038116610a5a5760405162461bcd60e51b81526004016104739061136e565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b478015610447577f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015610b13575f5ffd5b505af1158015610b25573d5f5f3e3d5ffd5b505050505050565b5f610b396002836113e6565b9050805f03610b46575050565b6001546002546001600160a01b0391821691908116905f9081907f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27168403610b9057849150610dc6565b6040516370a0823160e01b81525f906001600160a01b038616906370a0823190610bbe903090600401611272565b602060405180830381865afa158015610bd9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bfd9190611334565b6040805160028082526060820183529293505f9290916020830190803683370190505090507f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27815f81518110610c5557610c55611405565b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110610c8957610c89611405565b6001600160a01b039283166020918202929092010152604051635c11d79560e01b81527f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d990911690635c11d79590610ced908a905f90869030904290600401611419565b5f604051808303815f87803b158015610d04575f5ffd5b505af1925050508015610d15575060015b610d23575050505050505050565b6040516370a0823160e01b815282906001600160a01b038816906370a0823190610d51903090600401611272565b602060405180830381865afa158015610d6c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d909190611334565b610d9a9190611489565b9350835f03610dad575050505050505050565b8360065f828254610dbe9190611241565b909155505050505b5f610dd18688611489565b90507f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276001600160a01b0316846001600160a01b031603610e1457809150611036565b6040516370a0823160e01b81525f906001600160a01b038616906370a0823190610e42903090600401611272565b602060405180830381865afa158015610e5d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e819190611334565b6040805160028082526060820183529293505f9290916020830190803683370190505090507f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27815f81518110610ed957610ed9611405565b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110610f0d57610f0d611405565b6001600160a01b039283166020918202929092010152604051635c11d79560e01b81527f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d990911690635c11d79590610f719086905f90869030904290600401611419565b5f604051808303815f87803b158015610f88575f5ffd5b505af1925050508015610f99575060015b610fa857505050505050505050565b6040516370a0823160e01b815282906001600160a01b038816906370a0823190610fd6903090600401611272565b602060405180830381865afa158015610ff1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110159190611334565b61101f9190611489565b9350835f0361103357505050505050505050565b50505b60405162e8e33760e81b81526001600160a01b038681166004830152858116602483015260448201859052606482018490525f6084830181905260a48301523060c48301524260e48301527f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d9169063e8e3370090610104016060604051808303815f875af19250505080156110e8575060408051601f3d908101601f191682019092526110e59181019061149c565b60015b15611224575f7f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561114a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116e91906114c7565b6001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040161119b9291906113cc565b602060405180830381865afa1580156111b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111da91906114c7565b9050806001600160a01b03167fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb3120888360405161121791815260200190565b60405180910390a2505050505b50505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156112545761125461122d565b92915050565b5f6001820161126b5761126b61122d565b5060010190565b6001600160a01b0391909116815260200190565b5f60208284031215611296575f5ffd5b5035919050565b6001600160a01b0381168114610447575f5ffd5b5f5f604083850312156112c2575f5ffd5b82356112cd8161129d565b915060208301356112dd8161129d565b809150509250929050565b5f5f604083850312156112f9575f5ffd5b82356113048161129d565b946020939093013593505050565b5f60208284031215611322575f5ffd5b813561132d8161129d565b9392505050565b5f60208284031215611344575f5ffd5b5051919050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b6001600160a01b03929092168252602082015260400190565b5f602082840312156113bd575f5ffd5b8151801515811461132d575f5ffd5b6001600160a01b0392831681529116602082015260400190565b5f8261140057634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156114695783516001600160a01b0316835260209384019390920191600101611442565b50506001600160a01b039590951660608401525050608001529392505050565b818103818111156112545761125461122d565b5f5f5f606084860312156114ae575f5ffd5b5050815160208301516040909301519094929350919050565b5f602082840312156114d7575f5ffd5b815161132d8161129d56fea164736f6c634300081f000a