ETH Price: $2,152.10 (+5.34%)

Contract

0xaE75677Bd7317Cc46262eDD7052801dB7e2FA55D
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw With Fe...72827662019-03-01 8:06:302580 days ago1551427590IN
0xaE75677B...B7e2FA55D
0 ETH0.002107966.72
Do Deposit72827602019-03-01 8:05:532580 days ago1551427553IN
0xaE75677B...B7e2FA55D
0 ETH0.0005498811.5
Create Deposit C...72827572019-03-01 8:04:382580 days ago1551427478IN
0xaE75677B...B7e2FA55D
0 ETH0.0146428811.5
Withdraw With Fe...72827042019-03-01 7:50:422580 days ago1551426642IN
0xaE75677B...B7e2FA55D
0 ETH0.000648153.36
Withdraw With Fe...72826802019-03-01 7:44:112580 days ago1551426251IN
0xaE75677B...B7e2FA55D
0 ETH0.001117255.6
Withdraw With Fe...72824072019-03-01 6:40:202580 days ago1551422420IN
0xaE75677B...B7e2FA55D
0 ETH0.001062375.6
Do Deposit70101112019-01-04 17:51:282635 days ago1546624288IN
0xaE75677B...B7e2FA55D
0 ETH0.000054141.65
Do Deposit70052772019-01-03 20:48:292636 days ago1546548509IN
0xaE75677B...B7e2FA55D
0 ETH0.000072192.2
Do Deposit69675042018-12-28 10:33:012642 days ago1545993181IN
0xaE75677B...B7e2FA55D
0 ETH0.000161464.93
Do Deposit69597492018-12-27 3:01:452644 days ago1545879705IN
0xaE75677B...B7e2FA55D
0 ETH0.00029318.96
Withdraw With Fe...67147792018-11-16 10:55:452684 days ago1542365745IN
0xaE75677B...B7e2FA55D
0 ETH0.0022183911.5
Withdraw With Fe...67142662018-11-16 8:57:082685 days ago1542358628IN
0xaE75677B...B7e2FA55D
0 ETH0.0036580910.64
Do Deposit67142582018-11-16 8:55:082685 days ago1542358508IN
0xaE75677B...B7e2FA55D
0 ETH0.0004848510.14
Create Deposit C...67142542018-11-16 8:54:192685 days ago1542358459IN
0xaE75677B...B7e2FA55D
0 ETH0.012911210.14
Withdraw With Fe...67142302018-11-16 8:50:032685 days ago1542358203IN
0xaE75677B...B7e2FA55D
0 ETH0.0030280110.14
Do Deposit67136942018-11-16 6:43:422685 days ago1542350622IN
0xaE75677B...B7e2FA55D
0 ETH0.00034817.28
Create Deposit C...67136912018-11-16 6:43:092685 days ago1542350589IN
0xaE75677B...B7e2FA55D
0 ETH0.008027896.16
Bind Contract67090602018-11-15 12:41:502685 days ago1542285710IN
0xaE75677B...B7e2FA55D
0 ETH0.0005357311.5
Initialize67090562018-11-15 12:41:162685 days ago1542285676IN
0xaE75677B...B7e2FA55D
0 ETH0.0010079711.5

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
-72827572019-03-01 8:04:382580 days ago1551427478
0xaE75677B...B7e2FA55D
 Contract Creation0 ETH
Transfer67142542018-11-16 8:54:192685 days ago1542358459
0xaE75677B...B7e2FA55D
 Contract Creation0 ETH
Transfer67136912018-11-16 6:43:092685 days ago1542350589
0xaE75677B...B7e2FA55D
 Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DRCWalletManager

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2018-11-15
*/

pragma solidity ^0.4.24;

interface IDRCWalletMgrParams {
    function singleWithdrawMin() external returns (uint256); // min value of single withdraw
    function singleWithdrawMax() external returns (uint256); // Max value of single withdraw
    function dayWithdraw() external returns (uint256); // Max value of one day of withdraw
    function monthWithdraw() external returns (uint256); // Max value of one month of withdraw
    function dayWithdrawCount() external returns (uint256); // Max number of withdraw counting

    function chargeFee() external returns (uint256); // the charge fee for withdraw
    function chargeFeePool() external returns (address); // the address that will get the returned charge fees.
}

interface IDRCWalletStorage {
    // get the deposit address for this _wallet address
    function walletDeposits(address _wallet) external view returns (address);

    // get frozen status for the deposit address
    function frozenDeposits(address _deposit) external view returns (bool);

    // get a wallet address by the deposit address and the index
    function wallet(address _deposit, uint256 _ind) external view returns (address);

    // get a wallet name by the deposit address and the index
    function walletName(address _deposit, uint256 _ind) external view returns (bytes32);

    // get the wallets number of a deposit address
    function walletsNumber(address _deposit) external view returns (uint256);

    // get the frozen amount of the deposit address
    function frozenAmount(address _deposit) external view returns (uint256);

    // get the balance of the deposit address
    function balanceOf(address _deposit) external view returns (uint256);

    // get the deposit address by index
    function depositAddressByIndex(uint256 _ind) external view returns (address);

    // get the frozen amount of the deposit address
    function size() external view returns (uint256);

    // judge if the _deposit address exsisted.
    function isExisted(address _deposit) external view returns (bool);

    // add one deposit address for that wallet
    function addDeposit(address _wallet, address _depositAddr) external returns (bool);

    // change the default wallet address for the deposit address
    function changeDefaultWallet(address _oldWallet, address _newWallet) external returns (bool);

    // freeze or release the tokens that has been deposited in the deposit address.
    function freezeTokens(address _deposit, bool _freeze, uint256 _value) external returns (bool);

    // increase balance of this deposit address
    function increaseBalance(address _deposit, uint256 _value) external returns (bool);

    // decrease balance of this deposit address
    function decreaseBalance(address _deposit, uint256 _value) external returns (bool);

    // add withdraw address for one deposit addresss
    function addWithdraw(address _deposit, bytes32 _name, address _withdraw) external returns (bool);

    // change the withdraw wallet name
    function changeWalletName(address _deposit, bytes32 _newName, address _wallet) external returns (bool);

    // remove deposit contract address from storage
    function removeDeposit(address _depositAddr) external returns (bool);

    // withdraw tokens from this contract
    function withdrawToken(address _token, address _to, uint256 _value) external returns (bool);
}

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    c = _a * _b;
    assert(c / _a == _b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // assert(_b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
    return _a / _b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    assert(_b <= _a);
    return _a - _b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    c = _a + _b;
    assert(c >= _a);
    return c;
  }
}

contract Ownable {
  address public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

contract Withdrawable is Ownable {
    event ReceiveEther(address _from, uint256 _value);
    event WithdrawEther(address _to, uint256 _value);
    event WithdrawToken(address _token, address _to, uint256 _value);

    /**
         * @dev recording receiving ether from msn.sender
         */
    function () payable public {
        emit ReceiveEther(msg.sender, msg.value);
    }

    /**
         * @dev withdraw,send ether to target
         * @param _to is where the ether will be sent to
         *        _amount is the number of the ether
         */
    function withdraw(address _to, uint _amount) public onlyOwner returns (bool) {
        require(_to != address(0));
        _to.transfer(_amount);
        emit WithdrawEther(_to, _amount);

        return true;
    }

    /**
         * @dev withdraw tokens, send tokens to target
     *
     * @param _token the token address that will be withdraw
         * @param _to is where the tokens will be sent to
         *        _value is the number of the token
         */
    function withdrawToken(address _token, address _to, uint256 _value) public onlyOwner returns (bool) {
        require(_to != address(0));
        require(_token != address(0));

        ERC20 tk = ERC20(_token);
        tk.transfer(_to, _value);
        emit WithdrawToken(_token, _to, _value);

        return true;
    }

    /**
     * @dev receive approval from an ERC20 token contract, and then gain the tokens,
     *      then take a record
     *
     * @param _from address The address which you want to send tokens from
     * @param _value uint256 the amounts of tokens to be sent
     * @param _token address the ERC20 token address
     * @param _extraData bytes the extra data for the record
     */
    // function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public {
    //     require(_token != address(0));
    //     require(_from != address(0));

    //     ERC20 tk = ERC20(_token);
    //     require(tk.transferFrom(_from, this, _value));

    //     emit ReceiveDeposit(_from, _value, _token, _extraData);
    // }
}

contract TokenDestructible is Ownable {

  constructor() public payable { }

  /**
   * @notice Terminate contract and refund to owner
   * @param _tokens List of addresses of ERC20 or ERC20Basic token contracts to
   refund.
   * @notice The called token contracts could try to re-enter this contract. Only
   supply token contracts you trust.
   */
  function destroy(address[] _tokens) public onlyOwner {

    // Transfer tokens to owner
    for (uint256 i = 0; i < _tokens.length; i++) {
      ERC20Basic token = ERC20Basic(_tokens[i]);
      uint256 balance = token.balanceOf(this);
      token.transfer(owner, balance);
    }

    // Transfer Eth to owner and terminate contract
    selfdestruct(owner);
  }
}

contract Claimable is Ownable {
  address public pendingOwner;

  /**
   * @dev Modifier throws if called by any account other than the pendingOwner.
   */
  modifier onlyPendingOwner() {
    require(msg.sender == pendingOwner);
    _;
  }

  /**
   * @dev Allows the current owner to set the pendingOwner address.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    pendingOwner = newOwner;
  }

  /**
   * @dev Allows the pendingOwner address to finalize the transfer.
   */
  function claimOwnership() public onlyPendingOwner {
    emit OwnershipTransferred(owner, pendingOwner);
    owner = pendingOwner;
    pendingOwner = address(0);
  }
}

contract DepositWithdraw is Claimable, Withdrawable, TokenDestructible {
    using SafeMath for uint256;

    /**
     * transaction record
     */
    struct TransferRecord {
        uint256 timeStamp;
        address account;
        uint256 value;
    }

    /**
     * accumulated transferring amount record
     */
    struct accumulatedRecord {
        uint256 mul;
        uint256 count;
        uint256 value;
    }

    TransferRecord[] deposRecs; // record all the deposit tx data
    TransferRecord[] withdrRecs; // record all the withdraw tx data

    accumulatedRecord dayWithdrawRec; // accumulated amount record for one day
    accumulatedRecord monthWithdrawRec; // accumulated amount record for one month

    address wallet; // the binded withdraw address

    event ReceiveDeposit(address _from, uint256 _value, address _token, bytes _extraData);

    /**
     * @dev constructor of the DepositWithdraw contract
     * @param _wallet the binded wallet address to this depositwithdraw contract
     */
    constructor(address _wallet) public {
        require(_wallet != address(0));
        wallet = _wallet;
    }

    /**
         * @dev set the default wallet address
         * @param _wallet the default wallet address binded to this deposit contract
         */
    function setWithdrawWallet(address _wallet) onlyOwner public returns (bool) {
        require(_wallet != address(0));
        wallet = _wallet;

        return true;
    }

    /**
         * @dev util function to change bytes data to bytes32 data
         * @param _data the bytes data to be converted
         */
    function bytesToBytes32(bytes _data) public pure returns (bytes32 result) {
        assembly {
            result := mload(add(_data, 32))
        }
    }

    /**
     * @dev receive approval from an ERC20 token contract, take a record
     *
     * @param _from address The address which you want to send tokens from
     * @param _value uint256 the amounts of tokens to be sent
     * @param _token address the ERC20 token address
     * @param _extraData bytes the extra data for the record
     */
    function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) onlyOwner public {
        require(_token != address(0));
        require(_from != address(0));

        ERC20 tk = ERC20(_token);
        require(tk.transferFrom(_from, this, _value));
        bytes32 timestamp = bytesToBytes32(_extraData);
        deposRecs.push(TransferRecord(uint256(timestamp), _from, _value));
        emit ReceiveDeposit(_from, _value, _token, _extraData);
    }

    // function authorize(address _token, address _spender, uint256 _value) onlyOwner public returns (bool) {
    //     ERC20 tk = ERC20(_token);
    //     require(tk.approve(_spender, _value));

    //     return true;
    // }

    /**
     * @dev record withdraw into this contract
     *
     * @param _time the timstamp of the withdraw time
     * @param _to is where the tokens will be sent to
     * @param _value is the number of the token
     */
    function recordWithdraw(uint256 _time, address _to, uint256 _value) onlyOwner public {
        withdrRecs.push(TransferRecord(_time, _to, _value));
    }

    /**
     * @dev check if withdraw amount is not valid
     *
     * @param _params the limitation parameters for withdraw
     * @param _value is the number of the token
     * @param _time the timstamp of the withdraw time
     */
    function checkWithdrawAmount(address _params, uint256 _value, uint256 _time) public returns (bool) {
        IDRCWalletMgrParams params = IDRCWalletMgrParams(_params);
        require(_value <= params.singleWithdrawMax());
        require(_value >= params.singleWithdrawMin());

        uint256 daysCount = _time.div(86400); // one day of seconds
        if (daysCount <= dayWithdrawRec.mul) {
            dayWithdrawRec.count = dayWithdrawRec.count.add(1);
            dayWithdrawRec.value = dayWithdrawRec.value.add(_value);
            require(dayWithdrawRec.count <= params.dayWithdrawCount());
            require(dayWithdrawRec.value <= params.dayWithdraw());
        } else {
            dayWithdrawRec.mul = daysCount;
            dayWithdrawRec.count = 1;
            dayWithdrawRec.value = _value;
        }

        uint256 monthsCount = _time.div(86400 * 30);
        if (monthsCount <= monthWithdrawRec.mul) {
            monthWithdrawRec.count = monthWithdrawRec.count.add(1);
            monthWithdrawRec.value = monthWithdrawRec.value.add(_value);
            require(monthWithdrawRec.value <= params.monthWithdraw());
        } else {
            monthWithdrawRec.mul = monthsCount;
            monthWithdrawRec.count = 1;
            monthWithdrawRec.value = _value;
        }

        return true;
    }

    /**
         * @dev withdraw tokens, send tokens to target
     *
     * @param _token the token address that will be withdraw
     * @param _params the limitation parameters for withdraw
     * @param _time the timstamp of the withdraw time
         * @param _to is where the tokens will be sent to
         *        _value is the number of the token
     *        _fee is the amount of the transferring costs
     *        _tokenReturn is the address that return back the tokens of the _fee
         */
    function withdrawToken(address _token, address _params, uint256 _time, address _to, uint256 _value, uint256 _fee, address _tokenReturn) public onlyOwner returns (bool) {
        require(_to != address(0));
        require(_token != address(0));
        require(_value > _fee);
        // require(_tokenReturn != address(0));

        require(checkWithdrawAmount(_params, _value, _time));

        ERC20 tk = ERC20(_token);
        uint256 realAmount = _value.sub(_fee);
        require(tk.transfer(_to, realAmount));
        if (_tokenReturn != address(0) && _fee > 0) {
            require(tk.transfer(_tokenReturn, _fee));
        }

        recordWithdraw(_time, _to, realAmount);
        emit WithdrawToken(_token, _to, realAmount);

        return true;
    }

    /**
         * @dev withdraw tokens, send tokens to target default wallet
     *
     * @param _token the token address that will be withdraw
     * @param _params the limitation parameters for withdraw
     * @param _time the timestamp occur the withdraw record
         * @param _value is the number of the token
     *        _fee is the amount of the transferring costs
     *        —tokenReturn is the address that return back the tokens of the _fee
         */
    function withdrawTokenToDefault(address _token, address _params, uint256 _time, uint256 _value, uint256 _fee, address _tokenReturn) public onlyOwner returns (bool) {
        return withdrawToken(_token, _params, _time, wallet, _value, _fee, _tokenReturn);
    }

    /**
         * @dev get the Deposit records number
     *
     */
    function getDepositNum() public view returns (uint256) {
        return deposRecs.length;
    }

    /**
         * @dev get the one of the Deposit records
     *
     * @param _ind the deposit record index
     */
    function getOneDepositRec(uint256 _ind) public view returns (uint256, address, uint256) {
        require(_ind < deposRecs.length);

        return (deposRecs[_ind].timeStamp, deposRecs[_ind].account, deposRecs[_ind].value);
    }

    /**
         * @dev get the withdraw records number
     *
     */
    function getWithdrawNum() public view returns (uint256) {
        return withdrRecs.length;
    }

    /**
         * @dev get the one of the withdraw records
     *
     * @param _ind the withdraw record index
     */
    function getOneWithdrawRec(uint256 _ind) public view returns (uint256, address, uint256) {
        require(_ind < withdrRecs.length);

        return (withdrRecs[_ind].timeStamp, withdrRecs[_ind].account, withdrRecs[_ind].value);
    }
}

contract DelayedClaimable is Claimable {

  uint256 public end;
  uint256 public start;

  /**
   * @dev Used to specify the time period during which a pending
   * owner can claim ownership.
   * @param _start The earliest time ownership can be claimed.
   * @param _end The latest time ownership can be claimed.
   */
  function setLimits(uint256 _start, uint256 _end) public onlyOwner {
    require(_start <= _end);
    end = _end;
    start = _start;
  }

  /**
   * @dev Allows the pendingOwner address to finalize the transfer, as long as it is called within
   * the specified start and end time.
   */
  function claimOwnership() public onlyPendingOwner {
    require((block.number <= end) && (block.number >= start));
    emit OwnershipTransferred(owner, pendingOwner);
    owner = pendingOwner;
    pendingOwner = address(0);
    end = 0;
  }

}

contract OwnerContract is DelayedClaimable {
    Claimable public ownedContract;
    address public pendingOwnedOwner;
    // address internal origOwner;

    /**
     * @dev bind a contract as its owner
     *
     * @param _contract the contract address that will be binded by this Owner Contract
     */
    function bindContract(address _contract) onlyOwner public returns (bool) {
        require(_contract != address(0));
        ownedContract = Claimable(_contract);
        // origOwner = ownedContract.owner();

        // take ownership of the owned contract
        if (ownedContract.owner() != address(this)) {
            ownedContract.claimOwnership();
        }

        return true;
    }

    /**
     * @dev change the owner of the contract from this contract address to the original one.
     *
     */
    // function transferOwnershipBack() onlyOwner public {
    //     ownedContract.transferOwnership(origOwner);
    //     ownedContract = Claimable(address(0));
    //     origOwner = address(0);
    // }

    /**
     * @dev change the owner of the contract from this contract address to another one.
     *
     * @param _nextOwner the contract address that will be next Owner of the original Contract
     */
    function changeOwnershipto(address _nextOwner)  onlyOwner public {
        require(ownedContract != address(0));

        if (ownedContract.owner() != pendingOwnedOwner) {
            ownedContract.transferOwnership(_nextOwner);
            pendingOwnedOwner = _nextOwner;
            // ownedContract = Claimable(address(0));
            // origOwner = address(0);
        } else {
            // the pending owner has already taken the ownership
            ownedContract = Claimable(address(0));
            pendingOwnedOwner = address(0);
        }
    }

    /**
     * @dev to confirm the owner of the owned contract has already been transferred.
     *
     */
    function ownedOwnershipTransferred() onlyOwner public returns (bool) {
        require(ownedContract != address(0));
        if (ownedContract.owner() == pendingOwnedOwner) {
            // the pending owner has already taken the ownership
            ownedContract = Claimable(address(0));
            pendingOwnedOwner = address(0);
            return true;
        } else {
            return false;
        }
    }
}

contract DRCWalletManager is OwnerContract, Withdrawable, TokenDestructible {
    using SafeMath for uint256;

    /**
     * withdraw wallet description
     */
    // struct WithdrawWallet {
    //     bytes32 name;
    //     address walletAddr;
    // }

    /**
     * Deposit data storage
     */
    // struct DepositRepository {
    //     // uint256 balance;
    //     uint256 frozen;
    //     WithdrawWallet[] withdrawWallets;
    //     // mapping (bytes32 => address) withdrawWallets;
    // }

    // mapping (address => DepositRepository) depositRepos;
    // mapping (address => address) public walletDeposits;
    // mapping (address => bool) public frozenDeposits;

    ERC20 public tk; // the token will be managed
    IDRCWalletMgrParams public params; // the parameters that the management needs
    IDRCWalletStorage public walletStorage; // the deposits and wallets data stored in a contract

    event CreateDepositAddress(address indexed _wallet, address _deposit);
    event FrozenTokens(address indexed _deposit, bool _freeze, uint256 _value);
    event ChangeDefaultWallet(address indexed _oldWallet, address _newWallet);

    /**
         * @dev initialize this contract with token, parameters and storage address
     *
     * @param _token the token address that will be withdraw
     * @param _walletParams the wallet management parameters
         */
    function initialize(address _token, address _walletParams, address _walletStorage) onlyOwner public returns (bool) {
        require(_token != address(0));
        require(_walletParams != address(0));

        tk = ERC20(_token);
        params = IDRCWalletMgrParams(_walletParams);
        walletStorage = IDRCWalletStorage(_walletStorage);

        return true;
    }

    /**
         * @dev create deposit contract address for the default withdraw wallet
     *
     * @param _wallet the binded default withdraw wallet address
         */
    function createDepositContract(address _wallet) onlyOwner public returns (address) {
        require(_wallet != address(0));

        DepositWithdraw deposWithdr = new DepositWithdraw(_wallet); // new contract for deposit
        address _deposit = address(deposWithdr);
        // walletDeposits[_wallet] = _deposit;
        // WithdrawWallet[] storage withdrawWalletList = depositRepos[_deposit].withdrawWallets;
        // withdrawWalletList.push(WithdrawWallet("default wallet", _wallet));
        // // depositRepos[_deposit].balance = 0;
        // depositRepos[_deposit].frozen = 0;

        walletStorage.addDeposit(_wallet, _deposit);

        // deposWithdr.authorize(address(tk), this, 1e27); // give authorization to owner contract

        emit CreateDepositAddress(_wallet, _deposit);
        return _deposit;
    }

    /**
         * @dev deposit a value of funds to the deposit address
     *
     * @param _deposit the deposit address
     * @param _increase increase or decrease the value
     * @param _value the deposit funds value
         */
    function doDeposit(address _deposit, bool _increase, uint256 _value) onlyOwner public returns (bool) {
        return (_increase
                ? walletStorage.increaseBalance(_deposit, _value)
                : walletStorage.decreaseBalance(_deposit, _value));
    }

    /**
         * @dev get deposit contract address by using the default withdraw wallet
     *
     * @param _wallet the binded default withdraw wallet address
         */
    function getDepositAddress(address _wallet) onlyOwner public view returns (address) {
        require(_wallet != address(0));
        // address deposit = walletDeposits[_wallet];

        // return deposit;
        return walletStorage.walletDeposits(_wallet);
    }

    /**
         * @dev get deposit balance and frozen amount by using the deposit address
     *
     * @param _deposit the deposit contract address
         */
    function getDepositInfo(address _deposit) onlyOwner public view returns (uint256, uint256) {
        require(_deposit != address(0));
        uint256 _balance = walletStorage.balanceOf(_deposit);
        // uint256 frozenAmount = depositRepos[_deposit].frozen;
        uint256 frozenAmount = walletStorage.frozenAmount(_deposit);
        // depositRepos[_deposit].balance = _balance;

        return (_balance, frozenAmount);
    }

    /**
         * @dev get the number of withdraw wallet addresses bindig to the deposit contract address
     *
     * @param _deposit the deposit contract address
         */
    function getDepositWithdrawCount(address _deposit) onlyOwner public view returns (uint) {
        require(_deposit != address(0));

        // WithdrawWallet[] storage withdrawWalletList = depositRepos[_deposit].withdrawWallets;
        // uint len = withdrawWalletList.length;
        uint len = walletStorage.walletsNumber(_deposit);

        return len;
    }

    /**
         * @dev get the withdraw wallet addresses list binding to the deposit contract address
     *
     * @param _deposit the deposit contract address
     * @param _indices the array of indices of the withdraw wallets
         */
    function getDepositWithdrawList(address _deposit, uint[] _indices) onlyOwner public view returns (bytes32[], address[]) {
        require(_indices.length != 0);

        bytes32[] memory names = new bytes32[](_indices.length);
        address[] memory wallets = new address[](_indices.length);

        for (uint i = 0; i < _indices.length; i = i.add(1)) {
            // WithdrawWallet storage wallet = depositRepos[_deposit].withdrawWallets[_indices[i]];
            // names[i] = wallet.name;
            // wallets[i] = wallet.walletAddr;
            names[i] = walletStorage.walletName(_deposit, i);
            wallets[i] = walletStorage.wallet(_deposit, i);
        }

        return (names, wallets);
    }

    /**
         * @dev change the default withdraw wallet address binding to the deposit contract address
     *
     * @param _oldWallet the previous default withdraw wallet
     * @param _newWallet the new default withdraw wallet
         */
    function changeDefaultWithdraw(address _oldWallet, address _newWallet) onlyOwner public returns (bool) {
        require(_oldWallet != address(0));
        require(_newWallet != address(0));

        address deposit = walletStorage.walletDeposits(_oldWallet);
        DepositWithdraw deposWithdr = DepositWithdraw(deposit);
        require(deposWithdr.setWithdrawWallet(_newWallet));

        // WithdrawWallet[] storage withdrawWalletList = depositRepos[deposit].withdrawWallets;
        // withdrawWalletList[0].walletAddr = _newWallet;
        bool res = walletStorage.changeDefaultWallet(_oldWallet, _newWallet);
        emit ChangeDefaultWallet(_oldWallet, _newWallet);

        return res;
    }

    /**
         * @dev freeze the tokens in the deposit address
     *
     * @param _deposit the deposit address
     * @param _freeze to freeze or release
     * @param _value the amount of tokens need to be frozen
         */
    function freezeTokens(address _deposit, bool _freeze, uint256 _value) onlyOwner public returns (bool) {
        // require(_deposit != address(0));

        // frozenDeposits[_deposit] = _freeze;
        // if (_freeze) {
        //     depositRepos[_deposit].frozen = depositRepos[_deposit].frozen.add(_value);
        // } else {
        //     require(_value <= depositRepos[_deposit].frozen);
        //     depositRepos[_deposit].frozen = depositRepos[_deposit].frozen.sub(_value);
        // }

        bool res = walletStorage.freezeTokens(_deposit, _freeze, _value);

        emit FrozenTokens(_deposit, _freeze, _value);
        return res;
    }

    /**
         * @dev withdraw the tokens from the deposit address to default wallet with charge fee
     *
     * @param _deposit the deposit address
     * @param _time the timestamp the withdraw occurs
     * @param _value the amount of tokens need to be frozen
     * @param _check if we will check the value is valid or meet the limit condition
         */
    function withdrawWithFee(address _deposit, uint256 _time, uint256 _value, bool _check) onlyOwner public returns (bool) {
        // WithdrawWallet[] storage withdrawWalletList = depositRepos[_deposit].withdrawWallets;
        // return withdrawWithFee(_deposit, _time, withdrawWalletList[0].name, withdrawWalletList[0].walletAddr, _value, _check);
        bytes32 defaultWalletName = walletStorage.walletName(_deposit, 0);
        address defaultWallet = walletStorage.wallet(_deposit, 0);
        return withdrawWithFee(_deposit, _time, defaultWalletName, defaultWallet, _value, _check);
    }

    /**
         * @dev check if the wallet name is not matching the expected wallet address
     *
     * @param _deposit the deposit address
     * @param _name the withdraw wallet name
     * @param _to the withdraw wallet address
         */
    function checkWithdrawAddress(address _deposit, bytes32 _name, address _to) public view returns (bool, bool) {
        // uint len = depositRepos[_deposit].withdrawWallets.length;
        uint len = walletStorage.walletsNumber(_deposit);
        for (uint i = 0; i < len; i = i.add(1)) {
            // WithdrawWallet memory wallet = depositRepos[_deposit].withdrawWallets[i];
            // if (_name == wallet.name) {
            //     return(true, (_to == wallet.walletAddr));
            // }
            // if (_to == wallet.walletAddr) {
            //     return(true, true);
            // }
            bytes32 walletName = walletStorage.walletName(_deposit, i);
            address walletAddr = walletStorage.wallet(_deposit, i);
            if (_name == walletName) {
                return(true, (_to == walletAddr));
            }
            if (_to == walletAddr) {
                return(false, true);
            }
        }

        return (false, false);
    }

    /**
         * @dev withdraw tokens from this contract, send tokens to target withdraw wallet
     *
     * @param _deposWithdr the deposit contract that will record withdrawing
     * @param _time the timestamp occur the withdraw record
     * @param _to the address the token will be transfer to
     * @param _value the token transferred value
         */
    function withdrawFromThis(DepositWithdraw _deposWithdr, uint256 _time, address _to, uint256 _value) private returns (bool) {
        uint256 fee = params.chargeFee();
        uint256 realAmount = _value.sub(fee);
        address tokenReturn = params.chargeFeePool();
        if (tokenReturn != address(0) && fee > 0) {
            // require(tk.transfer(tokenReturn, fee));
            require(walletStorage.withdrawToken(tk, tokenReturn, fee));
        }

        // require (tk.transfer(_to, realAmount));
        require(walletStorage.withdrawToken(tk, _to, realAmount));
        _deposWithdr.recordWithdraw(_time, _to, realAmount);

        return true;
    }

    /**
         * @dev withdraw tokens, send tokens to target withdraw wallet
     *
     * @param _deposit the deposit address that will be withdraw from
     * @param _time the timestamp occur the withdraw record
         * @param _name the withdraw address alias name to verify
     * @param _to the address the token will be transfer to
     * @param _value the token transferred value
     * @param _check if we will check the value is valid or meet the limit condition
         */
    function withdrawWithFee(address _deposit,
                             uint256 _time,
                             bytes32 _name,
                             address _to,
                             uint256 _value,
                             bool _check) onlyOwner public returns (bool) {
        require(_deposit != address(0));
        require(_to != address(0));

        uint256 totalBalance = walletStorage.balanceOf(_deposit);
        uint256 frozen = walletStorage.frozenAmount(_deposit);
        // uint256 available = totalBalance.sub(frozen);
        // require(_value <= available);
        if (_check) {
            require(_value <= totalBalance.sub(frozen));
        }

        uint256 _balance = tk.balanceOf(_deposit);

        bool exist;
        bool correct;
        // WithdrawWallet[] storage withdrawWalletList = depositRepos[_deposit].withdrawWallets;
        (exist, correct) = checkWithdrawAddress(_deposit, _name, _to);
        if(!exist) {
            // withdrawWalletList.push(WithdrawWallet(_name, _to));
            if (!correct) {
                walletStorage.addWithdraw(_deposit, _name, _to);
            } else {
                walletStorage.changeWalletName(_deposit, _name, _to);
            }
        } else {
            require(correct, "wallet address must be correct with wallet name!");
        }

        DepositWithdraw deposWithdr = DepositWithdraw(_deposit);
        /**
         * if deposit address doesn't have enough tokens to withdraw,
         * then withdraw from this contract. Record this in the independent deposit contract.
         */
        if (_value > _balance) {
            require(deposWithdr.checkWithdrawAmount(address(params), _value, _time));
            if(_balance > 0) {
                require(deposWithdr.withdrawToken(address(tk), address(walletStorage), _balance));
            }

            require(withdrawFromThis(deposWithdr, _time, _to, _value));
            // return true;
        } else {
            require(deposWithdr.withdrawToken(address(tk), address(params), _time, _to, _value, params.chargeFee(), params.chargeFeePool()));
        }

        return walletStorage.decreaseBalance(_deposit, _value);
    }

    /**
         * @dev destory the old depoist contract and take back the tokens
     *
     * @param _deposit the deposit address
         */
    function destroyDepositContract(address _deposit) onlyOwner public returns (bool) {
        require(_deposit != address(0));

        DepositWithdraw deposWithdr = DepositWithdraw(_deposit);
        address[] memory tokens = new address[](1);
        tokens[0] = address(tk);
        deposWithdr.destroy(tokens);

        return walletStorage.removeDeposit(_deposit);
    }

}

contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address _who) public view returns (uint256);
  function transfer(address _to, uint256 _value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

contract ERC20 is ERC20Basic {
  function allowance(address _owner, address _spender)
    public view returns (uint256);

  function transferFrom(address _from, address _to, uint256 _value)
    public returns (bool);

  function approve(address _spender, uint256 _value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"withdrawToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"walletStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_deposit","type":"address"}],"name":"getDepositWithdrawCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tk","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deposit","type":"address"},{"name":"_freeze","type":"bool"},{"name":"_value","type":"uint256"}],"name":"freezeTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_oldWallet","type":"address"},{"name":"_newWallet","type":"address"}],"name":"changeDefaultWithdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwnedOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deposit","type":"address"},{"name":"_time","type":"uint256"},{"name":"_name","type":"bytes32"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_check","type":"bool"}],"name":"withdrawWithFee","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deposit","type":"address"},{"name":"_increase","type":"bool"},{"name":"_value","type":"uint256"}],"name":"doDeposit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_deposit","type":"address"}],"name":"getDepositInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_deposit","type":"address"},{"name":"_name","type":"bytes32"},{"name":"_to","type":"address"}],"name":"checkWithdrawAddress","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_deposit","type":"address"},{"name":"_indices","type":"uint256[]"}],"name":"getDepositWithdrawList","outputs":[{"name":"","type":"bytes32[]"},{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_contract","type":"address"}],"name":"bindContract","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deposit","type":"address"}],"name":"destroyDepositContract","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"createDepositContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ownedContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"start","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_walletParams","type":"address"},{"name":"_walletStorage","type":"address"}],"name":"initialize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_start","type":"uint256"},{"name":"_end","type":"uint256"}],"name":"setLimits","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokens","type":"address[]"}],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"params","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getDepositAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"ownedOwnershipTransferred","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nextOwner","type":"address"}],"name":"changeOwnershipto","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"end","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deposit","type":"address"},{"name":"_time","type":"uint256"},{"name":"_value","type":"uint256"},{"name":"_check","type":"bool"}],"name":"withdrawWithFee","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_wallet","type":"address"},{"indexed":false,"name":"_deposit","type":"address"}],"name":"CreateDepositAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_deposit","type":"address"},{"indexed":false,"name":"_freeze","type":"bool"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"FrozenTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_oldWallet","type":"address"},{"indexed":false,"name":"_newWallet","type":"address"}],"name":"ChangeDefaultWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"ReceiveEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"WithdrawEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_token","type":"address"},{"indexed":false,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"WithdrawToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405260008054600160a060020a031916331790556142e8806100256000396000f30060806040526004361061017c5763ffffffff60e060020a60003504166301e3366781146101b857806314a0bc6f146101f6578063196198fa1461022757806321f408be1461025a57806322e113a31461026f57806345629402146102985780634902d163146102bf5780634a738bea146102d45780634d8d0e1b1461030b5780634e71e0c8146103345780635287ce121461034b5780635682d43d14610385578063715018a6146103cb5780637df83cd0146103e05780638157d4b5146104dc5780638da5cb5b146104fd5780639ab8bc2714610512578063aba9650e14610533578063bc467a3e14610554578063be9a655514610569578063c0c53b8b1461057e578063c4590d3f146105ab578063c6786e5a146105c6578063cff0ab961461061b578063d83a7f6714610630578063dbf3543014610651578063e30c397814610666578063ede930c91461067b578063efbe1c1c1461069c578063f23f2cbe146106b1578063f2fde38b146106dd578063f3fef3a3146106fe575b6040805133815234602082015281517ff32a9f77675fd5917534c7746608fd3e309eac68fbdcbf5925e24ca97a704396929181900390910190a1005b3480156101c457600080fd5b506101e2600160a060020a0360043581169060243516604435610722565b604080519115158252519081900360200190f35b34801561020257600080fd5b5061020b610854565b60408051600160a060020a039092168252519081900360200190f35b34801561023357600080fd5b50610248600160a060020a0360043516610863565b60408051918252519081900360200190f35b34801561026657600080fd5b5061020b61092d565b34801561027b57600080fd5b506101e2600160a060020a0360043516602435151560443561093c565b3480156102a457600080fd5b506101e2600160a060020a0360043581169060243516610a4c565b3480156102cb57600080fd5b5061020b610cb3565b3480156102e057600080fd5b506101e2600160a060020a0360043581169060243590604435906064351660843560a4351515610cc2565b34801561031757600080fd5b506101e2600160a060020a0360043516602435151560443561159a565b34801561034057600080fd5b506103496116fb565b005b34801561035757600080fd5b5061036c600160a060020a036004351661179a565b6040805192835260208301919091528051918290030190f35b34801561039157600080fd5b506103b0600160a060020a036004358116906024359060443516611903565b60408051921515835290151560208301528051918290030190f35b3480156103d757600080fd5b50610349611b64565b3480156103ec57600080fd5b50604080516020600460248035828101358481028087018601909752808652610443968435600160a060020a031696369660449591949091019291829185019084908082843750949750611bc39650505050505050565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561048757818101518382015260200161046f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156104c65781810151838201526020016104ae565b5050505090500194505050505060405180910390f35b3480156104e857600080fd5b506101e2600160a060020a0360043516611df2565b34801561050957600080fd5b5061020b611f4b565b34801561051e57600080fd5b506101e2600160a060020a0360043516611f5a565b34801561053f57600080fd5b5061020b600160a060020a03600435166120f6565b34801561056057600080fd5b5061020b612247565b34801561057557600080fd5b50610248612256565b34801561058a57600080fd5b506101e2600160a060020a036004358116906024358116906044351661225c565b3480156105b757600080fd5b506103496004356024356122e1565b3480156105d257600080fd5b50604080516020600480358082013583810280860185019096528085526103499536959394602494938501929182918501908490808284375094975061230d9650505050505050565b34801561062757600080fd5b5061020b612494565b34801561063c57600080fd5b5061020b600160a060020a03600435166124a3565b34801561065d57600080fd5b506101e261256a565b34801561067257600080fd5b5061020b612663565b34801561068757600080fd5b50610349600160a060020a0360043516612672565b3480156106a857600080fd5b50610248612802565b3480156106bd57600080fd5b506101e2600160a060020a03600435166024356044356064351515612808565b3480156106e957600080fd5b50610349600160a060020a036004351661297c565b34801561070a57600080fd5b506101e2600160a060020a03600435166024356129b5565b600080548190600160a060020a0316331461073c57600080fd5b600160a060020a038416151561075157600080fd5b600160a060020a038516151561076657600080fd5b50604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151869283169163a9059cbb9160448083019260209291908290030181600087803b1580156107d357600080fd5b505af11580156107e7573d6000803e3d6000fd5b505050506040513d60208110156107fd57600080fd5b505060408051600160a060020a0380881682528616602082015280820185905290517f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f13049181900360600190a1506001949350505050565b600854600160a060020a031681565b600080548190600160a060020a0316331461087d57600080fd5b600160a060020a038316151561089257600080fd5b600854604080517fb714a90d000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151919092169163b714a90d9160248083019260209291908290030181600087803b1580156108fa57600080fd5b505af115801561090e573d6000803e3d6000fd5b505050506040513d602081101561092457600080fd5b50519392505050565b600654600160a060020a031681565b600080548190600160a060020a0316331461095657600080fd5b600854604080517f22e113a3000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152871515602483015260448201879052915191909216916322e113a39160648083019260209291908290030181600087803b1580156109cd57600080fd5b505af11580156109e1573d6000803e3d6000fd5b505050506040513d60208110156109f757600080fd5b5051604080518615158152602081018690528151929350600160a060020a038816927ffd984c05c771ebc127f8483a21238f2b87610feb88410280c0f435d02ae0f439929181900390910190a2949350505050565b60008054819081908190600160a060020a03163314610a6a57600080fd5b600160a060020a0386161515610a7f57600080fd5b600160a060020a0385161515610a9457600080fd5b600854604080517f79b6fead000000000000000000000000000000000000000000000000000000008152600160a060020a038981166004830152915191909216916379b6fead9160248083019260209291908290030181600087803b158015610afc57600080fd5b505af1158015610b10573d6000803e3d6000fd5b505050506040513d6020811015610b2657600080fd5b5051604080517f9373f432000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915192955085945090841691639373f432916024808201926020929091908290030181600087803b158015610b9357600080fd5b505af1158015610ba7573d6000803e3d6000fd5b505050506040513d6020811015610bbd57600080fd5b50511515610bca57600080fd5b600854604080517fbf403204000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015288811660248301529151919092169163bf4032049160448083019260209291908290030181600087803b158015610c3a57600080fd5b505af1158015610c4e573d6000803e3d6000fd5b505050506040513d6020811015610c6457600080fd5b505160408051600160a060020a0388811682529151929350908816917fb15573eb768216f61724fe33469e0a6160b82aadd32d51a4faec79aeb5351ad39181900360200190a295945050505050565b600554600160a060020a031681565b60008054819081908190819081908190600160a060020a03163314610ce657600080fd5b600160a060020a038d161515610cfb57600080fd5b600160a060020a038a161515610d1057600080fd5b600860009054906101000a9004600160a060020a0316600160a060020a03166370a082318e6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610d8057600080fd5b505af1158015610d94573d6000803e3d6000fd5b505050506040513d6020811015610daa57600080fd5b81019080805190602001909291905050509550600860009054906101000a9004600160a060020a0316600160a060020a03166386602c848e6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610e2d57600080fd5b505af1158015610e41573d6000803e3d6000fd5b505050506040513d6020811015610e5757600080fd5b505194508715610e7d57610e71868663ffffffff612a6616565b891115610e7d57600080fd5b600660009054906101000a9004600160a060020a0316600160a060020a03166370a082318e6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610eed57600080fd5b505af1158015610f01573d6000803e3d6000fd5b505050506040513d6020811015610f1757600080fd5b50519350610f268d8c8c611903565b90935091508215156110d15781151561100557600860009054906101000a9004600160a060020a0316600160a060020a03166384062bdd8e8d8d6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001836000191660001916815260200182600160a060020a0316600160a060020a031681526020019350505050602060405180830381600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b505050506040513d6020811015610ffd57600080fd5b506110cc9050565b600860009054906101000a9004600160a060020a0316600160a060020a031663e31dd8968e8d8d6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001836000191660001916815260200182600160a060020a0316600160a060020a031681526020019350505050602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b50505b611165565b81151561116557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f77616c6c65742061646472657373206d75737420626520636f7272656374207760448201527f6974682077616c6c6574206e616d652100000000000000000000000000000000606482015290519081900360840190fd5b508b838911156112f157600754604080517f68c31649000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018c9052604481018f90529051918316916368c31649916064808201926020929091908290030181600087803b1580156111e557600080fd5b505af11580156111f9573d6000803e3d6000fd5b505050506040513d602081101561120f57600080fd5b5051151561121c57600080fd5b60008411156112d557600654600854604080517f01e33667000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820187905251918316916301e33667916064808201926020929091908290030181600087803b15801561129e57600080fd5b505af11580156112b2573d6000803e3d6000fd5b505050506040513d60208110156112c857600080fd5b505115156112d557600080fd5b6112e1818d8c8c612a78565b15156112ec57600080fd5b6114e5565b80600160a060020a03166366013bdd600660009054906101000a9004600160a060020a0316600760009054906101000a9004600160a060020a03168f8e8e600760009054906101000a9004600160a060020a0316600160a060020a031663744c8c096040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561138257600080fd5b505af1158015611396573d6000803e3d6000fd5b505050506040513d60208110156113ac57600080fd5b5051600754604080517fd16edc150000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169163d16edc15916004808201926020929091908290030181600087803b15801561140e57600080fd5b505af1158015611422573d6000803e3d6000fd5b505050506040513d602081101561143857600080fd5b50516040805160e060020a63ffffffff8b16028152600160a060020a039889166004820152968816602488015260448701959095529286166064860152608485019190915260a48401529290921660c4820152905160e48083019260209291908290030181600087803b1580156114ae57600080fd5b505af11580156114c2573d6000803e3d6000fd5b505050506040513d60208110156114d857600080fd5b505115156114e557600080fd5b600860009054906101000a9004600160a060020a0316600160a060020a031663ff0569498e8b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561155d57600080fd5b505af1158015611571573d6000803e3d6000fd5b505050506040513d602081101561158757600080fd5b50519d9c50505050505050505050505050565b60008054600160a060020a031633146115b257600080fd5b8261165757600854604080517fff056949000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152602482018690529151919092169163ff0569499160448083019260209291908290030181600087803b15801561162657600080fd5b505af115801561163a573d6000803e3d6000fd5b505050506040513d602081101561165057600080fd5b50516116f3565b600854604080517f5b86f599000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301526024820186905291519190921691635b86f5999160448083019260209291908290030181600087803b1580156116c657600080fd5b505af11580156116da573d6000803e3d6000fd5b505050506040513d60208110156116f057600080fd5b50515b949350505050565b600154600160a060020a0316331461171257600080fd5b600254431115801561172657506003544310155b151561173157600080fd5b60015460008054604051600160a060020a0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054600160a060020a0319908116600160a060020a038416178255909116909155600255565b60008054819081908190600160a060020a031633146117b857600080fd5b600160a060020a03851615156117cd57600080fd5b600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915191909216916370a082319160248083019260209291908290030181600087803b15801561183557600080fd5b505af1158015611849573d6000803e3d6000fd5b505050506040513d602081101561185f57600080fd5b5051600854604080517f86602c84000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519395509116916386602c84916024808201926020929091908290030181600087803b1580156118cb57600080fd5b505af11580156118df573d6000803e3d6000fd5b505050506040513d60208110156118f557600080fd5b505191959194509092505050565b600854604080517fb714a90d000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915160009384938493849384938493169163b714a90d91602480830192602092919082900301818787803b15801561197457600080fd5b505af1158015611988573d6000803e3d6000fd5b505050506040513d602081101561199e57600080fd5b50519350600092505b83831015611b5057600854604080517ff19ae02a000000000000000000000000000000000000000000000000000000008152600160a060020a038c81166004830152602482018790529151919092169163f19ae02a9160448083019260209291908290030181600087803b158015611a1e57600080fd5b505af1158015611a32573d6000803e3d6000fd5b505050506040513d6020811015611a4857600080fd5b5051600854604080517f437ec21d000000000000000000000000000000000000000000000000000000008152600160a060020a038d8116600483015260248201889052915193955091169163437ec21d916044808201926020929091908290030181600087803b158015611abb57600080fd5b505af1158015611acf573d6000803e3d6000fd5b505050506040513d6020811015611ae557600080fd5b5051905087821415611b1157600181600160a060020a031688600160a060020a03161495509550611b58565b80600160a060020a031687600160a060020a03161415611b38576000600195509550611b58565b611b4983600163ffffffff612da916565b92506119a7565b600080955095505b50505050935093915050565b600054600160a060020a03163314611b7b57600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a260008054600160a060020a0319169055565b60008054606091829182918291600160a060020a03163314611be457600080fd5b85511515611bf157600080fd5b8551604051908082528060200260200182016040528015611c1c578160200160208202803883390190505b5092508551604051908082528060200260200182016040528015611c4a578160200160208202803883390190505b509150600090505b8551811015611de657600854604080517ff19ae02a000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152602482018590529151919092169163f19ae02a9160448083019260209291908290030181600087803b158015611cca57600080fd5b505af1158015611cde573d6000803e3d6000fd5b505050506040513d6020811015611cf457600080fd5b50518351849083908110611d0457fe5b6020908102909101810191909152600854604080517f437ec21d000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152602482018690529151919092169263437ec21d92604480820193918290030181600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b505050506040513d6020811015611da757600080fd5b50518251839083908110611db757fe5b600160a060020a03909216602092830290910190910152611ddf81600163ffffffff612da916565b9050611c52565b50909590945092505050565b60008054600160a060020a03163314611e0a57600080fd5b600160a060020a0382161515611e1f57600080fd5b60048054600160a060020a031916600160a060020a0384811691909117808355604080517f8da5cb5b000000000000000000000000000000000000000000000000000000008152905130949290931692638da5cb5b928281019260209291908290030181600087803b158015611e9457600080fd5b505af1158015611ea8573d6000803e3d6000fd5b505050506040513d6020811015611ebe57600080fd5b5051600160a060020a031614611f435760048054604080517f4e71e0c80000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921692634e71e0c892828201926000929082900301818387803b158015611f2a57600080fd5b505af1158015611f3e573d6000803e3d6000fd5b505050505b506001919050565b600054600160a060020a031681565b600080548190606090600160a060020a03163314611f7757600080fd5b600160a060020a0384161515611f8c57600080fd5b604080516001808252818301909252859350906020808301908038833950506006548251929350600160a060020a0316918391506000908110611fcb57fe5b600160a060020a0392831660209182029092018101919091526040517fc6786e5a000000000000000000000000000000000000000000000000000000008152600481018281528451602483015284519386169363c6786e5a9386938392604490910191858101910280838360005b83811015612051578181015183820152602001612039565b5050505090500192505050600060405180830381600087803b15801561207657600080fd5b505af115801561208a573d6000803e3d6000fd5b5050600854604080517f0a633e09000000000000000000000000000000000000000000000000000000008152600160a060020a0389811660048301529151919092169350630a633e09925060248083019260209291908290030181600087803b1580156116c657600080fd5b6000805481908190600160a060020a0316331461211257600080fd5b600160a060020a038416151561212757600080fd5b83612130612dbc565b600160a060020a03909116815260405190819003602001906000f08015801561215d573d6000803e3d6000fd5b50600854604080517f2f1c563e000000000000000000000000000000000000000000000000000000008152600160a060020a03888116600483015280851660248301529151939550859450911691632f1c563e916044808201926020929091908290030181600087803b1580156121d357600080fd5b505af11580156121e7573d6000803e3d6000fd5b505050506040513d60208110156121fd57600080fd5b505060408051600160a060020a0383811682529151918616917f55c48b5893b218bfd1f85d28d11d185c7ec0f376933dbb0a09db48711c120e229181900360200190a29392505050565b600454600160a060020a031681565b60035481565b60008054600160a060020a0316331461227457600080fd5b600160a060020a038416151561228957600080fd5b600160a060020a038316151561229e57600080fd5b5060068054600160a060020a03948516600160a060020a031991821617909155600780549385169382169390931790925560088054919093169116179055600190565b600054600160a060020a031633146122f857600080fd5b8082111561230557600080fd5b600255600355565b6000805481908190600160a060020a0316331461232957600080fd5b600092505b835183101561248657838381518110151561234557fe5b6020908102909101810151604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450600160a060020a038516926370a08231926024808401938290030181600087803b1580156123af57600080fd5b505af11580156123c3573d6000803e3d6000fd5b505050506040513d60208110156123d957600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b505050506040513d602081101561247957600080fd5b505060019092019161232e565b600054600160a060020a0316ff5b600754600160a060020a031681565b60008054600160a060020a031633146124bb57600080fd5b600160a060020a03821615156124d057600080fd5b600854604080517f79b6fead000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915191909216916379b6fead9160248083019260209291908290030181600087803b15801561253857600080fd5b505af115801561254c573d6000803e3d6000fd5b505050506040513d602081101561256257600080fd5b505192915050565b60008054600160a060020a0316331461258257600080fd5b600454600160a060020a0316151561259957600080fd5b60055460048054604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051600160a060020a039485169490921692638da5cb5b9282820192602092908290030181600087803b1580156125fd57600080fd5b505af1158015612611573d6000803e3d6000fd5b505050506040513d602081101561262757600080fd5b5051600160a060020a0316141561265c575060048054600160a060020a03199081169091556005805490911690556001612660565b5060005b90565b600154600160a060020a031681565b600054600160a060020a0316331461268957600080fd5b600454600160a060020a031615156126a057600080fd5b60055460048054604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051600160a060020a039485169490921692638da5cb5b9282820192602092908290030181600087803b15801561270457600080fd5b505af1158015612718573d6000803e3d6000fd5b505050506040513d602081101561272e57600080fd5b5051600160a060020a0316146127e25760048054604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a03858116948201949094529051929091169163f2fde38b9160248082019260009290919082900301818387803b1580156127a957600080fd5b505af11580156127bd573d6000803e3d6000fd5b505060058054600160a060020a031916600160a060020a038516179055506127ff9050565b60048054600160a060020a03199081169091556005805490911690555b50565b60025481565b6000805481908190600160a060020a0316331461282457600080fd5b600854604080517ff19ae02a000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152600060248301819052925193169263f19ae02a92604480840193602093929083900390910190829087803b15801561289557600080fd5b505af11580156128a9573d6000803e3d6000fd5b505050506040513d60208110156128bf57600080fd5b5051600854604080517f437ec21d000000000000000000000000000000000000000000000000000000008152600160a060020a038b8116600483015260006024830181905292519496509092169263437ec21d926044808201936020939283900390910190829087803b15801561293557600080fd5b505af1158015612949573d6000803e3d6000fd5b505050506040513d602081101561295f57600080fd5b50519050612971878784848989610cc2565b979650505050505050565b600054600160a060020a0316331461299357600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60008054600160a060020a031633146129cd57600080fd5b600160a060020a03831615156129e257600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f19350505050158015612a18573d6000803e3d6000fd5b5060408051600160a060020a03851681526020810184905281517fdb35132c111efe920cede025e819975671cfd1b8fcc1174762c8670c4e94c211929181900390910190a150600192915050565b600082821115612a7257fe5b50900390565b600080600080600760009054906101000a9004600160a060020a0316600160a060020a031663744c8c096040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612ad157600080fd5b505af1158015612ae5573d6000803e3d6000fd5b505050506040513d6020811015612afb57600080fd5b50519250612b0f858463ffffffff612a6616565b9150600760009054906101000a9004600160a060020a0316600160a060020a031663d16edc156040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612b6457600080fd5b505af1158015612b78573d6000803e3d6000fd5b505050506040513d6020811015612b8e57600080fd5b50519050600160a060020a03811615801590612baa5750600083115b15612c6057600854600654604080517f01e33667000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152848316602482015260448101879052905191909216916301e336679160648083019260209291908290030181600087803b158015612c2957600080fd5b505af1158015612c3d573d6000803e3d6000fd5b505050506040513d6020811015612c5357600080fd5b50511515612c6057600080fd5b600854600654604080517f01e33667000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152898316602482015260448101869052905191909216916301e336679160648083019260209291908290030181600087803b158015612cda57600080fd5b505af1158015612cee573d6000803e3d6000fd5b505050506040513d6020811015612d0457600080fd5b50511515612d1157600080fd5b604080517fab40340a00000000000000000000000000000000000000000000000000000000815260048101899052600160a060020a038881166024830152604482018590529151918a169163ab40340a9160648082019260009290919082900301818387803b158015612d8357600080fd5b505af1158015612d97573d6000803e3d6000fd5b5060019b9a5050505050505050505050565b81810182811015612db657fe5b92915050565b6040516114f080612dcd833901905600608060405234801561001057600080fd5b506040516020806114f0833981016040525160008054600160a060020a03191633179055600160a060020a038116151561004957600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055611478806100786000396000f3006080604052600436106100ec5763ffffffff60e060020a600035041662226eb5811461012857806301e336671461014f5780634e71e0c81461018d57806366013bdd146101a457806368c31649146101e3578063715018a61461020a57806374cd5c0b1461021f5780638da5cb5b1461025d5780638f4ffcb11461028e5780639373f432146102fe5780639bdd070d1461031f578063a901199014610358578063ab40340a14610370578063bfe370d914610397578063c5a88559146103f0578063c6786e5a14610405578063e30c39781461045a578063f2fde38b1461046f578063f3fef3a314610490575b6040805133815234602082015281517ff32a9f77675fd5917534c7746608fd3e309eac68fbdcbf5925e24ca97a704396929181900390910190a1005b34801561013457600080fd5b5061013d6104b4565b60408051918252519081900360200190f35b34801561015b57600080fd5b50610179600160a060020a03600435811690602435166044356104ba565b604080519115158252519081900360200190f35b34801561019957600080fd5b506101a26105ec565b005b3480156101b057600080fd5b50610179600160a060020a03600435811690602435811690604435906064358116906084359060a4359060c43516610674565b3480156101ef57600080fd5b50610179600160a060020a03600435166024356044356108a7565b34801561021657600080fd5b506101a2610bdf565b34801561022b57600080fd5b50610237600435610c4b565b60408051938452600160a060020a03909216602084015282820152519081900360600190f35b34801561026957600080fd5b50610272610ce2565b60408051600160a060020a039092168252519081900360200190f35b34801561029a57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526101a294600160a060020a03813581169560248035966044359093169536956084949201918190840183828082843750949750610cf19650505050505050565b34801561030a57600080fd5b50610179600160a060020a0360043516610f83565b34801561032b57600080fd5b50610179600160a060020a0360043581169060243581169060443590606435906084359060a43516610fe2565b34801561036457600080fd5b50610237600435611023565b34801561037c57600080fd5b506101a2600435600160a060020a0360243516604435611095565b3480156103a357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261013d9436949293602493928401919081908401838280828437509497506111789650505050505050565b3480156103fc57600080fd5b5061013d61117f565b34801561041157600080fd5b50604080516020600480358082013583810280860185019096528085526101a2953695939460249493850192918291850190849080828437509497506111859650505050505050565b34801561046657600080fd5b5061027261130c565b34801561047b57600080fd5b506101a2600160a060020a036004351661131b565b34801561049c57600080fd5b50610179600160a060020a0360043516602435611361565b60025490565b600080548190600160a060020a031633146104d457600080fd5b600160a060020a03841615156104e957600080fd5b600160a060020a03851615156104fe57600080fd5b50604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151869283169163a9059cbb9160448083019260209291908290030181600087803b15801561056b57600080fd5b505af115801561057f573d6000803e3d6000fd5b505050506040513d602081101561059557600080fd5b505060408051600160a060020a0380881682528616602082015280820185905290517f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f13049181900360600190a1506001949350505050565b600154600160a060020a0316331461060357600080fd5b60015460008054604051600160a060020a0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b6000805481908190600160a060020a0316331461069057600080fd5b600160a060020a03871615156106a557600080fd5b600160a060020a038a1615156106ba57600080fd5b8486116106c657600080fd5b6106d189878a6108a7565b15156106dc57600080fd5b8991506106ef868663ffffffff61141216565b905081600160a060020a031663a9059cbb88836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561075457600080fd5b505af1158015610768573d6000803e3d6000fd5b505050506040513d602081101561077e57600080fd5b5051151561078b57600080fd5b600160a060020a038416158015906107a35750600085115b156108425781600160a060020a031663a9059cbb85876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b505050506040513d602081101561083557600080fd5b5051151561084257600080fd5b61084d888883611095565b60408051600160a060020a03808d1682528916602082015280820183905290517f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f13049181900360600190a15060019998505050505050505050565b60008060008086925082600160a060020a0316637312aaae6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156108ee57600080fd5b505af1158015610902573d6000803e3d6000fd5b505050506040513d602081101561091857600080fd5b505186111561092657600080fd5b82600160a060020a03166314361fd16040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561096457600080fd5b505af1158015610978573d6000803e3d6000fd5b505050506040513d602081101561098e57600080fd5b505186101561099c57600080fd5b6109af856201518063ffffffff61142416565b6004549092508211610ae3576005546109cf90600163ffffffff61143916565b6005556006546109e5908763ffffffff61143916565b60046002018190555082600160a060020a031663f213aad26040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a2c57600080fd5b505af1158015610a40573d6000803e3d6000fd5b505050506040513d6020811015610a5657600080fd5b50516005541115610a6657600080fd5b82600160a060020a0316635e3cbb7c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610aa457600080fd5b505af1158015610ab8573d6000803e3d6000fd5b505050506040513d6020811015610ace57600080fd5b50516006541115610ade57600080fd5b610af3565b6004829055600160055560068690555b610b068562278d0063ffffffff61142416565b6007549091508111610bc257600854610b2690600163ffffffff61143916565b600855600954610b3c908763ffffffff61143916565b60076002018190555082600160a060020a031663be54f2146040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610b8357600080fd5b505af1158015610b97573d6000803e3d6000fd5b505050506040513d6020811015610bad57600080fd5b50516009541115610bbd57600080fd5b610bd2565b6007819055600160085560098690555b5060019695505050505050565b600054600160a060020a03163314610bf657600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600354600090819081908410610c6057600080fd5b6003805485908110610c6e57fe5b906000526020600020906003020160000154600385815481101515610c8f57fe5b906000526020600020906003020160010160009054906101000a9004600160a060020a0316600386815481101515610cc357fe5b9060005260206000209060030201600201549250925092509193909250565b600054600160a060020a031681565b600080548190600160a060020a03163314610d0b57600080fd5b600160a060020a0384161515610d2057600080fd5b600160a060020a0386161515610d3557600080fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152306024830152604482018890529151869450918416916323b872dd916064808201926020929091908290030181600087803b158015610daa57600080fd5b505af1158015610dbe573d6000803e3d6000fd5b505050506040513d6020811015610dd457600080fd5b50511515610de157600080fd5b610dea83611178565b6040805160608082018352838252600160a060020a038a811660208085018281528587018d815260028054600181018255600091825297517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace60039099029889015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf8801805473ffffffffffffffffffffffffffffffffffffffff1916918716919091179055517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad09096019590955585519182528181018c9052918a1694810194909452608091840182815288519285019290925287519495507f3bc54c6dcf5be6793947a9f34e5ca45d6ce9196bea304a5550c3e2d2f2156502948b948b948b948b949293909260a085019290860191908190849084905b83811015610f3e578181015183820152602001610f26565b50505050905090810190601f168015610f6b5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1505050505050565b60008054600160a060020a03163314610f9b57600080fd5b600160a060020a0382161515610fb057600080fd5b50600a8054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff199091161790556001919050565b60008054600160a060020a03163314610ffa57600080fd5b600a5461101890889088908890600160a060020a0316888888610674565b979650505050505050565b60025460009081908190841061103857600080fd5b600280548590811061104657fe5b90600052602060002090600302016000015460028581548110151561106757fe5b600091825260209091206001600390920201015460028054600160a060020a039092169187908110610cc357fe5b600054600160a060020a031633146110ac57600080fd5b60408051606081018252938452600160a060020a039283166020850190815290840191825260038054600181018255600082905294517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9590910294850155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c8401805473ffffffffffffffffffffffffffffffffffffffff19169190931617909155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d90910155565b6020015190565b60035490565b6000805481908190600160a060020a031633146111a157600080fd5b600092505b83518310156112fe5783838151811015156111bd57fe5b6020908102909101810151604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450600160a060020a038516926370a08231926024808401938290030181600087803b15801561122757600080fd5b505af115801561123b573d6000803e3d6000fd5b505050506040513d602081101561125157600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b1580156112c757600080fd5b505af11580156112db573d6000803e3d6000fd5b505050506040513d60208110156112f157600080fd5b50506001909201916111a6565b600054600160a060020a0316ff5b600154600160a060020a031681565b600054600160a060020a0316331461133257600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008054600160a060020a0316331461137957600080fd5b600160a060020a038316151561138e57600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f193505050501580156113c4573d6000803e3d6000fd5b5060408051600160a060020a03851681526020810184905281517fdb35132c111efe920cede025e819975671cfd1b8fcc1174762c8670c4e94c211929181900390910190a150600192915050565b60008282111561141e57fe5b50900390565b6000818381151561143157fe5b049392505050565b8181018281101561144657fe5b929150505600a165627a7a723058201ab45f0d83bc4a86f553ee7cfb1a907c30c9cf11de4bf4cf21e9a2d55eae5c420029a165627a7a72305820712a232f462a2374baadf9e545d65a9fb8b18f294852f8502b5b4969c86922710029

Deployed Bytecode

0x60806040526004361061017c5763ffffffff60e060020a60003504166301e3366781146101b857806314a0bc6f146101f6578063196198fa1461022757806321f408be1461025a57806322e113a31461026f57806345629402146102985780634902d163146102bf5780634a738bea146102d45780634d8d0e1b1461030b5780634e71e0c8146103345780635287ce121461034b5780635682d43d14610385578063715018a6146103cb5780637df83cd0146103e05780638157d4b5146104dc5780638da5cb5b146104fd5780639ab8bc2714610512578063aba9650e14610533578063bc467a3e14610554578063be9a655514610569578063c0c53b8b1461057e578063c4590d3f146105ab578063c6786e5a146105c6578063cff0ab961461061b578063d83a7f6714610630578063dbf3543014610651578063e30c397814610666578063ede930c91461067b578063efbe1c1c1461069c578063f23f2cbe146106b1578063f2fde38b146106dd578063f3fef3a3146106fe575b6040805133815234602082015281517ff32a9f77675fd5917534c7746608fd3e309eac68fbdcbf5925e24ca97a704396929181900390910190a1005b3480156101c457600080fd5b506101e2600160a060020a0360043581169060243516604435610722565b604080519115158252519081900360200190f35b34801561020257600080fd5b5061020b610854565b60408051600160a060020a039092168252519081900360200190f35b34801561023357600080fd5b50610248600160a060020a0360043516610863565b60408051918252519081900360200190f35b34801561026657600080fd5b5061020b61092d565b34801561027b57600080fd5b506101e2600160a060020a0360043516602435151560443561093c565b3480156102a457600080fd5b506101e2600160a060020a0360043581169060243516610a4c565b3480156102cb57600080fd5b5061020b610cb3565b3480156102e057600080fd5b506101e2600160a060020a0360043581169060243590604435906064351660843560a4351515610cc2565b34801561031757600080fd5b506101e2600160a060020a0360043516602435151560443561159a565b34801561034057600080fd5b506103496116fb565b005b34801561035757600080fd5b5061036c600160a060020a036004351661179a565b6040805192835260208301919091528051918290030190f35b34801561039157600080fd5b506103b0600160a060020a036004358116906024359060443516611903565b60408051921515835290151560208301528051918290030190f35b3480156103d757600080fd5b50610349611b64565b3480156103ec57600080fd5b50604080516020600460248035828101358481028087018601909752808652610443968435600160a060020a031696369660449591949091019291829185019084908082843750949750611bc39650505050505050565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561048757818101518382015260200161046f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156104c65781810151838201526020016104ae565b5050505090500194505050505060405180910390f35b3480156104e857600080fd5b506101e2600160a060020a0360043516611df2565b34801561050957600080fd5b5061020b611f4b565b34801561051e57600080fd5b506101e2600160a060020a0360043516611f5a565b34801561053f57600080fd5b5061020b600160a060020a03600435166120f6565b34801561056057600080fd5b5061020b612247565b34801561057557600080fd5b50610248612256565b34801561058a57600080fd5b506101e2600160a060020a036004358116906024358116906044351661225c565b3480156105b757600080fd5b506103496004356024356122e1565b3480156105d257600080fd5b50604080516020600480358082013583810280860185019096528085526103499536959394602494938501929182918501908490808284375094975061230d9650505050505050565b34801561062757600080fd5b5061020b612494565b34801561063c57600080fd5b5061020b600160a060020a03600435166124a3565b34801561065d57600080fd5b506101e261256a565b34801561067257600080fd5b5061020b612663565b34801561068757600080fd5b50610349600160a060020a0360043516612672565b3480156106a857600080fd5b50610248612802565b3480156106bd57600080fd5b506101e2600160a060020a03600435166024356044356064351515612808565b3480156106e957600080fd5b50610349600160a060020a036004351661297c565b34801561070a57600080fd5b506101e2600160a060020a03600435166024356129b5565b600080548190600160a060020a0316331461073c57600080fd5b600160a060020a038416151561075157600080fd5b600160a060020a038516151561076657600080fd5b50604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151869283169163a9059cbb9160448083019260209291908290030181600087803b1580156107d357600080fd5b505af11580156107e7573d6000803e3d6000fd5b505050506040513d60208110156107fd57600080fd5b505060408051600160a060020a0380881682528616602082015280820185905290517f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f13049181900360600190a1506001949350505050565b600854600160a060020a031681565b600080548190600160a060020a0316331461087d57600080fd5b600160a060020a038316151561089257600080fd5b600854604080517fb714a90d000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151919092169163b714a90d9160248083019260209291908290030181600087803b1580156108fa57600080fd5b505af115801561090e573d6000803e3d6000fd5b505050506040513d602081101561092457600080fd5b50519392505050565b600654600160a060020a031681565b600080548190600160a060020a0316331461095657600080fd5b600854604080517f22e113a3000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152871515602483015260448201879052915191909216916322e113a39160648083019260209291908290030181600087803b1580156109cd57600080fd5b505af11580156109e1573d6000803e3d6000fd5b505050506040513d60208110156109f757600080fd5b5051604080518615158152602081018690528151929350600160a060020a038816927ffd984c05c771ebc127f8483a21238f2b87610feb88410280c0f435d02ae0f439929181900390910190a2949350505050565b60008054819081908190600160a060020a03163314610a6a57600080fd5b600160a060020a0386161515610a7f57600080fd5b600160a060020a0385161515610a9457600080fd5b600854604080517f79b6fead000000000000000000000000000000000000000000000000000000008152600160a060020a038981166004830152915191909216916379b6fead9160248083019260209291908290030181600087803b158015610afc57600080fd5b505af1158015610b10573d6000803e3d6000fd5b505050506040513d6020811015610b2657600080fd5b5051604080517f9373f432000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915192955085945090841691639373f432916024808201926020929091908290030181600087803b158015610b9357600080fd5b505af1158015610ba7573d6000803e3d6000fd5b505050506040513d6020811015610bbd57600080fd5b50511515610bca57600080fd5b600854604080517fbf403204000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015288811660248301529151919092169163bf4032049160448083019260209291908290030181600087803b158015610c3a57600080fd5b505af1158015610c4e573d6000803e3d6000fd5b505050506040513d6020811015610c6457600080fd5b505160408051600160a060020a0388811682529151929350908816917fb15573eb768216f61724fe33469e0a6160b82aadd32d51a4faec79aeb5351ad39181900360200190a295945050505050565b600554600160a060020a031681565b60008054819081908190819081908190600160a060020a03163314610ce657600080fd5b600160a060020a038d161515610cfb57600080fd5b600160a060020a038a161515610d1057600080fd5b600860009054906101000a9004600160a060020a0316600160a060020a03166370a082318e6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610d8057600080fd5b505af1158015610d94573d6000803e3d6000fd5b505050506040513d6020811015610daa57600080fd5b81019080805190602001909291905050509550600860009054906101000a9004600160a060020a0316600160a060020a03166386602c848e6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610e2d57600080fd5b505af1158015610e41573d6000803e3d6000fd5b505050506040513d6020811015610e5757600080fd5b505194508715610e7d57610e71868663ffffffff612a6616565b891115610e7d57600080fd5b600660009054906101000a9004600160a060020a0316600160a060020a03166370a082318e6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610eed57600080fd5b505af1158015610f01573d6000803e3d6000fd5b505050506040513d6020811015610f1757600080fd5b50519350610f268d8c8c611903565b90935091508215156110d15781151561100557600860009054906101000a9004600160a060020a0316600160a060020a03166384062bdd8e8d8d6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001836000191660001916815260200182600160a060020a0316600160a060020a031681526020019350505050602060405180830381600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b505050506040513d6020811015610ffd57600080fd5b506110cc9050565b600860009054906101000a9004600160a060020a0316600160a060020a031663e31dd8968e8d8d6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001836000191660001916815260200182600160a060020a0316600160a060020a031681526020019350505050602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b50505b611165565b81151561116557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f77616c6c65742061646472657373206d75737420626520636f7272656374207760448201527f6974682077616c6c6574206e616d652100000000000000000000000000000000606482015290519081900360840190fd5b508b838911156112f157600754604080517f68c31649000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018c9052604481018f90529051918316916368c31649916064808201926020929091908290030181600087803b1580156111e557600080fd5b505af11580156111f9573d6000803e3d6000fd5b505050506040513d602081101561120f57600080fd5b5051151561121c57600080fd5b60008411156112d557600654600854604080517f01e33667000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820187905251918316916301e33667916064808201926020929091908290030181600087803b15801561129e57600080fd5b505af11580156112b2573d6000803e3d6000fd5b505050506040513d60208110156112c857600080fd5b505115156112d557600080fd5b6112e1818d8c8c612a78565b15156112ec57600080fd5b6114e5565b80600160a060020a03166366013bdd600660009054906101000a9004600160a060020a0316600760009054906101000a9004600160a060020a03168f8e8e600760009054906101000a9004600160a060020a0316600160a060020a031663744c8c096040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561138257600080fd5b505af1158015611396573d6000803e3d6000fd5b505050506040513d60208110156113ac57600080fd5b5051600754604080517fd16edc150000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169163d16edc15916004808201926020929091908290030181600087803b15801561140e57600080fd5b505af1158015611422573d6000803e3d6000fd5b505050506040513d602081101561143857600080fd5b50516040805160e060020a63ffffffff8b16028152600160a060020a039889166004820152968816602488015260448701959095529286166064860152608485019190915260a48401529290921660c4820152905160e48083019260209291908290030181600087803b1580156114ae57600080fd5b505af11580156114c2573d6000803e3d6000fd5b505050506040513d60208110156114d857600080fd5b505115156114e557600080fd5b600860009054906101000a9004600160a060020a0316600160a060020a031663ff0569498e8b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561155d57600080fd5b505af1158015611571573d6000803e3d6000fd5b505050506040513d602081101561158757600080fd5b50519d9c50505050505050505050505050565b60008054600160a060020a031633146115b257600080fd5b8261165757600854604080517fff056949000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152602482018690529151919092169163ff0569499160448083019260209291908290030181600087803b15801561162657600080fd5b505af115801561163a573d6000803e3d6000fd5b505050506040513d602081101561165057600080fd5b50516116f3565b600854604080517f5b86f599000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301526024820186905291519190921691635b86f5999160448083019260209291908290030181600087803b1580156116c657600080fd5b505af11580156116da573d6000803e3d6000fd5b505050506040513d60208110156116f057600080fd5b50515b949350505050565b600154600160a060020a0316331461171257600080fd5b600254431115801561172657506003544310155b151561173157600080fd5b60015460008054604051600160a060020a0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054600160a060020a0319908116600160a060020a038416178255909116909155600255565b60008054819081908190600160a060020a031633146117b857600080fd5b600160a060020a03851615156117cd57600080fd5b600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915191909216916370a082319160248083019260209291908290030181600087803b15801561183557600080fd5b505af1158015611849573d6000803e3d6000fd5b505050506040513d602081101561185f57600080fd5b5051600854604080517f86602c84000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519395509116916386602c84916024808201926020929091908290030181600087803b1580156118cb57600080fd5b505af11580156118df573d6000803e3d6000fd5b505050506040513d60208110156118f557600080fd5b505191959194509092505050565b600854604080517fb714a90d000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915160009384938493849384938493169163b714a90d91602480830192602092919082900301818787803b15801561197457600080fd5b505af1158015611988573d6000803e3d6000fd5b505050506040513d602081101561199e57600080fd5b50519350600092505b83831015611b5057600854604080517ff19ae02a000000000000000000000000000000000000000000000000000000008152600160a060020a038c81166004830152602482018790529151919092169163f19ae02a9160448083019260209291908290030181600087803b158015611a1e57600080fd5b505af1158015611a32573d6000803e3d6000fd5b505050506040513d6020811015611a4857600080fd5b5051600854604080517f437ec21d000000000000000000000000000000000000000000000000000000008152600160a060020a038d8116600483015260248201889052915193955091169163437ec21d916044808201926020929091908290030181600087803b158015611abb57600080fd5b505af1158015611acf573d6000803e3d6000fd5b505050506040513d6020811015611ae557600080fd5b5051905087821415611b1157600181600160a060020a031688600160a060020a03161495509550611b58565b80600160a060020a031687600160a060020a03161415611b38576000600195509550611b58565b611b4983600163ffffffff612da916565b92506119a7565b600080955095505b50505050935093915050565b600054600160a060020a03163314611b7b57600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a260008054600160a060020a0319169055565b60008054606091829182918291600160a060020a03163314611be457600080fd5b85511515611bf157600080fd5b8551604051908082528060200260200182016040528015611c1c578160200160208202803883390190505b5092508551604051908082528060200260200182016040528015611c4a578160200160208202803883390190505b509150600090505b8551811015611de657600854604080517ff19ae02a000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152602482018590529151919092169163f19ae02a9160448083019260209291908290030181600087803b158015611cca57600080fd5b505af1158015611cde573d6000803e3d6000fd5b505050506040513d6020811015611cf457600080fd5b50518351849083908110611d0457fe5b6020908102909101810191909152600854604080517f437ec21d000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152602482018690529151919092169263437ec21d92604480820193918290030181600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b505050506040513d6020811015611da757600080fd5b50518251839083908110611db757fe5b600160a060020a03909216602092830290910190910152611ddf81600163ffffffff612da916565b9050611c52565b50909590945092505050565b60008054600160a060020a03163314611e0a57600080fd5b600160a060020a0382161515611e1f57600080fd5b60048054600160a060020a031916600160a060020a0384811691909117808355604080517f8da5cb5b000000000000000000000000000000000000000000000000000000008152905130949290931692638da5cb5b928281019260209291908290030181600087803b158015611e9457600080fd5b505af1158015611ea8573d6000803e3d6000fd5b505050506040513d6020811015611ebe57600080fd5b5051600160a060020a031614611f435760048054604080517f4e71e0c80000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921692634e71e0c892828201926000929082900301818387803b158015611f2a57600080fd5b505af1158015611f3e573d6000803e3d6000fd5b505050505b506001919050565b600054600160a060020a031681565b600080548190606090600160a060020a03163314611f7757600080fd5b600160a060020a0384161515611f8c57600080fd5b604080516001808252818301909252859350906020808301908038833950506006548251929350600160a060020a0316918391506000908110611fcb57fe5b600160a060020a0392831660209182029092018101919091526040517fc6786e5a000000000000000000000000000000000000000000000000000000008152600481018281528451602483015284519386169363c6786e5a9386938392604490910191858101910280838360005b83811015612051578181015183820152602001612039565b5050505090500192505050600060405180830381600087803b15801561207657600080fd5b505af115801561208a573d6000803e3d6000fd5b5050600854604080517f0a633e09000000000000000000000000000000000000000000000000000000008152600160a060020a0389811660048301529151919092169350630a633e09925060248083019260209291908290030181600087803b1580156116c657600080fd5b6000805481908190600160a060020a0316331461211257600080fd5b600160a060020a038416151561212757600080fd5b83612130612dbc565b600160a060020a03909116815260405190819003602001906000f08015801561215d573d6000803e3d6000fd5b50600854604080517f2f1c563e000000000000000000000000000000000000000000000000000000008152600160a060020a03888116600483015280851660248301529151939550859450911691632f1c563e916044808201926020929091908290030181600087803b1580156121d357600080fd5b505af11580156121e7573d6000803e3d6000fd5b505050506040513d60208110156121fd57600080fd5b505060408051600160a060020a0383811682529151918616917f55c48b5893b218bfd1f85d28d11d185c7ec0f376933dbb0a09db48711c120e229181900360200190a29392505050565b600454600160a060020a031681565b60035481565b60008054600160a060020a0316331461227457600080fd5b600160a060020a038416151561228957600080fd5b600160a060020a038316151561229e57600080fd5b5060068054600160a060020a03948516600160a060020a031991821617909155600780549385169382169390931790925560088054919093169116179055600190565b600054600160a060020a031633146122f857600080fd5b8082111561230557600080fd5b600255600355565b6000805481908190600160a060020a0316331461232957600080fd5b600092505b835183101561248657838381518110151561234557fe5b6020908102909101810151604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450600160a060020a038516926370a08231926024808401938290030181600087803b1580156123af57600080fd5b505af11580156123c3573d6000803e3d6000fd5b505050506040513d60208110156123d957600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b505050506040513d602081101561247957600080fd5b505060019092019161232e565b600054600160a060020a0316ff5b600754600160a060020a031681565b60008054600160a060020a031633146124bb57600080fd5b600160a060020a03821615156124d057600080fd5b600854604080517f79b6fead000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915191909216916379b6fead9160248083019260209291908290030181600087803b15801561253857600080fd5b505af115801561254c573d6000803e3d6000fd5b505050506040513d602081101561256257600080fd5b505192915050565b60008054600160a060020a0316331461258257600080fd5b600454600160a060020a0316151561259957600080fd5b60055460048054604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051600160a060020a039485169490921692638da5cb5b9282820192602092908290030181600087803b1580156125fd57600080fd5b505af1158015612611573d6000803e3d6000fd5b505050506040513d602081101561262757600080fd5b5051600160a060020a0316141561265c575060048054600160a060020a03199081169091556005805490911690556001612660565b5060005b90565b600154600160a060020a031681565b600054600160a060020a0316331461268957600080fd5b600454600160a060020a031615156126a057600080fd5b60055460048054604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051600160a060020a039485169490921692638da5cb5b9282820192602092908290030181600087803b15801561270457600080fd5b505af1158015612718573d6000803e3d6000fd5b505050506040513d602081101561272e57600080fd5b5051600160a060020a0316146127e25760048054604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a03858116948201949094529051929091169163f2fde38b9160248082019260009290919082900301818387803b1580156127a957600080fd5b505af11580156127bd573d6000803e3d6000fd5b505060058054600160a060020a031916600160a060020a038516179055506127ff9050565b60048054600160a060020a03199081169091556005805490911690555b50565b60025481565b6000805481908190600160a060020a0316331461282457600080fd5b600854604080517ff19ae02a000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152600060248301819052925193169263f19ae02a92604480840193602093929083900390910190829087803b15801561289557600080fd5b505af11580156128a9573d6000803e3d6000fd5b505050506040513d60208110156128bf57600080fd5b5051600854604080517f437ec21d000000000000000000000000000000000000000000000000000000008152600160a060020a038b8116600483015260006024830181905292519496509092169263437ec21d926044808201936020939283900390910190829087803b15801561293557600080fd5b505af1158015612949573d6000803e3d6000fd5b505050506040513d602081101561295f57600080fd5b50519050612971878784848989610cc2565b979650505050505050565b600054600160a060020a0316331461299357600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60008054600160a060020a031633146129cd57600080fd5b600160a060020a03831615156129e257600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f19350505050158015612a18573d6000803e3d6000fd5b5060408051600160a060020a03851681526020810184905281517fdb35132c111efe920cede025e819975671cfd1b8fcc1174762c8670c4e94c211929181900390910190a150600192915050565b600082821115612a7257fe5b50900390565b600080600080600760009054906101000a9004600160a060020a0316600160a060020a031663744c8c096040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612ad157600080fd5b505af1158015612ae5573d6000803e3d6000fd5b505050506040513d6020811015612afb57600080fd5b50519250612b0f858463ffffffff612a6616565b9150600760009054906101000a9004600160a060020a0316600160a060020a031663d16edc156040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612b6457600080fd5b505af1158015612b78573d6000803e3d6000fd5b505050506040513d6020811015612b8e57600080fd5b50519050600160a060020a03811615801590612baa5750600083115b15612c6057600854600654604080517f01e33667000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152848316602482015260448101879052905191909216916301e336679160648083019260209291908290030181600087803b158015612c2957600080fd5b505af1158015612c3d573d6000803e3d6000fd5b505050506040513d6020811015612c5357600080fd5b50511515612c6057600080fd5b600854600654604080517f01e33667000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152898316602482015260448101869052905191909216916301e336679160648083019260209291908290030181600087803b158015612cda57600080fd5b505af1158015612cee573d6000803e3d6000fd5b505050506040513d6020811015612d0457600080fd5b50511515612d1157600080fd5b604080517fab40340a00000000000000000000000000000000000000000000000000000000815260048101899052600160a060020a038881166024830152604482018590529151918a169163ab40340a9160648082019260009290919082900301818387803b158015612d8357600080fd5b505af1158015612d97573d6000803e3d6000fd5b5060019b9a5050505050505050505050565b81810182811015612db657fe5b92915050565b6040516114f080612dcd833901905600608060405234801561001057600080fd5b506040516020806114f0833981016040525160008054600160a060020a03191633179055600160a060020a038116151561004957600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055611478806100786000396000f3006080604052600436106100ec5763ffffffff60e060020a600035041662226eb5811461012857806301e336671461014f5780634e71e0c81461018d57806366013bdd146101a457806368c31649146101e3578063715018a61461020a57806374cd5c0b1461021f5780638da5cb5b1461025d5780638f4ffcb11461028e5780639373f432146102fe5780639bdd070d1461031f578063a901199014610358578063ab40340a14610370578063bfe370d914610397578063c5a88559146103f0578063c6786e5a14610405578063e30c39781461045a578063f2fde38b1461046f578063f3fef3a314610490575b6040805133815234602082015281517ff32a9f77675fd5917534c7746608fd3e309eac68fbdcbf5925e24ca97a704396929181900390910190a1005b34801561013457600080fd5b5061013d6104b4565b60408051918252519081900360200190f35b34801561015b57600080fd5b50610179600160a060020a03600435811690602435166044356104ba565b604080519115158252519081900360200190f35b34801561019957600080fd5b506101a26105ec565b005b3480156101b057600080fd5b50610179600160a060020a03600435811690602435811690604435906064358116906084359060a4359060c43516610674565b3480156101ef57600080fd5b50610179600160a060020a03600435166024356044356108a7565b34801561021657600080fd5b506101a2610bdf565b34801561022b57600080fd5b50610237600435610c4b565b60408051938452600160a060020a03909216602084015282820152519081900360600190f35b34801561026957600080fd5b50610272610ce2565b60408051600160a060020a039092168252519081900360200190f35b34801561029a57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526101a294600160a060020a03813581169560248035966044359093169536956084949201918190840183828082843750949750610cf19650505050505050565b34801561030a57600080fd5b50610179600160a060020a0360043516610f83565b34801561032b57600080fd5b50610179600160a060020a0360043581169060243581169060443590606435906084359060a43516610fe2565b34801561036457600080fd5b50610237600435611023565b34801561037c57600080fd5b506101a2600435600160a060020a0360243516604435611095565b3480156103a357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261013d9436949293602493928401919081908401838280828437509497506111789650505050505050565b3480156103fc57600080fd5b5061013d61117f565b34801561041157600080fd5b50604080516020600480358082013583810280860185019096528085526101a2953695939460249493850192918291850190849080828437509497506111859650505050505050565b34801561046657600080fd5b5061027261130c565b34801561047b57600080fd5b506101a2600160a060020a036004351661131b565b34801561049c57600080fd5b50610179600160a060020a0360043516602435611361565b60025490565b600080548190600160a060020a031633146104d457600080fd5b600160a060020a03841615156104e957600080fd5b600160a060020a03851615156104fe57600080fd5b50604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151869283169163a9059cbb9160448083019260209291908290030181600087803b15801561056b57600080fd5b505af115801561057f573d6000803e3d6000fd5b505050506040513d602081101561059557600080fd5b505060408051600160a060020a0380881682528616602082015280820185905290517f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f13049181900360600190a1506001949350505050565b600154600160a060020a0316331461060357600080fd5b60015460008054604051600160a060020a0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b6000805481908190600160a060020a0316331461069057600080fd5b600160a060020a03871615156106a557600080fd5b600160a060020a038a1615156106ba57600080fd5b8486116106c657600080fd5b6106d189878a6108a7565b15156106dc57600080fd5b8991506106ef868663ffffffff61141216565b905081600160a060020a031663a9059cbb88836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561075457600080fd5b505af1158015610768573d6000803e3d6000fd5b505050506040513d602081101561077e57600080fd5b5051151561078b57600080fd5b600160a060020a038416158015906107a35750600085115b156108425781600160a060020a031663a9059cbb85876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b505050506040513d602081101561083557600080fd5b5051151561084257600080fd5b61084d888883611095565b60408051600160a060020a03808d1682528916602082015280820183905290517f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f13049181900360600190a15060019998505050505050505050565b60008060008086925082600160a060020a0316637312aaae6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156108ee57600080fd5b505af1158015610902573d6000803e3d6000fd5b505050506040513d602081101561091857600080fd5b505186111561092657600080fd5b82600160a060020a03166314361fd16040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561096457600080fd5b505af1158015610978573d6000803e3d6000fd5b505050506040513d602081101561098e57600080fd5b505186101561099c57600080fd5b6109af856201518063ffffffff61142416565b6004549092508211610ae3576005546109cf90600163ffffffff61143916565b6005556006546109e5908763ffffffff61143916565b60046002018190555082600160a060020a031663f213aad26040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a2c57600080fd5b505af1158015610a40573d6000803e3d6000fd5b505050506040513d6020811015610a5657600080fd5b50516005541115610a6657600080fd5b82600160a060020a0316635e3cbb7c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610aa457600080fd5b505af1158015610ab8573d6000803e3d6000fd5b505050506040513d6020811015610ace57600080fd5b50516006541115610ade57600080fd5b610af3565b6004829055600160055560068690555b610b068562278d0063ffffffff61142416565b6007549091508111610bc257600854610b2690600163ffffffff61143916565b600855600954610b3c908763ffffffff61143916565b60076002018190555082600160a060020a031663be54f2146040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610b8357600080fd5b505af1158015610b97573d6000803e3d6000fd5b505050506040513d6020811015610bad57600080fd5b50516009541115610bbd57600080fd5b610bd2565b6007819055600160085560098690555b5060019695505050505050565b600054600160a060020a03163314610bf657600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600354600090819081908410610c6057600080fd5b6003805485908110610c6e57fe5b906000526020600020906003020160000154600385815481101515610c8f57fe5b906000526020600020906003020160010160009054906101000a9004600160a060020a0316600386815481101515610cc357fe5b9060005260206000209060030201600201549250925092509193909250565b600054600160a060020a031681565b600080548190600160a060020a03163314610d0b57600080fd5b600160a060020a0384161515610d2057600080fd5b600160a060020a0386161515610d3557600080fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152306024830152604482018890529151869450918416916323b872dd916064808201926020929091908290030181600087803b158015610daa57600080fd5b505af1158015610dbe573d6000803e3d6000fd5b505050506040513d6020811015610dd457600080fd5b50511515610de157600080fd5b610dea83611178565b6040805160608082018352838252600160a060020a038a811660208085018281528587018d815260028054600181018255600091825297517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace60039099029889015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf8801805473ffffffffffffffffffffffffffffffffffffffff1916918716919091179055517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad09096019590955585519182528181018c9052918a1694810194909452608091840182815288519285019290925287519495507f3bc54c6dcf5be6793947a9f34e5ca45d6ce9196bea304a5550c3e2d2f2156502948b948b948b948b949293909260a085019290860191908190849084905b83811015610f3e578181015183820152602001610f26565b50505050905090810190601f168015610f6b5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1505050505050565b60008054600160a060020a03163314610f9b57600080fd5b600160a060020a0382161515610fb057600080fd5b50600a8054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff199091161790556001919050565b60008054600160a060020a03163314610ffa57600080fd5b600a5461101890889088908890600160a060020a0316888888610674565b979650505050505050565b60025460009081908190841061103857600080fd5b600280548590811061104657fe5b90600052602060002090600302016000015460028581548110151561106757fe5b600091825260209091206001600390920201015460028054600160a060020a039092169187908110610cc357fe5b600054600160a060020a031633146110ac57600080fd5b60408051606081018252938452600160a060020a039283166020850190815290840191825260038054600181018255600082905294517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9590910294850155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c8401805473ffffffffffffffffffffffffffffffffffffffff19169190931617909155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d90910155565b6020015190565b60035490565b6000805481908190600160a060020a031633146111a157600080fd5b600092505b83518310156112fe5783838151811015156111bd57fe5b6020908102909101810151604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450600160a060020a038516926370a08231926024808401938290030181600087803b15801561122757600080fd5b505af115801561123b573d6000803e3d6000fd5b505050506040513d602081101561125157600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b1580156112c757600080fd5b505af11580156112db573d6000803e3d6000fd5b505050506040513d60208110156112f157600080fd5b50506001909201916111a6565b600054600160a060020a0316ff5b600154600160a060020a031681565b600054600160a060020a0316331461133257600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008054600160a060020a0316331461137957600080fd5b600160a060020a038316151561138e57600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f193505050501580156113c4573d6000803e3d6000fd5b5060408051600160a060020a03851681526020810184905281517fdb35132c111efe920cede025e819975671cfd1b8fcc1174762c8670c4e94c211929181900390910190a150600192915050565b60008282111561141e57fe5b50900390565b6000818381151561143157fe5b049392505050565b8181018281101561144657fe5b929150505600a165627a7a723058201ab45f0d83bc4a86f553ee7cfb1a907c30c9cf11de4bf4cf21e9a2d55eae5c420029a165627a7a72305820712a232f462a2374baadf9e545d65a9fb8b18f294852f8502b5b4969c86922710029

Swarm Source

bzzr://712a232f462a2374baadf9e545d65a9fb8b18f294852f8502b5b4969c8692271

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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