false
true
0

Contract Address Details

0x0000010d23CcfEE520c3fb5a5ba9679cB9D83cBE

Contract Name
Exchange
Creator
0x4bd925–a36e02 at 0x5e81dd–a57f84
Balance
0.0321 PLS ( )
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
26347944
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:
Exchange




Optimization enabled
true
Compiler version
v0.4.25+commit.59dbf8f1




Optimization runs
200
EVM Version
byzantium




Verified at
2026-04-22T01:58:50.948508Z

Exchange.sol

pragma solidity ^0.4.24;

interface tokenRecipient { 
    function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) external; 
}

contract ZFX {
    string public name = 'ZFX';
    string public symbol = 'ZFX';
    uint8 public decimals = 18;
    uint public totalSupply = 1000000 * 10 ** uint(decimals);
    address public owner;

    // This creates an array with all balances
    mapping (address => uint256) public balanceOf;
    mapping (address => mapping (address => uint256)) public allowance;

    // This generates a public event on the blockchain that will notify clients
    event Transfer(address indexed from, address indexed to, uint256 value);
    
    // This generates a public event on the blockchain that will notify clients
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    // This notifies clients about the amount burnt
    event Burn(address indexed from, uint256 value);

    modifier onlyOwner {
        if (msg.sender != owner) revert();
        _;
    }

    /**
     * Constructor function
     *
     * Initializes contract with initial supply tokens to the creator of the contract
     */
    constructor(address creator) public {
        balanceOf[creator] = totalSupply;
        owner = msg.sender;
    }

    /**
     * Internal transfer, only can be called by this contract
     */
    function _transfer(address _from, address _to, uint _value) internal {
        // Prevent transfer to 0x0 address. Use burn() instead
        require(_to != address(0x0));
        // Check if the sender has enough
        require(balanceOf[_from] >= _value);
        // Check for overflows
        require(balanceOf[_to] + _value >= balanceOf[_to]);
        // Save this for an assertion in the future
        uint previousBalances = balanceOf[_from] + balanceOf[_to];
        // Subtract from the sender
        balanceOf[_from] -= _value;
        // Add the same to the recipient
        balanceOf[_to] += _value;
        emit Transfer(_from, _to, _value);
        // Asserts are used to use static analysis to find bugs in your code. They should never fail
        assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
    }

    /**
     * Transfer tokens
     *
     * Send `_value` tokens to `_to` from your account
     *
     * @param _to The address of the recipient
     * @param _value the amount to send
     */
    function transfer(address _to, uint256 _value) public returns (bool success) {
        _transfer(msg.sender, _to, _value);
        return true;
    }

    /**
     * Transfer tokens from other address
     *
     * Send `_value` tokens to `_to` on behalf of `_from`
     *
     * @param _from The address of the sender
     * @param _to The address of the recipient
     * @param _value the amount to send
     */
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        require(_value <= allowance[_from][msg.sender]);     // Check allowance
        allowance[_from][msg.sender] -= _value;
        _transfer(_from, _to, _value);
        return true;
    }

    /**
     * Set allowance for other address
     *
     * Allows `_spender` to spend no more than `_value` tokens on your behalf
     *
     * @param _spender The address authorized to spend
     * @param _value the max amount they can spend
     */
    function approve(address _spender, uint256 _value) public
        returns (bool success) {
        allowance[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

    /**
     * Set allowance for other address and notify
     *
     * Allows `_spender` to spend no more than `_value` tokens on your behalf, and then ping the contract about it
     *
     * @param _spender The address authorized to spend
     * @param _value the max amount they can spend
     * @param _extraData some extra information to send to the approved contract
     */
    function approveAndCall(address _spender, uint256 _value, bytes memory _extraData)
        public
        returns (bool success) {
        tokenRecipient spender = tokenRecipient(_spender);
        if (approve(_spender, _value)) {
            spender.receiveApproval(msg.sender, _value, address(this), _extraData);
            return true;
        }
    }

    /**
     * Destroy tokens
     *
     * Remove `_value` tokens from the system irreversibly
     *
     * @param _value the amount of money to burn
     */
    function burn(uint256 _value) public returns (bool success) {
        require(balanceOf[msg.sender] >= _value);   // Check if the sender has enough
        balanceOf[msg.sender] -= _value;            // Subtract from the sender
        totalSupply -= _value;                      // Updates totalSupply
        emit Burn(msg.sender, _value);
        return true;
    }

    /**
     * Destroy tokens from other account
     *
     * Remove `_value` tokens from the system irreversibly on behalf of `_from`.
     *
     * @param _from the address of the sender
     * @param _value the amount of money to burn
     */
    function burnFrom(address _from, uint256 _value) public returns (bool success) {
        require(balanceOf[_from] >= _value);                // Check if the targeted balance is enough
        require(_value <= allowance[_from][msg.sender]);    // Check allowance
        balanceOf[_from] -= _value;                         // Subtract from the targeted balance
        allowance[_from][msg.sender] -= _value;             // Subtract from the sender's allowance
        totalSupply -= _value;                              // Update totalSupply
        emit Burn(_from, _value);
        return true;
    }
    
    function mint(address _to, uint _amount) external onlyOwner {
        balanceOf[_to] += _amount;
        totalSupply += _amount;
        require(totalSupply >= _amount);
        emit Transfer(address(0), address(this), _amount);
        emit Transfer(address(this), _to, _amount);
    }
}

contract Token {
    function totalSupply() public constant returns (uint);
    function balanceOf(address tokenOwner) public constant returns (uint balance);
    function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
    function transfer(address to, uint tokens) public returns (bool success);
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);
    
    uint8 public decimals;
}

contract Exchange {
    struct Order {
        address creator;
        address token;
        bool buy;
        uint price;
        uint amount;
    }
    
    address public owner;
    uint public feeDeposit = 500;
    
    mapping (uint => Order) orders;
    uint currentOrderId = 0;
    
    ZFX public ZFXToken;
    
    /* Token address (0x0 - Ether) => User address => balance */
    mapping (address => mapping (address => uint)) public balanceOf;
    
    event FundTransfer(address backer, uint amount, bool isContribution);
    
    event PlaceSell(address indexed token, address indexed user, uint price, uint amount, uint id);
    event PlaceBuy(address indexed token, address indexed user, uint price, uint amount, uint id);
    event FillOrder(uint indexed id, address indexed user, uint amount);
    event CancelOrder(uint indexed id);
    event Deposit(address indexed token, address indexed user, uint amount);
    event Withdraw(address indexed token, address indexed user, uint amount);
    event BalanceChanged(address indexed token, address indexed user, uint value);

    modifier onlyOwner {
        if (msg.sender != owner) revert();
        _;
    }
    
    function transferOwnership(address newOwner) external onlyOwner {
        owner = newOwner;
    }
    
    constructor() public {
        owner = msg.sender;
        ZFXToken = new ZFX(msg.sender);
    }
    
    function safeAdd(uint a, uint b) private pure returns (uint) {
        uint c = a + b;
        assert(c >= a);
        return c;
    }
    
    function safeSub(uint a, uint b) private pure returns (uint) {
        assert(b <= a);
        return a - b;
    }
    
    function safeMul(uint a, uint b) private pure returns (uint) {
        if (a == 0) {
          return 0;
        }
        
        uint c = a * b;
        assert(c / a == b);
        return c;
    }
    
    function decFeeDeposit(uint delta) external onlyOwner {
        feeDeposit = safeSub(feeDeposit, delta);
    }
    
    function calcAmountEther(address tokenAddr, uint price, uint amount) private view returns (uint) {
        uint k = 10;
        k = k ** Token(tokenAddr).decimals();
        return safeMul(amount, price) / k;
    }
    
    function balanceAdd(address tokenAddr, address user, uint amount) private {
        balanceOf[tokenAddr][user] =
            safeAdd(balanceOf[tokenAddr][user], amount);
    }
    
    function balanceSub(address tokenAddr, address user, uint amount) private {
        require(balanceOf[tokenAddr][user] >= amount);
        balanceOf[tokenAddr][user] =
            safeSub(balanceOf[tokenAddr][user], amount);
    }
    
    function placeBuy(address tokenAddr, uint price, uint amount) external {
        require(price > 0 && amount > 0);
        uint amountEther = calcAmountEther(tokenAddr, price, amount);
        require(amountEther > 0);
        balanceSub(0x0, msg.sender, amountEther);
        emit BalanceChanged(0x0, msg.sender, balanceOf[0x0][msg.sender]);
        orders[currentOrderId] = Order({
            creator: msg.sender,
            token: tokenAddr,
            buy: true,
            price: price,
            amount: amount
        });
        emit PlaceBuy(tokenAddr, msg.sender, price, amount, currentOrderId);
        currentOrderId++;
        
        ZFXToken.mint(msg.sender, 1000000000000000000);
    }
    
    function placeSell(address tokenAddr, uint price, uint amount) external {
        require(price > 0 && amount > 0);
        uint amountEther = calcAmountEther(tokenAddr, price, amount);
        require(amountEther > 0);
        balanceSub(tokenAddr, msg.sender, amount);
        emit BalanceChanged(tokenAddr, msg.sender, balanceOf[tokenAddr][msg.sender]);
        orders[currentOrderId] = Order({
            creator: msg.sender,
            token: tokenAddr,
            buy: false,
            price: price,
            amount: amount
        });
        emit PlaceSell(tokenAddr, msg.sender, price, amount, currentOrderId);
        currentOrderId++;
        
        ZFXToken.mint(msg.sender, 1000000000000000000);
    }
    
    function fillOrder(uint id, uint amount) external {
        require(id < currentOrderId);
        require(amount > 0);
        require(orders[id].creator != msg.sender);
        require(orders[id].amount >= amount);
        uint amountEther = calcAmountEther(orders[id].token, orders[id].price, amount);
        if (orders[id].buy) {
            /* send tokens from sender to creator */
            // sub from sender
            balanceSub(orders[id].token, msg.sender, amount);
            emit BalanceChanged(
                orders[id].token,
                msg.sender,
                balanceOf[orders[id].token][msg.sender]
            );
            
            // add to creator
            balanceAdd(orders[id].token, orders[id].creator, amount);
            emit BalanceChanged(
                orders[id].token,
                orders[id].creator,
                balanceOf[orders[id].token][orders[id].creator]
            );
            
            /* send Ether to sender */
            balanceAdd(0x0, msg.sender, amountEther);
            emit BalanceChanged(
                0x0,
                msg.sender,
                balanceOf[0x0][msg.sender]
            );
        } else {
            /* send Ether from sender to creator */
            // sub from sender
            balanceSub(0x0, msg.sender, amountEther);
            emit BalanceChanged(
                0x0,
                msg.sender,
                balanceOf[0x0][msg.sender]
            );
            
            // add to creator
            balanceAdd(0x0, orders[id].creator, amountEther);
            emit BalanceChanged(
                0x0,
                orders[id].creator,
                balanceOf[0x0][orders[id].creator]
            );
            
            /* send tokens to sender */
            balanceAdd(orders[id].token, msg.sender, amount);
            emit BalanceChanged(
                orders[id].token,
                msg.sender,
                balanceOf[orders[id].token][msg.sender]
            );
        }
        orders[id].amount -= amount;
        emit FillOrder(id, msg.sender, orders[id].amount);
        
        ZFXToken.mint(msg.sender, 1000000000000000000);
    }
    
    function cancelOrder(uint id) external {
        require(id < currentOrderId);
        require(orders[id].creator == msg.sender);
        require(orders[id].amount > 0);
        if (orders[id].buy) {
            uint amountEther = calcAmountEther(orders[id].token, orders[id].price, orders[id].amount);
            balanceAdd(0x0, msg.sender, amountEther);
            emit BalanceChanged(0x0, msg.sender, balanceOf[0x0][msg.sender]);
        } else {
            balanceAdd(orders[id].token, msg.sender, orders[id].amount);
            emit BalanceChanged(orders[id].token, msg.sender, balanceOf[orders[id].token][msg.sender]);
        }
        orders[id].amount = 0;
        emit CancelOrder(id);
    }
    
    function getFee(address user) public view returns (uint) {
        uint fee = feeDeposit * ZFXToken.balanceOf(user) * 10 / ZFXToken.totalSupply();
        return fee < feeDeposit ? feeDeposit - fee : 0;
    }
    
    function () external payable {
        require(msg.value > 0);
        uint fee = msg.value * getFee(msg.sender) / 10000;
        require(msg.value > fee);
        balanceAdd(0x0, owner, fee);
        
        uint toAdd = msg.value - fee;
        balanceAdd(0x0, msg.sender, toAdd);
        
        emit Deposit(0x0, msg.sender, toAdd);
        emit BalanceChanged(0x0, msg.sender, balanceOf[0x0][msg.sender]);
        
        emit FundTransfer(msg.sender, toAdd, true);
    }
    
    function depositToken(address tokenAddr, uint amount) external {
        require(tokenAddr != 0x0);
        require(amount > 0);
        Token(tokenAddr).transferFrom(msg.sender, this, amount);
        balanceAdd(tokenAddr, msg.sender, amount);
        
        emit Deposit(tokenAddr, msg.sender, amount);
        emit BalanceChanged(tokenAddr, msg.sender, balanceOf[tokenAddr][msg.sender]);
    }
    
    function withdrawEther(uint amount) external {
        require(amount > 0);
        balanceSub(0x0, msg.sender, amount);
        msg.sender.transfer(amount);
        
        emit Withdraw(0x0, msg.sender, amount);
        emit BalanceChanged(0x0, msg.sender, balanceOf[0x0][msg.sender]);
        
        emit FundTransfer(msg.sender, amount, false);
    }
    
    function withdrawToken(address tokenAddr, uint amount) external {
        require(tokenAddr != 0x0);
        require(amount > 0);
        balanceSub(tokenAddr, msg.sender, amount);
        Token(tokenAddr).transfer(msg.sender, amount);
        
        emit Withdraw(tokenAddr, msg.sender, amount);
        emit BalanceChanged(tokenAddr, msg.sender, balanceOf[tokenAddr][msg.sender]);
    }
}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"byzantium","compilationTarget":{"Exchange.sol":"Exchange"}}
              

Contract ABI

[{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"depositToken","inputs":[{"type":"address","name":"tokenAddr"},{"type":"uint256","name":"amount"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"withdrawEther","inputs":[{"type":"uint256","name":"amount"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"placeSell","inputs":[{"type":"address","name":"tokenAddr"},{"type":"uint256","name":"price"},{"type":"uint256","name":"amount"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"cancelOrder","inputs":[{"type":"uint256","name":"id"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"decFeeDeposit","inputs":[{"type":"uint256","name":"delta"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"placeBuy","inputs":[{"type":"address","name":"tokenAddr"},{"type":"uint256","name":"price"},{"type":"uint256","name":"amount"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"withdrawToken","inputs":[{"type":"address","name":"tokenAddr"},{"type":"uint256","name":"amount"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"feeDeposit","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"ZFXToken","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getFee","inputs":[{"type":"address","name":"user"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"fillOrder","inputs":[{"type":"uint256","name":"id"},{"type":"uint256","name":"amount"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"balanceOf","inputs":[{"type":"address","name":""},{"type":"address","name":""}],"constant":true},{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[]},{"type":"fallback","stateMutability":"payable","payable":true},{"type":"event","name":"FundTransfer","inputs":[{"type":"address","name":"backer","indexed":false},{"type":"uint256","name":"amount","indexed":false},{"type":"bool","name":"isContribution","indexed":false}],"anonymous":false},{"type":"event","name":"PlaceSell","inputs":[{"type":"address","name":"token","indexed":true},{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"price","indexed":false},{"type":"uint256","name":"amount","indexed":false},{"type":"uint256","name":"id","indexed":false}],"anonymous":false},{"type":"event","name":"PlaceBuy","inputs":[{"type":"address","name":"token","indexed":true},{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"price","indexed":false},{"type":"uint256","name":"amount","indexed":false},{"type":"uint256","name":"id","indexed":false}],"anonymous":false},{"type":"event","name":"FillOrder","inputs":[{"type":"uint256","name":"id","indexed":true},{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"amount","indexed":false}],"anonymous":false},{"type":"event","name":"CancelOrder","inputs":[{"type":"uint256","name":"id","indexed":true}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"token","indexed":true},{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"amount","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"token","indexed":true},{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"amount","indexed":false}],"anonymous":false},{"type":"event","name":"BalanceChanged","inputs":[{"type":"address","name":"token","indexed":true},{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false}]
              

Contract Creation Code

Verify & Publish
0x60806040526101f4600155600060035534801561001b57600080fd5b5060008054600160a060020a0319163390811790915561003961008c565b600160a060020a03909116815260405190819003602001906000f080158015610066573d6000803e3d6000fd5b5060048054600160a060020a031916600160a060020a039290921691909117905561009c565b604051610bae8061167a83390190565b6115cf806100ab6000396000f3006080604052600436106100cf5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663338b5dea81146101e95780633bed33ce1461020f57806345e4146814610227578063514fcac71461024e57806372fc493d14610266578063894cd9b61461027e5780638da5cb5b146102a55780639e281a98146102d6578063abca7290146102fa578063b3fd119314610321578063b88c914814610336578063c37dfc5b14610357578063f2fde38b14610372578063f7888aec14610393575b6000803481106100de57600080fd5b6127106100ea336103ba565b34028115156100f557fe5b04915034821061010457600080fd5b6000805461011c9190600160a060020a03168461050c565b813403905061012d6000338361050c565b60408051828152905133916000917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629181900360200190a3336000818152600080516020611584833981519152602090815260408083205481519081529051600080516020611564833981519152929181900390910190a3604080513381526020810183905260018183015290517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf69181900360600190a15050005b3480156101f557600080fd5b5061020d600160a060020a036004351660243561056d565b005b34801561021b57600080fd5b5061020d6004356106c3565b34801561023357600080fd5b5061020d600160a060020a03600435166024356044356107c5565b34801561025a57600080fd5b5061020d6004356109f7565b34801561027257600080fd5b5061020d600435610bc1565b34801561028a57600080fd5b5061020d600160a060020a0360043516602435604435610bea565b3480156102b157600080fd5b506102ba610df4565b60408051600160a060020a039092168252519081900360200190f35b3480156102e257600080fd5b5061020d600160a060020a0360043516602435610e03565b34801561030657600080fd5b5061030f610f52565b60408051918252519081900360200190f35b34801561032d57600080fd5b506102ba610f58565b34801561034257600080fd5b5061030f600160a060020a03600435166103ba565b34801561036357600080fd5b5061020d600435602435610f67565b34801561037e57600080fd5b5061020d600160a060020a036004351661139a565b34801561039f57600080fd5b5061030f600160a060020a03600435811690602435166113e0565b60048054604080517f18160ddd00000000000000000000000000000000000000000000000000000000815290516000938493600160a060020a0316926318160ddd928183019260209282900301818787803b15801561041857600080fd5b505af115801561042c573d6000803e3d6000fd5b505050506040513d602081101561044257600080fd5b505160048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a0388811694820194909452905192909116916370a08231916024808201926020929091908290030181600087803b1580156104b057600080fd5b505af11580156104c4573d6000803e3d6000fd5b505050506040513d60208110156104da57600080fd5b505160015402600a028115156104ec57fe5b04905060015481106104ff576000610505565b80600154035b9392505050565b600160a060020a0380841660009081526005602090815260408083209386168352929052205461053c90826113fd565b600160a060020a03938416600090815260056020908152604080832095909616825293909352929091209190915550565b600160a060020a038216151561058257600080fd5b6000811161058f57600080fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390529051600160a060020a038416916323b872dd9160648083019260209291908290030181600087803b1580156105fd57600080fd5b505af1158015610611573d6000803e3d6000fd5b505050506040513d602081101561062757600080fd5b50610635905082338361050c565b6040805182815290513391600160a060020a038516917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629181900360200190a3600160a060020a038216600081815260056020908152604080832033808552908352928190205481519081529051929392600080516020611564833981519152929181900390910190a35050565b600081116106d057600080fd5b6106dc60003383611417565b604051339082156108fc029083906000818181858888f19350505050158015610709573d6000803e3d6000fd5b5060408051828152905133916000917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9181900360200190a3336000818152600080516020611584833981519152602090815260408083205481519081529051600080516020611564833981519152929181900390910190a3604080513381526020810183905260008183015290517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf69181900360600190a150565b600080831180156107d65750600082115b15156107e157600080fd5b6107ec848484611479565b9050600081116107fb57600080fd5b610806843384611417565b600160a060020a038416600081815260056020908152604080832033808552908352928190205481519081529051929392600080516020611564833981519152929181900390910190a36040805160a08101825233808252600160a060020a038781166020808501828152600086880181815260608089018d815260808a018d81526003805486526002808952958d90209b518c54908b1673ffffffffffffffffffffffffffffffffffffffff19918216178d55965160018d01805496511515740100000000000000000000000000000000000000000274ff00000000000000000000000000000000000000001992909c1696909816959095179490941698909817909455925191880191909155935195840195909555915485518981529283018890528286015293519193927fd38bee561968b61a4625e513f46de6793b0ca76a5dad1ffbf139f617093c26b892918290030190a360038054600101905560048054604080517f40c10f190000000000000000000000000000000000000000000000000000000081523393810193909352670de0b6b3a7640000602484015251600160a060020a03909116916340c10f1991604480830192600092919082900301818387803b1580156109d957600080fd5b505af11580156109ed573d6000803e3d6000fd5b5050505050505050565b6003546000908210610a0857600080fd5b600082815260026020526040902054600160a060020a03163314610a2b57600080fd5b60008281526002602052604081206003015411610a4757600080fd5b60008281526002602052604090206001015474010000000000000000000000000000000000000000900460ff1615610b00576000828152600260208190526040909120600181015491810154600390910154610aad92600160a060020a03169190611479565b9050610abb6000338361050c565b336000818152600080516020611584833981519152602090815260408083205481519081529051600080516020611564833981519152929181900390910190a3610b82565b60008281526002602052604090206001810154600390910154610b2e91600160a060020a031690339061050c565b600082815260026020908152604080832060010154600160a060020a031680845260058352818420338086529084529382902054825190815291519092600080516020611564833981519152928290030190a35b6000828152600260205260408082206003018290555183917f935c9ad2f1fda9d7eae0d2a512f1521cb7190ee06165414e722366a65975fb6b91a25050565b600054600160a060020a03163314610bd857600080fd5b610be460015482611526565b60015550565b60008083118015610bfb5750600082115b1515610c0657600080fd5b610c11848484611479565b905060008111610c2057600080fd5b610c2c60003383611417565b336000818152600080516020611584833981519152602090815260408083205481519081529051600080516020611564833981519152929181900390910190a36040805160a08101825233808252600160a060020a038781166020808501828152600186880181815260608089018d815260808a018d81526003805460009081526002808a52908e90209c518d54908c1673ffffffffffffffffffffffffffffffffffffffff19918216178e559751968d01805496511515740100000000000000000000000000000000000000000274ff00000000000000000000000000000000000000001998909c1696909816959095179590951698909817909455925190880155935195840195909555915485518981529283018890528286015293519193927f66eba165e49ff13d84ca1cfbda4927231bac30ae16c9b1f769ecc6a2a9518a7a92918290030190a360038054600101905560048054604080517f40c10f190000000000000000000000000000000000000000000000000000000081523393810193909352670de0b6b3a7640000602484015251600160a060020a03909116916340c10f1991604480830192600092919082900301818387803b1580156109d957600080fd5b600054600160a060020a031681565b600160a060020a0382161515610e1857600080fd5b60008111610e2557600080fd5b610e30823383611417565b604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051600160a060020a0384169163a9059cbb9160448083019260209291908290030181600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050506040513d6020811015610ec257600080fd5b50506040805182815290513391600160a060020a038516917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9181900360200190a3600160a060020a038216600081815260056020908152604080832033808552908352928190205481519081529051929392600080516020611564833981519152929181900390910190a35050565b60015481565b600454600160a060020a031681565b6003546000908310610f7857600080fd5b60008211610f8557600080fd5b600083815260026020526040902054600160a060020a0316331415610fa957600080fd5b600083815260026020526040902060030154821115610fc757600080fd5b60008381526002602081905260409091206001810154910154610ff491600160a060020a03169084611479565b60008481526002602052604090206001015490915074010000000000000000000000000000000000000000900460ff161561117b5760008381526002602052604090206001015461104f90600160a060020a03163384611417565b600083815260026020908152604080832060010154600160a060020a031680845260058352818420338086529084529382902054825190815291519092600080516020611564833981519152928290030190a36000838152600260205260409020600181015490546110ce91600160a060020a0390811691168461050c565b60008381526002602090815260408083208054600190910154600160a060020a0390811680865260058552838620919092168086529084529382902054825190815291519092600080516020611564833981519152928290030190a36111366000338361050c565b336000818152600080516020611584833981519152602090815260408083205481519081529051600080516020611564833981519152929181900390910190a36112b7565b61118760003383611417565b336000818152600080516020611584833981519152602090815260408083205481519081529051600080516020611564833981519152929181900390910190a36000838152600260205260408120546111ea9190600160a060020a03168361050c565b600083815260026020908152604080832054600160a060020a031680845260008051602061158483398151915283528184205482519081529151909392600080516020611564833981519152928290030190a360008381526002602052604090206001015461126390600160a060020a0316338461050c565b600083815260026020908152604080832060010154600160a060020a031680845260058352818420338086529084529382902054825190815291519092600080516020611564833981519152928290030190a35b60008381526002602090815260409182902060030180548590039081905582519081529151339286927faa2d5c051098b55cf71a58aeae7141cdc811975799a3d6fc8464f091a14c40d292918290030190a360048054604080517f40c10f190000000000000000000000000000000000000000000000000000000081523393810193909352670de0b6b3a7640000602484015251600160a060020a03909116916340c10f1991604480830192600092919082900301818387803b15801561137d57600080fd5b505af1158015611391573d6000803e3d6000fd5b50505050505050565b600054600160a060020a031633146113b157600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600560209081526000928352604080842090915290825290205481565b60008282018381101561140c57fe5b8091505b5092915050565b600160a060020a0380841660009081526005602090815260408083209386168352929052205481111561144957600080fd5b600160a060020a0380841660009081526005602090815260408083209386168352929052205461053c9082611526565b600080600a905084600160a060020a031663313ce5676040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156114d757600080fd5b505af11580156114eb573d6000803e3d6000fd5b505050506040513d602081101561150157600080fd5b505160ff16900a806115138486611538565b81151561151c57fe5b0495945050505050565b60008282111561153257fe5b50900390565b60008083151561154b5760009150611410565b5082820282848281151561155b57fe5b041461140c57fe007a350141a4375888264971fc98bdf535c1843ad8a215baaede8397fb56404ab305b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bca165627a7a72305820a781bbe406b17dec32089264cc51bd38e1b56e3164bd303675b0de3e9752605a002960c0604052600360808190527f5a4658000000000000000000000000000000000000000000000000000000000060a090815261003e91600091906100f8565b506040805180820190915260038082527f5a465800000000000000000000000000000000000000000000000000000000006020909201918252610083916001916100f8565b5060028054601260ff19909116179081905560ff16600a0a620f4240026003553480156100af57600080fd5b50604051602080610bae8339810160409081529051600354600160a060020a0390911660009081526005602052919091205560048054600160a060020a03191633179055610193565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061013957805160ff1916838001178555610166565b82800160010185558215610166579182015b8281111561016657825182559160200191906001019061014b565b50610172929150610176565b5090565b61019091905b80821115610172576000815560010161017c565b90565b610a0c806101a26000396000f3006080604052600436106100cf5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100d4578063095ea7b31461015e57806318160ddd1461019657806323b872dd146101bd578063313ce567146101e757806340c10f191461021257806342966c681461023857806370a082311461025057806379cc6790146102715780638da5cb5b1461029557806395d89b41146102c6578063a9059cbb146102db578063cae9ca51146102ff578063dd62ed3e14610368575b600080fd5b3480156100e057600080fd5b506100e961038f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561012357818101518382015260200161010b565b50505050905090810190601f1680156101505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561016a57600080fd5b50610182600160a060020a036004351660243561041d565b604080519115158252519081900360200190f35b3480156101a257600080fd5b506101ab610483565b60408051918252519081900360200190f35b3480156101c957600080fd5b50610182600160a060020a0360043581169060243516604435610489565b3480156101f357600080fd5b506101fc6104f8565b6040805160ff9092168252519081900360200190f35b34801561021e57600080fd5b50610236600160a060020a0360043516602435610501565b005b34801561024457600080fd5b506101826004356105c8565b34801561025c57600080fd5b506101ab600160a060020a0360043516610640565b34801561027d57600080fd5b50610182600160a060020a0360043516602435610652565b3480156102a157600080fd5b506102aa610723565b60408051600160a060020a039092168252519081900360200190f35b3480156102d257600080fd5b506100e9610732565b3480156102e757600080fd5b50610182600160a060020a036004351660243561078c565b34801561030b57600080fd5b50604080516020600460443581810135601f8101849004840285018401909552848452610182948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506107a29650505050505050565b34801561037457600080fd5b506101ab600160a060020a03600435811690602435166108bb565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104155780601f106103ea57610100808354040283529160200191610415565b820191906000526020600020905b8154815290600101906020018083116103f857829003601f168201915b505050505081565b336000818152600660209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60035481565b600160a060020a03831660009081526006602090815260408083203384529091528120548211156104b957600080fd5b600160a060020a03841660009081526006602090815260408083203384529091529020805483900390556104ee8484846108d8565b5060019392505050565b60025460ff1681565b600454600160a060020a0316331461051857600080fd5b600160a060020a03821660009081526005602052604090208054820190556003805482019081905581111561054c57600080fd5b60408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3604080518281529051600160a060020a0384169130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b336000908152600560205260408120548211156105e457600080fd5b3360008181526005602090815260409182902080548690039055600380548690039055815185815291517fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59281900390910190a2506001919050565b60056020526000908152604090205481565b600160a060020a03821660009081526005602052604081205482111561067757600080fd5b600160a060020a03831660009081526006602090815260408083203384529091529020548211156106a757600080fd5b600160a060020a0383166000818152600560209081526040808320805487900390556006825280832033845282529182902080548690039055600380548690039055815185815291517fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59281900390910190a250600192915050565b600454600160a060020a031681565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104155780601f106103ea57610100808354040283529160200191610415565b60006107993384846108d8565b50600192915050565b6000836107af818561041d565b156108b3576040517f8f4ffcb10000000000000000000000000000000000000000000000000000000081523360048201818152602483018790523060448401819052608060648501908152875160848601528751600160a060020a03871695638f4ffcb195948b94938b939192909160a490910190602085019080838360005b8381101561084757818101518382015260200161082f565b50505050905090810190601f1680156108745780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561089657600080fd5b505af11580156108aa573d6000803e3d6000fd5b50505050600191505b509392505050565b600660209081526000928352604080842090915290825290205481565b6000600160a060020a03831615156108ef57600080fd5b600160a060020a03841660009081526005602052604090205482111561091457600080fd5b600160a060020a038316600090815260056020526040902054828101101561093b57600080fd5b50600160a060020a038083166000818152600560209081526040808320805495891680855282852080548981039091559486905281548801909155815187815291519390950194927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3600160a060020a038084166000908152600560205260408082205492871682529020540181146109da57fe5b505050505600a165627a7a723058200ab7dd535cfe883971234c6b54288e056f4a7fbbb0255c97875ed95a71e10dbd0029

Deployed ByteCode

0x6080604052600436106100cf5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663338b5dea81146101e95780633bed33ce1461020f57806345e4146814610227578063514fcac71461024e57806372fc493d14610266578063894cd9b61461027e5780638da5cb5b146102a55780639e281a98146102d6578063abca7290146102fa578063b3fd119314610321578063b88c914814610336578063c37dfc5b14610357578063f2fde38b14610372578063f7888aec14610393575b6000803481106100de57600080fd5b6127106100ea336103ba565b34028115156100f557fe5b04915034821061010457600080fd5b6000805461011c9190600160a060020a03168461050c565b813403905061012d6000338361050c565b60408051828152905133916000917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629181900360200190a3336000818152600080516020611584833981519152602090815260408083205481519081529051600080516020611564833981519152929181900390910190a3604080513381526020810183905260018183015290517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf69181900360600190a15050005b3480156101f557600080fd5b5061020d600160a060020a036004351660243561056d565b005b34801561021b57600080fd5b5061020d6004356106c3565b34801561023357600080fd5b5061020d600160a060020a03600435166024356044356107c5565b34801561025a57600080fd5b5061020d6004356109f7565b34801561027257600080fd5b5061020d600435610bc1565b34801561028a57600080fd5b5061020d600160a060020a0360043516602435604435610bea565b3480156102b157600080fd5b506102ba610df4565b60408051600160a060020a039092168252519081900360200190f35b3480156102e257600080fd5b5061020d600160a060020a0360043516602435610e03565b34801561030657600080fd5b5061030f610f52565b60408051918252519081900360200190f35b34801561032d57600080fd5b506102ba610f58565b34801561034257600080fd5b5061030f600160a060020a03600435166103ba565b34801561036357600080fd5b5061020d600435602435610f67565b34801561037e57600080fd5b5061020d600160a060020a036004351661139a565b34801561039f57600080fd5b5061030f600160a060020a03600435811690602435166113e0565b60048054604080517f18160ddd00000000000000000000000000000000000000000000000000000000815290516000938493600160a060020a0316926318160ddd928183019260209282900301818787803b15801561041857600080fd5b505af115801561042c573d6000803e3d6000fd5b505050506040513d602081101561044257600080fd5b505160048054604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a0388811694820194909452905192909116916370a08231916024808201926020929091908290030181600087803b1580156104b057600080fd5b505af11580156104c4573d6000803e3d6000fd5b505050506040513d60208110156104da57600080fd5b505160015402600a028115156104ec57fe5b04905060015481106104ff576000610505565b80600154035b9392505050565b600160a060020a0380841660009081526005602090815260408083209386168352929052205461053c90826113fd565b600160a060020a03938416600090815260056020908152604080832095909616825293909352929091209190915550565b600160a060020a038216151561058257600080fd5b6000811161058f57600080fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390529051600160a060020a038416916323b872dd9160648083019260209291908290030181600087803b1580156105fd57600080fd5b505af1158015610611573d6000803e3d6000fd5b505050506040513d602081101561062757600080fd5b50610635905082338361050c565b6040805182815290513391600160a060020a038516917f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629181900360200190a3600160a060020a038216600081815260056020908152604080832033808552908352928190205481519081529051929392600080516020611564833981519152929181900390910190a35050565b600081116106d057600080fd5b6106dc60003383611417565b604051339082156108fc029083906000818181858888f19350505050158015610709573d6000803e3d6000fd5b5060408051828152905133916000917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9181900360200190a3336000818152600080516020611584833981519152602090815260408083205481519081529051600080516020611564833981519152929181900390910190a3604080513381526020810183905260008183015290517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf69181900360600190a150565b600080831180156107d65750600082115b15156107e157600080fd5b6107ec848484611479565b9050600081116107fb57600080fd5b610806843384611417565b600160a060020a038416600081815260056020908152604080832033808552908352928190205481519081529051929392600080516020611564833981519152929181900390910190a36040805160a08101825233808252600160a060020a038781166020808501828152600086880181815260608089018d815260808a018d81526003805486526002808952958d90209b518c54908b1673ffffffffffffffffffffffffffffffffffffffff19918216178d55965160018d01805496511515740100000000000000000000000000000000000000000274ff00000000000000000000000000000000000000001992909c1696909816959095179490941698909817909455925191880191909155935195840195909555915485518981529283018890528286015293519193927fd38bee561968b61a4625e513f46de6793b0ca76a5dad1ffbf139f617093c26b892918290030190a360038054600101905560048054604080517f40c10f190000000000000000000000000000000000000000000000000000000081523393810193909352670de0b6b3a7640000602484015251600160a060020a03909116916340c10f1991604480830192600092919082900301818387803b1580156109d957600080fd5b505af11580156109ed573d6000803e3d6000fd5b5050505050505050565b6003546000908210610a0857600080fd5b600082815260026020526040902054600160a060020a03163314610a2b57600080fd5b60008281526002602052604081206003015411610a4757600080fd5b60008281526002602052604090206001015474010000000000000000000000000000000000000000900460ff1615610b00576000828152600260208190526040909120600181015491810154600390910154610aad92600160a060020a03169190611479565b9050610abb6000338361050c565b336000818152600080516020611584833981519152602090815260408083205481519081529051600080516020611564833981519152929181900390910190a3610b82565b60008281526002602052604090206001810154600390910154610b2e91600160a060020a031690339061050c565b600082815260026020908152604080832060010154600160a060020a031680845260058352818420338086529084529382902054825190815291519092600080516020611564833981519152928290030190a35b6000828152600260205260408082206003018290555183917f935c9ad2f1fda9d7eae0d2a512f1521cb7190ee06165414e722366a65975fb6b91a25050565b600054600160a060020a03163314610bd857600080fd5b610be460015482611526565b60015550565b60008083118015610bfb5750600082115b1515610c0657600080fd5b610c11848484611479565b905060008111610c2057600080fd5b610c2c60003383611417565b336000818152600080516020611584833981519152602090815260408083205481519081529051600080516020611564833981519152929181900390910190a36040805160a08101825233808252600160a060020a038781166020808501828152600186880181815260608089018d815260808a018d81526003805460009081526002808a52908e90209c518d54908c1673ffffffffffffffffffffffffffffffffffffffff19918216178e559751968d01805496511515740100000000000000000000000000000000000000000274ff00000000000000000000000000000000000000001998909c1696909816959095179590951698909817909455925190880155935195840195909555915485518981529283018890528286015293519193927f66eba165e49ff13d84ca1cfbda4927231bac30ae16c9b1f769ecc6a2a9518a7a92918290030190a360038054600101905560048054604080517f40c10f190000000000000000000000000000000000000000000000000000000081523393810193909352670de0b6b3a7640000602484015251600160a060020a03909116916340c10f1991604480830192600092919082900301818387803b1580156109d957600080fd5b600054600160a060020a031681565b600160a060020a0382161515610e1857600080fd5b60008111610e2557600080fd5b610e30823383611417565b604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051600160a060020a0384169163a9059cbb9160448083019260209291908290030181600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b505050506040513d6020811015610ec257600080fd5b50506040805182815290513391600160a060020a038516917f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb9181900360200190a3600160a060020a038216600081815260056020908152604080832033808552908352928190205481519081529051929392600080516020611564833981519152929181900390910190a35050565b60015481565b600454600160a060020a031681565b6003546000908310610f7857600080fd5b60008211610f8557600080fd5b600083815260026020526040902054600160a060020a0316331415610fa957600080fd5b600083815260026020526040902060030154821115610fc757600080fd5b60008381526002602081905260409091206001810154910154610ff491600160a060020a03169084611479565b60008481526002602052604090206001015490915074010000000000000000000000000000000000000000900460ff161561117b5760008381526002602052604090206001015461104f90600160a060020a03163384611417565b600083815260026020908152604080832060010154600160a060020a031680845260058352818420338086529084529382902054825190815291519092600080516020611564833981519152928290030190a36000838152600260205260409020600181015490546110ce91600160a060020a0390811691168461050c565b60008381526002602090815260408083208054600190910154600160a060020a0390811680865260058552838620919092168086529084529382902054825190815291519092600080516020611564833981519152928290030190a36111366000338361050c565b336000818152600080516020611584833981519152602090815260408083205481519081529051600080516020611564833981519152929181900390910190a36112b7565b61118760003383611417565b336000818152600080516020611584833981519152602090815260408083205481519081529051600080516020611564833981519152929181900390910190a36000838152600260205260408120546111ea9190600160a060020a03168361050c565b600083815260026020908152604080832054600160a060020a031680845260008051602061158483398151915283528184205482519081529151909392600080516020611564833981519152928290030190a360008381526002602052604090206001015461126390600160a060020a0316338461050c565b600083815260026020908152604080832060010154600160a060020a031680845260058352818420338086529084529382902054825190815291519092600080516020611564833981519152928290030190a35b60008381526002602090815260409182902060030180548590039081905582519081529151339286927faa2d5c051098b55cf71a58aeae7141cdc811975799a3d6fc8464f091a14c40d292918290030190a360048054604080517f40c10f190000000000000000000000000000000000000000000000000000000081523393810193909352670de0b6b3a7640000602484015251600160a060020a03909116916340c10f1991604480830192600092919082900301818387803b15801561137d57600080fd5b505af1158015611391573d6000803e3d6000fd5b50505050505050565b600054600160a060020a031633146113b157600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600560209081526000928352604080842090915290825290205481565b60008282018381101561140c57fe5b8091505b5092915050565b600160a060020a0380841660009081526005602090815260408083209386168352929052205481111561144957600080fd5b600160a060020a0380841660009081526005602090815260408083209386168352929052205461053c9082611526565b600080600a905084600160a060020a031663313ce5676040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156114d757600080fd5b505af11580156114eb573d6000803e3d6000fd5b505050506040513d602081101561150157600080fd5b505160ff16900a806115138486611538565b81151561151c57fe5b0495945050505050565b60008282111561153257fe5b50900390565b60008083151561154b5760009150611410565b5082820282848281151561155b57fe5b041461140c57fe007a350141a4375888264971fc98bdf535c1843ad8a215baaede8397fb56404ab305b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bca165627a7a72305820a781bbe406b17dec32089264cc51bd38e1b56e3164bd303675b0de3e9752605a0029