ETH Price: $3,085.81 (-4.92%)
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction and > 10 Token Transfers found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
111972172020-11-05 12:28:261550 days ago1604579306  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Tranche

Compiler Version
v0.5.15+commit.6a57276f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-10
*/

// Verified using https://dapp.tools

// hevm: flattened sources of src/lender/tranche.sol
pragma solidity >=0.5.15 >=0.5.15 <0.6.0;
pragma experimental ABIEncoderV2;

////// lib/tinlake-auth/lib/ds-note/src/note.sol
/// note.sol -- the `note' modifier, for logging calls as events

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
/* pragma solidity >=0.5.15; */

contract DSNote {
    event LogNote(
        bytes4   indexed  sig,
        address  indexed  guy,
        bytes32  indexed  foo,
        bytes32  indexed  bar,
        uint256           wad,
        bytes             fax
    ) anonymous;

    modifier note {
        bytes32 foo;
        bytes32 bar;
        uint256 wad;

        assembly {
            foo := calldataload(4)
            bar := calldataload(36)
            wad := callvalue()
        }

        _;

        emit LogNote(msg.sig, msg.sender, foo, bar, wad, msg.data);
    }
}

////// lib/tinlake-auth/src/auth.sol
// Copyright (C) Centrifuge 2020, based on MakerDAO dss https://github.com/makerdao/dss
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

/* pragma solidity >=0.5.15 <0.6.0; */

/* import "ds-note/note.sol"; */

contract Auth is DSNote {
    mapping (address => uint) public wards;
    function rely(address usr) public auth note { wards[usr] = 1; }
    function deny(address usr) public auth note { wards[usr] = 0; }
    modifier auth { require(wards[msg.sender] == 1); _; }
}

////// lib/tinlake-math/src/math.sol
// Copyright (C) 2018 Rain <[email protected]>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

/* pragma solidity >=0.5.15 <0.6.0; */

contract Math {
    uint256 constant ONE = 10 ** 27;

    function safeAdd(uint x, uint y) public pure returns (uint z) {
        require((z = x + y) >= x, "safe-add-failed");
    }

    function safeSub(uint x, uint y) public pure returns (uint z) {
        require((z = x - y) <= x, "safe-sub-failed");
    }

    function safeMul(uint x, uint y) public pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, "safe-mul-failed");
    }

    function safeDiv(uint x, uint y) public pure returns (uint z) {
        z = x / y;
    }

    function rmul(uint x, uint y) public pure returns (uint z) {
        z = safeMul(x, y) / ONE;
    }

    function rdiv(uint x, uint y) public pure returns (uint z) {
        require(y > 0, "division by zero");
        z = safeAdd(safeMul(x, ONE), y / 2) / y;
    }

    function rdivup(uint x, uint y) internal pure returns (uint z) {
        require(y > 0, "division by zero");
        // always rounds up
        z = safeAdd(safeMul(x, ONE), safeSub(y, 1)) / y;
    }


}

////// src/fixed_point.sol
// Copyright (C) 2020 Centrifuge
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

/* pragma solidity >=0.5.15 <0.6.0; */

contract FixedPoint {
    struct Fixed27 {
        uint value;
    }
}

////// src/lender/tranche.sol
// Copyright (C) 2020 Centrifuge
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

/* pragma solidity >=0.5.15 <0.6.0; */
/* pragma experimental ABIEncoderV2; */

/* import "tinlake-auth/auth.sol"; */
/* import "tinlake-math/math.sol"; */
/* import "./../fixed_point.sol"; */

interface ERC20Like_2 {
    function balanceOf(address) external view returns (uint);
    function transferFrom(address, address, uint) external returns (bool);
    function mint(address, uint) external;
    function burn(address, uint) external;
    function totalSupply() external view returns (uint);
    function approve(address usr, uint amount) external;
}

interface ReserveLike_3 {
    function deposit(uint amount) external;
    function payout(uint amount) external;
    function totalBalance() external returns (uint);
}

interface EpochTickerLike {
    function currentEpoch() external view returns (uint);
    function lastEpochExecuted() external view returns(uint);
}

contract Tranche is Math, Auth, FixedPoint {
    mapping(uint => Epoch) public epochs;

    struct Epoch {
        // denominated in 10^27
        // percentage ONE == 100%
        Fixed27 redeemFulfillment;
        // denominated in 10^27
        // percentage ONE == 100%
        Fixed27 supplyFulfillment;
        // tokenPrice after end of epoch
        Fixed27 tokenPrice;
    }

    struct UserOrder {
        uint orderedInEpoch;
        uint supplyCurrencyAmount;
        uint redeemTokenAmount;
    }

    mapping(address => UserOrder) public users;

    uint public  totalSupply;
    uint public  totalRedeem;

    ERC20Like_2 public currency;
    ERC20Like_2 public token;
    ReserveLike_3 public reserve;
    EpochTickerLike public epochTicker;

    address self;

    bool public waitingForUpdate = false;

    modifier orderAllowed(address usr) {
        require((users[usr].supplyCurrencyAmount == 0 && users[usr].redeemTokenAmount == 0)
        || users[usr].orderedInEpoch == epochTicker.currentEpoch(), "disburse required");
        _;
    }

    constructor(address currency_, address token_) public {
        wards[msg.sender] = 1;
        token = ERC20Like_2(token_);
        currency = ERC20Like_2(currency_);
        self = address(this);
    }

    function balance() external view returns (uint) {
        return currency.balanceOf(self);
    }

    function tokenSupply() external view returns (uint) {
        return token.totalSupply();
    }

    function depend(bytes32 contractName, address addr) public auth {
        if (contractName == "token") {token = ERC20Like_2(addr);}
        else if (contractName == "currency") {currency = ERC20Like_2(addr);}
        else if (contractName == "reserve") {reserve = ReserveLike_3(addr);}
        else if (contractName == "epochTicker") {epochTicker = EpochTickerLike(addr);}
        else revert();
    }

    // supplyOrder function can be used to place or revoke an supply
    function supplyOrder(address usr, uint newSupplyAmount) public auth orderAllowed(usr) {
        users[usr].orderedInEpoch = epochTicker.currentEpoch();

        uint currentSupplyAmount = users[usr].supplyCurrencyAmount;

        users[usr].supplyCurrencyAmount = newSupplyAmount;

        totalSupply = safeAdd(safeTotalSub(totalSupply, currentSupplyAmount), newSupplyAmount);

        if (newSupplyAmount > currentSupplyAmount) {
            uint delta = safeSub(newSupplyAmount, currentSupplyAmount);
            require(currency.transferFrom(usr, self, delta), "currency-transfer-failed");
            return;
        }
        uint delta = safeSub(currentSupplyAmount, newSupplyAmount);
        if (delta > 0) {
            _safeTransfer(currency, usr, delta);
        }
    }

    // redeemOrder function can be used to place or revoke a redeem
    function redeemOrder(address usr, uint newRedeemAmount) public auth orderAllowed(usr) {
        users[usr].orderedInEpoch = epochTicker.currentEpoch();

        uint currentRedeemAmount = users[usr].redeemTokenAmount;
        users[usr].redeemTokenAmount = newRedeemAmount;
        totalRedeem = safeAdd(safeTotalSub(totalRedeem, currentRedeemAmount), newRedeemAmount);

        if (newRedeemAmount > currentRedeemAmount) {
            uint delta = safeSub(newRedeemAmount, currentRedeemAmount);
            require(token.transferFrom(usr, self, delta), "token-transfer-failed");
            return;
        }

        uint delta = safeSub(currentRedeemAmount, newRedeemAmount);
        if (delta > 0) {
            _safeTransfer(token, usr, delta);
        }
    }

    function calcDisburse(address usr) public view returns(uint payoutCurrencyAmount, uint payoutTokenAmount, uint remainingSupplyCurrency, uint remainingRedeemToken) {
        return calcDisburse(usr, epochTicker.lastEpochExecuted());
    }

    ///  calculates the current disburse of a user starting from the ordered epoch until endEpoch
    function calcDisburse(address usr, uint endEpoch) public view returns(uint payoutCurrencyAmount, uint payoutTokenAmount, uint remainingSupplyCurrency, uint remainingRedeemToken) {
        uint epochIdx = users[usr].orderedInEpoch;
        uint lastEpochExecuted = epochTicker.lastEpochExecuted();

        // no disburse possible in this epoch
        if (users[usr].orderedInEpoch == epochTicker.currentEpoch()) {
            return (payoutCurrencyAmount, payoutTokenAmount, users[usr].supplyCurrencyAmount, users[usr].redeemTokenAmount);
        }

        if (endEpoch > lastEpochExecuted) {
            // it is only possible to disburse epochs which are already over
            endEpoch = lastEpochExecuted;
        }

        remainingSupplyCurrency = users[usr].supplyCurrencyAmount;
        remainingRedeemToken = users[usr].redeemTokenAmount;
        uint amount = 0;

        // calculates disburse amounts as long as remaining tokens or currency is left or the end epoch is reached
        while(epochIdx <= endEpoch && (remainingSupplyCurrency != 0 || remainingRedeemToken != 0 )){
            if(remainingSupplyCurrency != 0) {
                amount = rmul(remainingSupplyCurrency, epochs[epochIdx].supplyFulfillment.value);
                // supply currency payout in token
                if (amount != 0) {
                    payoutTokenAmount = safeAdd(payoutTokenAmount, safeDiv(safeMul(amount, ONE), epochs[epochIdx].tokenPrice.value));
                    remainingSupplyCurrency = safeSub(remainingSupplyCurrency, amount);
                }
            }

            if(remainingRedeemToken != 0) {
                amount = rmul(remainingRedeemToken, epochs[epochIdx].redeemFulfillment.value);
                // redeem token payout in currency
                if (amount != 0) {
                    payoutCurrencyAmount = safeAdd(payoutCurrencyAmount, rmul(amount, epochs[epochIdx].tokenPrice.value));
                    remainingRedeemToken = safeSub(remainingRedeemToken, amount);
                }
            }
            epochIdx = safeAdd(epochIdx, 1);
        }

        return (payoutCurrencyAmount, payoutTokenAmount, remainingSupplyCurrency, remainingRedeemToken);
    }

    // the disburse function can be used after an epoch is over to receive currency and tokens
    function disburse(address usr) public auth returns (uint payoutCurrencyAmount, uint payoutTokenAmount, uint remainingSupplyCurrency, uint remainingRedeemToken) {
       return disburse(usr, epochTicker.lastEpochExecuted());
    }

    function _safeTransfer(ERC20Like_2 erc20, address usr, uint amount) internal {
        uint max = erc20.balanceOf(self);
        if(amount > max) {
            amount = max;
        }
        require(erc20.transferFrom(self, usr, amount), "token-transfer-failed");
    }

    // the disburse function can be used after an epoch is over to receive currency and tokens
    function disburse(address usr,  uint endEpoch) public auth returns (uint payoutCurrencyAmount, uint payoutTokenAmount, uint remainingSupplyCurrency, uint remainingRedeemToken) {
        require(users[usr].orderedInEpoch <= epochTicker.lastEpochExecuted(), "epoch-not-executed-yet");

        uint lastEpochExecuted = epochTicker.lastEpochExecuted();

        if (endEpoch > lastEpochExecuted) {
            // it is only possible to disburse epochs which are already over
            endEpoch = lastEpochExecuted;
        }

        (payoutCurrencyAmount, payoutTokenAmount,
         remainingSupplyCurrency, remainingRedeemToken) = calcDisburse(usr, endEpoch);
        users[usr].supplyCurrencyAmount = remainingSupplyCurrency;
        users[usr].redeemTokenAmount = remainingRedeemToken;
        // if lastEpochExecuted is disbursed, orderInEpoch is at the current epoch again
        // which allows to change the order. This is only possible if all previous epochs are disbursed
        users[usr].orderedInEpoch = safeAdd(endEpoch, 1);


        if (payoutCurrencyAmount > 0) {
            _safeTransfer(currency, usr, payoutCurrencyAmount);
        }

        if (payoutTokenAmount > 0) {
            _safeTransfer(token, usr, payoutTokenAmount);
        }
        return (payoutCurrencyAmount, payoutTokenAmount, remainingSupplyCurrency, remainingRedeemToken);
    }

    // called by epoch coordinator in epoch execute method
    function epochUpdate(uint epochID, uint supplyFulfillment_, uint redeemFulfillment_, uint tokenPrice_, uint epochSupplyOrderCurrency, uint epochRedeemOrderCurrency) public auth {
        require(waitingForUpdate == true);
        waitingForUpdate = false;

        epochs[epochID].supplyFulfillment.value = supplyFulfillment_;
        epochs[epochID].redeemFulfillment.value = redeemFulfillment_;
        epochs[epochID].tokenPrice.value = tokenPrice_;

        // currency needs to be converted to tokenAmount with current token price
        uint redeemInToken = 0;
        uint supplyInToken = 0;
        if(tokenPrice_ > 0) {
            supplyInToken = rdiv(epochSupplyOrderCurrency, tokenPrice_);
            redeemInToken = safeDiv(safeMul(epochRedeemOrderCurrency, ONE), tokenPrice_);
        }

        // calculates the delta between supply and redeem for tokens and burn or mint them
        adjustTokenBalance(epochID, supplyInToken, redeemInToken);
        // calculates the delta between supply and redeem for currency and deposit or get them from the reserve
        adjustCurrencyBalance(epochID, epochSupplyOrderCurrency, epochRedeemOrderCurrency);

        // the unfulfilled orders (1-fulfillment) is automatically ordered
        totalSupply = safeAdd(safeTotalSub(totalSupply, epochSupplyOrderCurrency), rmul(epochSupplyOrderCurrency, safeSub(ONE, epochs[epochID].supplyFulfillment.value)));
        totalRedeem = safeAdd(safeTotalSub(totalRedeem, redeemInToken), rmul(redeemInToken, safeSub(ONE, epochs[epochID].redeemFulfillment.value)));
    }
    function closeEpoch() public auth returns (uint totalSupplyCurrency_, uint totalRedeemToken_) {
        require(waitingForUpdate == false);
        waitingForUpdate = true;
        return (totalSupply, totalRedeem);
    }

    function safeBurn(uint tokenAmount) internal {
        uint max = token.balanceOf(self);
        if(tokenAmount > max) {
            tokenAmount = max;
        }
        token.burn(self, tokenAmount);
    }

    function safePayout(uint currencyAmount) internal {
        uint max = reserve.totalBalance();
        if(currencyAmount > max) {
            currencyAmount = max;
        }
        reserve.payout(currencyAmount);
    }

    // adjust token balance after epoch execution -> min/burn tokens
    function adjustTokenBalance(uint epochID, uint epochSupplyToken, uint epochRedeemToken) internal {
        // mint token amount for supply

        uint mintAmount = 0;
        if (epochs[epochID].tokenPrice.value > 0) {
            mintAmount = rmul(epochSupplyToken, epochs[epochID].supplyFulfillment.value);
        }

      // burn token amount for redeem
        uint burnAmount = rmul(epochRedeemToken, epochs[epochID].redeemFulfillment.value);
       // burn tokens that are not needed for disbursement
        if (burnAmount > mintAmount) {
            uint diff = safeSub(burnAmount, mintAmount);
            safeBurn(diff);
            return;
        }
        // mint tokens that are required for disbursement
        uint diff = safeSub(mintAmount, burnAmount);
        if (diff > 0) {
            token.mint(self, diff);
        }
    }

    // additional minting of tokens produces a dilution of all token holders
    // interface is required for adapters
    function mint(address usr, uint amount) public auth {
        token.mint(usr, amount);
    }

    // adjust currency balance after epoch execution -> receive/send currency from/to reserve
    function adjustCurrencyBalance(uint epochID, uint epochSupply, uint epochRedeem) internal {
        // currency that was supplied in this epoch
        uint currencySupplied = rmul(epochSupply, epochs[epochID].supplyFulfillment.value);
        // currency required for redemption
        uint currencyRequired = rmul(epochRedeem, epochs[epochID].redeemFulfillment.value);

        if (currencySupplied > currencyRequired) {
            // send surplus currency to reserve
            uint diff = safeSub(currencySupplied, currencyRequired);
            currency.approve(address(reserve), diff);
            reserve.deposit(diff);
            return;
        }
        uint diff = safeSub(currencyRequired, currencySupplied);
        if (diff > 0) {
            // get missing currency from reserve
            safePayout(diff);
        }
    }

    // recovery transfer can be used by governance to recover funds if tokens are stuck
    function authTransfer(address erc20, address usr, uint amount) public auth {
        ERC20Like_2(erc20).transferFrom(self, usr, amount);
    }

    // due to rounding in token & currency conversions currency & token balances might be off by 1 wei with the totalSupply/totalRedeem amounts.
    // in order to prevent an underflow error, 0 is returned when amount to be subtracted is bigger then the total value.
    function safeTotalSub(uint total, uint amount) internal returns (uint) {
        if (total < amount) {
            return 0;
        }
        return safeSub(total, amount);
    } 
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"currency_","type":"address"},{"internalType":"address","name":"token_","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"guy","type":"address"},{"indexed":true,"internalType":"bytes32","name":"foo","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"bar","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"fax","type":"bytes"}],"name":"LogNote","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"erc20","type":"address"},{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"authTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"calcDisburse","outputs":[{"internalType":"uint256","name":"payoutCurrencyAmount","type":"uint256"},{"internalType":"uint256","name":"payoutTokenAmount","type":"uint256"},{"internalType":"uint256","name":"remainingSupplyCurrency","type":"uint256"},{"internalType":"uint256","name":"remainingRedeemToken","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"endEpoch","type":"uint256"}],"name":"calcDisburse","outputs":[{"internalType":"uint256","name":"payoutCurrencyAmount","type":"uint256"},{"internalType":"uint256","name":"payoutTokenAmount","type":"uint256"},{"internalType":"uint256","name":"remainingSupplyCurrency","type":"uint256"},{"internalType":"uint256","name":"remainingRedeemToken","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"closeEpoch","outputs":[{"internalType":"uint256","name":"totalSupplyCurrency_","type":"uint256"},{"internalType":"uint256","name":"totalRedeemToken_","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"currency","outputs":[{"internalType":"contract ERC20Like_2","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"deny","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"contractName","type":"bytes32"},{"internalType":"address","name":"addr","type":"address"}],"name":"depend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"disburse","outputs":[{"internalType":"uint256","name":"payoutCurrencyAmount","type":"uint256"},{"internalType":"uint256","name":"payoutTokenAmount","type":"uint256"},{"internalType":"uint256","name":"remainingSupplyCurrency","type":"uint256"},{"internalType":"uint256","name":"remainingRedeemToken","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"endEpoch","type":"uint256"}],"name":"disburse","outputs":[{"internalType":"uint256","name":"payoutCurrencyAmount","type":"uint256"},{"internalType":"uint256","name":"payoutTokenAmount","type":"uint256"},{"internalType":"uint256","name":"remainingSupplyCurrency","type":"uint256"},{"internalType":"uint256","name":"remainingRedeemToken","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"epochTicker","outputs":[{"internalType":"contract EpochTickerLike","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"epochID","type":"uint256"},{"internalType":"uint256","name":"supplyFulfillment_","type":"uint256"},{"internalType":"uint256","name":"redeemFulfillment_","type":"uint256"},{"internalType":"uint256","name":"tokenPrice_","type":"uint256"},{"internalType":"uint256","name":"epochSupplyOrderCurrency","type":"uint256"},{"internalType":"uint256","name":"epochRedeemOrderCurrency","type":"uint256"}],"name":"epochUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"epochs","outputs":[{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct FixedPoint.Fixed27","name":"redeemFulfillment","type":"tuple"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct FixedPoint.Fixed27","name":"supplyFulfillment","type":"tuple"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct FixedPoint.Fixed27","name":"tokenPrice","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"rdiv","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"newRedeemAmount","type":"uint256"}],"name":"redeemOrder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"rely","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reserve","outputs":[{"internalType":"contract ReserveLike_3","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"rmul","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"safeAdd","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"safeDiv","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"safeMul","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"safeSub","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"newSupplyAmount","type":"uint256"}],"name":"supplyOrder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"contract ERC20Like_2","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"orderedInEpoch","type":"uint256"},{"internalType":"uint256","name":"supplyCurrencyAmount","type":"uint256"},{"internalType":"uint256","name":"redeemTokenAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"waitingForUpdate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040526000600960146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405162003b9938038062003b99833981810160405262000052919081019062000178565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555030600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000207565b6000815190506200017281620001ed565b92915050565b600080604083850312156200018c57600080fd5b60006200019c8582860162000161565b9250506020620001af8582860162000161565b9150509250929050565b6000620001c682620001cd565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620001f881620001b9565b81146200020457600080fd5b50565b61398280620002176000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80639adc339d1161010f578063cd3293de116100a2578063e6cb901311610071578063e6cb9013146105d8578063ed12a99c14610608578063f5a09bb414610626578063fc0c546a14610659576101e5565b8063cd3293de1461054d578063cdd5f2c81461056b578063d05c78da1461058a578063e5a6b10f146105ba576101e5565b8063b5931f7c116100de578063b5931f7c1461049d578063b69ef8a8146104cd578063bf353dbb146104eb578063c6b61e4c1461051b576101e5565b80639adc339d146104035780639c52a7f11461041f578063a293d1e81461043b578063a87430ba1461046b576101e5565b806367457022116101875780637824407f116101565780637824407f146103785780637f3bd56e146103965780638be03ca1146103c95780638d060dfa146103e5576101e5565b806367457022146102dd57806369c7a0511461030d57806373cd07831461034057806374299b5a1461035c576101e5565b80631c8ce890116101c35780631c8ce890146102565780632edd29761461028957806340c10f19146102a557806365fae35e146102c1576101e5565b8063078c74c3146101ea5780630e2286d31461020857806318160ddd14610238575b600080fd5b6101f2610677565b6040516101ff91906136f1565b60405180910390f35b610222600480360361021d919081019061315c565b61067d565b60405161022f91906136f1565b60405180910390f35b6102406106fb565b60405161024d91906136f1565b60405180910390f35b610270600480360361026b9190810190612ff1565b610701565b604051610280949392919061379e565b60405180910390f35b6102a3600480360361029e9190810190613069565b61080a565b005b6102bf60048036036102ba9190810190613069565b610d1f565b005b6102db60048036036102d69190810190612ff1565b610dfd565b005b6102f760048036036102f2919081019061315c565b610f1c565b60405161030491906136f1565b60405180910390f35b61032760048036036103229190810190612ff1565b610f45565b604051610337949392919061379e565b60405180910390f35b61035a6004803603610355919081019061301a565b611003565b005b61037660048036036103719190810190613069565b611105565b005b61038061161a565b60405161038d91906136f1565b60405180910390f35b6103b060048036036103ab9190810190613069565b6116c1565b6040516103c0949392919061379e565b60405180910390f35b6103e360048036036103de9190810190613198565b611a63565b005b6103ed611c48565b6040516103fa919061354e565b60405180910390f35b61041d600480360361041891908101906130ce565b611c5b565b005b61043960048036036104349190810190612ff1565b611e6a565b005b6104556004803603610450919081019061315c565b611f89565b60405161046291906136f1565b60405180910390f35b61048560048036036104809190810190612ff1565b611fd9565b60405161049493929190613767565b60405180910390f35b6104b760048036036104b2919081019061315c565b612003565b6040516104c491906136f1565b60405180910390f35b6104d5612017565b6040516104e291906136f1565b60405180910390f35b61050560048036036105009190810190612ff1565b6120eb565b60405161051291906136f1565b60405180910390f35b6105356004803603610530919081019061310a565b612103565b604051610544939291906136ba565b60405180910390f35b610555612169565b604051610562919061359f565b60405180910390f35b61057361218f565b60405161058192919061373e565b60405180910390f35b6105a4600480360361059f919081019061315c565b612226565b6040516105b191906136f1565b60405180910390f35b6105c2612288565b6040516105cf9190613569565b60405180910390f35b6105f260048036036105ed919081019061315c565b6122ae565b6040516105ff91906136f1565b60405180910390f35b6106106122fe565b60405161061d9190613584565b60405180910390f35b610640600480360361063b9190810190613069565b612324565b604051610650949392919061379e565b60405180910390f35b610661612775565b60405161066e9190613569565b60405180910390f35b60045481565b60008082116106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b89061367a565b60405180910390fd5b816106eb6106db856b033b2e3c9fd0803ce8000000612226565b600285816106e557fe5b046122ae565b816106f257fe5b04905092915050565b60035481565b60008060008060016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461075257600080fd5b6107fb85600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364c1cf336040518163ffffffff1660e01b815260040160206040518083038186803b1580156107be57600080fd5b505afa1580156107d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107f69190810190613133565b6116c1565b93509350935093509193509193565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461085557600080fd5b816000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541480156108ea57506000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154145b806109d55750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663766718086040518163ffffffff1660e01b815260040160206040518083038186803b15801561095857600080fd5b505afa15801561096c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109909190810190613133565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b906135da565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663766718086040518163ffffffff1660e01b815260040160206040518083038186803b158015610a7c57600080fd5b505afa158015610a90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ab49190810190613133565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905082600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550610b9d610b976004548361279b565b846122ae565b60048190555080831115610cd2576000610bb78483611f89565b9050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd86600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401610c3a939291906134ee565b602060405180830381600087803b158015610c5457600080fd5b505af1158015610c68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c8c91908101906130a5565b610ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc2906135ba565b60405180910390fd5b5050610d1a565b6000610cde8285611f89565b90506000811115610d1757610d16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686836127c1565b5b50505b505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610d6a57600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401610dc7929190613525565b600060405180830381600087803b158015610de157600080fd5b505af1158015610df5573d6000803e3d6000fd5b505050505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610e4857600080fd5b60008060006004359250602435915034905060016000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081833373ffffffffffffffffffffffffffffffffffffffff166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684600036604051610f0e9392919061370c565b60405180910390a450505050565b60006b033b2e3c9fd0803ce8000000610f358484612226565b81610f3c57fe5b04905092915050565b600080600080610ff485600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364c1cf336040518163ffffffff1660e01b815260040160206040518083038186803b158015610fb757600080fd5b505afa158015610fcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fef9190810190613133565b612324565b93509350935093509193509193565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461104e57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846040518463ffffffff1660e01b81526004016110ad939291906134ee565b602060405180830381600087803b1580156110c757600080fd5b505af11580156110db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110ff91908101906130a5565b50505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461115057600080fd5b816000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541480156111e557506000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154145b806112d05750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663766718086040518163ffffffff1660e01b815260040160206040518083038186803b15801561125357600080fd5b505afa158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061128b9190810190613133565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b61130f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611306906135da565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663766718086040518163ffffffff1660e01b815260040160206040518083038186803b15801561137757600080fd5b505afa15801561138b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113af9190810190613133565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905082600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506114986114926003548361279b565b846122ae565b600381905550808311156115cd5760006114b28483611f89565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd86600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401611535939291906134ee565b602060405180830381600087803b15801561154f57600080fd5b505af1158015611563573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061158791908101906130a5565b6115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd9061361a565b60405180910390fd5b5050611615565b60006115d98285611f89565b9050600081111561161257611611600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686836127c1565b5b50505b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561168457600080fd5b505afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116bc9190810190613133565b905090565b60008060008060016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461171257600080fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364c1cf336040518163ffffffff1660e01b815260040160206040518083038186803b15801561177a57600080fd5b505afa15801561178e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117b29190810190613133565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d9061365a565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364c1cf336040518163ffffffff1660e01b815260040160206040518083038186803b1580156118a057600080fd5b505afa1580156118b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118d89190810190613133565b9050808611156118e6578095505b6118f08787612324565b8095508196508297508398505050505082600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506119998660016122ae565b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000851115611a1657611a15600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688876127c1565b5b6000841115611a4d57611a4c600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688866127c1565b5b8484848494509450945094505092959194509250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611aae57600080fd5b60011515600960149054906101000a900460ff16151514611ace57600080fd5b6000600960146101000a81548160ff021916908315150217905550846001600088815260200190815260200160002060010160000181905550836001600088815260200190815260200160002060000160000181905550826001600088815260200190815260200160002060020160000181905550600080905060008090506000851115611b8457611b60848661067d565b9050611b81611b7b846b033b2e3c9fd0803ce8000000612226565b86612003565b91505b611b8f888284612972565b611b9a888585612adf565b611be6611ba96003548661279b565b611be186611bdc6b033b2e3c9fd0803ce8000000600160008f815260200190815260200160002060010160000154611f89565b610f1c565b6122ae565b600381905550611c38611bfb6004548461279b565b611c3384611c2e6b033b2e3c9fd0803ce8000000600160008f815260200190815260200160002060000160000154611f89565b610f1c565b6122ae565b6004819055505050505050505050565b600960149054906101000a900460ff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611ca657600080fd5b7f746f6b656e000000000000000000000000000000000000000000000000000000821415611d145780600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e66565b7f63757272656e6379000000000000000000000000000000000000000000000000821415611d825780600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e65565b7f7265736572766500000000000000000000000000000000000000000000000000821415611df05780600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e64565b7f65706f63685469636b6572000000000000000000000000000000000000000000821415611e5e5780600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e63565b600080fd5b5b5b5b5050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611eb557600080fd5b60008060006004359250602435915034905060008060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081833373ffffffffffffffffffffffffffffffffffffffff166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684600036604051611f7b9392919061370c565b60405180910390a450505050565b6000828284039150811115611fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fca9061369a565b60405180910390fd5b92915050565b60026020528060005260406000206000915090508060000154908060010154908060020154905083565b600081838161200e57fe5b04905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161209691906134d3565b60206040518083038186803b1580156120ae57600080fd5b505afa1580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120e69190810190613133565b905090565b60006020528060005260406000206000915090505481565b60016020528060005260406000206000915090508060000160405180602001604052908160008201548152505090806001016040518060200160405290816000820154815250509080600201604051806020016040529081600082015481525050905083565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146121dd57600080fd5b60001515600960149054906101000a900460ff161515146121fd57600080fd5b6001600960146101000a81548160ff021916908315150217905550600354600454915091509091565b600080821480612243575082828385029250828161224057fe5b04145b612282576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612279906135fa565b60405180910390fd5b92915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282840191508110156122f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ef9061363a565b60405180910390fd5b92915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364c1cf336040518163ffffffff1660e01b815260040160206040518083038186803b1580156123db57600080fd5b505afa1580156123ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124139190810190613133565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663766718086040518163ffffffff1660e01b815260040160206040518083038186803b15801561247d57600080fd5b505afa158015612491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124b59190810190613133565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415612595578585600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549550955095509550505061276c565b808711156125a1578096505b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549350600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154925060008090505b87831115801561264e575060008514158061264d575060008414155b5b1561275c57600085146126d95761267e856001600086815260200190815260200160002060010160000154610f1c565b9050600081146126d8576126c9866126c46126a5846b033b2e3c9fd0803ce8000000612226565b6001600088815260200190815260200160002060020160000154612003565b6122ae565b95506126d58582611f89565b94505b5b6000841461274a57612704846001600086815260200190815260200160002060000160000154610f1c565b9050600081146127495761273a87612735836001600088815260200190815260200160002060020160000154610f1c565b6122ae565b96506127468482611f89565b93505b5b6127558360016122ae565b9250612631565b8686868696509650965096505050505b92959194509250565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000818310156127ae57600090506127bb565b6127b88383611f89565b90505b92915050565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161281e91906134d3565b60206040518083038186803b15801561283657600080fd5b505afa15801561284a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061286e9190810190613133565b90508082111561287c578091505b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685856040518463ffffffff1660e01b81526004016128db939291906134ee565b602060405180830381600087803b1580156128f557600080fd5b505af1158015612909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061292d91908101906130a5565b61296c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612963906135ba565b60405180910390fd5b50505050565b60008090506000600160008681526020019081526020016000206002016000015411156129bf576129bc836001600087815260200190815260200160002060010160000154610f1c565b90505b60006129e4836001600088815260200190815260200160002060000160000154610f1c565b905081811115612a0d5760006129fa8284611f89565b9050612a0581612cb3565b505050612ada565b6000612a198383611f89565b90506000811115612ad657600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612aa3929190613525565b600060405180830381600087803b158015612abd57600080fd5b505af1158015612ad1573d6000803e3d6000fd5b505050505b5050505b505050565b6000612b04836001600087815260200190815260200160002060010160000154610f1c565b90506000612b2b836001600088815260200190815260200160002060000160000154610f1c565b905080821115612c89576000612b418383611f89565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612bc2929190613525565b600060405180830381600087803b158015612bdc57600080fd5b505af1158015612bf0573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6b55f25826040518263ffffffff1660e01b8152600401612c4f91906136f1565b600060405180830381600087803b158015612c6957600080fd5b505af1158015612c7d573d6000803e3d6000fd5b50505050505050612cae565b6000612c958284611f89565b90506000811115612caa57612ca981612e45565b5b5050505b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401612d3291906134d3565b60206040518083038186803b158015612d4a57600080fd5b505afa158015612d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d829190810190613133565b905080821115612d90578091505b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612e0f929190613525565b600060405180830381600087803b158015612e2957600080fd5b505af1158015612e3d573d6000803e3d6000fd5b505050505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad7a672f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612eb157600080fd5b505af1158015612ec5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612ee99190810190613133565b905080821115612ef7578091505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1152343836040518263ffffffff1660e01b8152600401612f5291906136f1565b600060405180830381600087803b158015612f6c57600080fd5b505af1158015612f80573d6000803e3d6000fd5b505050505050565b600081359050612f97816138e3565b92915050565b600081519050612fac816138fa565b92915050565b600081359050612fc181613911565b92915050565b600081359050612fd681613928565b92915050565b600081519050612feb81613928565b92915050565b60006020828403121561300357600080fd5b600061301184828501612f88565b91505092915050565b60008060006060848603121561302f57600080fd5b600061303d86828701612f88565b935050602061304e86828701612f88565b925050604061305f86828701612fc7565b9150509250925092565b6000806040838503121561307c57600080fd5b600061308a85828601612f88565b925050602061309b85828601612fc7565b9150509250929050565b6000602082840312156130b757600080fd5b60006130c584828501612f9d565b91505092915050565b600080604083850312156130e157600080fd5b60006130ef85828601612fb2565b925050602061310085828601612f88565b9150509250929050565b60006020828403121561311c57600080fd5b600061312a84828501612fc7565b91505092915050565b60006020828403121561314557600080fd5b600061315384828501612fdc565b91505092915050565b6000806040838503121561316f57600080fd5b600061317d85828601612fc7565b925050602061318e85828601612fc7565b9150509250929050565b60008060008060008060c087890312156131b157600080fd5b60006131bf89828a01612fc7565b96505060206131d089828a01612fc7565b95505060406131e189828a01612fc7565b94505060606131f289828a01612fc7565b935050608061320389828a01612fc7565b92505060a061321489828a01612fc7565b9150509295509295509295565b61322a81613805565b82525050565b61323981613817565b82525050565b600061324b83856137e3565b93506132588385846138c3565b613261836138d2565b840190509392505050565b61327581613857565b82525050565b6132848161387b565b82525050565b6132938161389f565b82525050565b60006132a66015836137f4565b91507f746f6b656e2d7472616e736665722d6661696c656400000000000000000000006000830152602082019050919050565b60006132e66011836137f4565b91507f64697362757273652072657175697265640000000000000000000000000000006000830152602082019050919050565b6000613326600f836137f4565b91507f736166652d6d756c2d6661696c656400000000000000000000000000000000006000830152602082019050919050565b60006133666018836137f4565b91507f63757272656e63792d7472616e736665722d6661696c656400000000000000006000830152602082019050919050565b60006133a6600f836137f4565b91507f736166652d6164642d6661696c656400000000000000000000000000000000006000830152602082019050919050565b60006133e66016836137f4565b91507f65706f63682d6e6f742d65786563757465642d796574000000000000000000006000830152602082019050919050565b60006134266010836137f4565b91507f6469766973696f6e206279207a65726f000000000000000000000000000000006000830152602082019050919050565b6000613466600f836137f4565b91507f736166652d7375622d6661696c656400000000000000000000000000000000006000830152602082019050919050565b6020820160008201516134af60008501826134b5565b50505050565b6134be8161384d565b82525050565b6134cd8161384d565b82525050565b60006020820190506134e86000830184613221565b92915050565b60006060820190506135036000830186613221565b6135106020830185613221565b61351d60408301846134c4565b949350505050565b600060408201905061353a6000830185613221565b61354760208301846134c4565b9392505050565b60006020820190506135636000830184613230565b92915050565b600060208201905061357e600083018461326c565b92915050565b6000602082019050613599600083018461327b565b92915050565b60006020820190506135b4600083018461328a565b92915050565b600060208201905081810360008301526135d381613299565b9050919050565b600060208201905081810360008301526135f3816132d9565b9050919050565b6000602082019050818103600083015261361381613319565b9050919050565b6000602082019050818103600083015261363381613359565b9050919050565b6000602082019050818103600083015261365381613399565b9050919050565b60006020820190508181036000830152613673816133d9565b9050919050565b6000602082019050818103600083015261369381613419565b9050919050565b600060208201905081810360008301526136b381613459565b9050919050565b60006060820190506136cf6000830186613499565b6136dc6020830185613499565b6136e96040830184613499565b949350505050565b600060208201905061370660008301846134c4565b92915050565b600060408201905061372160008301866134c4565b818103602083015261373481848661323f565b9050949350505050565b600060408201905061375360008301856134c4565b61376060208301846134c4565b9392505050565b600060608201905061377c60008301866134c4565b61378960208301856134c4565b61379660408301846134c4565b949350505050565b60006080820190506137b360008301876134c4565b6137c060208301866134c4565b6137cd60408301856134c4565b6137da60608301846134c4565b95945050505050565b600082825260208201905092915050565b600082825260208201905092915050565b60006138108261382d565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061386282613869565b9050919050565b60006138748261382d565b9050919050565b60006138868261388d565b9050919050565b60006138988261382d565b9050919050565b60006138aa826138b1565b9050919050565b60006138bc8261382d565b9050919050565b82818337600083830152505050565b6000601f19601f8301169050919050565b6138ec81613805565b81146138f757600080fd5b50565b61390381613817565b811461390e57600080fd5b50565b61391a81613823565b811461392557600080fd5b50565b6139318161384d565b811461393c57600080fd5b5056fea365627a7a723158202501a5c67486e36bc32804d2a3a6f82fb3c350c8a7b31bc8804e4b60a80f86206c6578706572696d656e74616cf564736f6c634300050f00400000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000001aefc15de9c2e1ebb97146c3c2cdc4fc0ad539bc

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80639adc339d1161010f578063cd3293de116100a2578063e6cb901311610071578063e6cb9013146105d8578063ed12a99c14610608578063f5a09bb414610626578063fc0c546a14610659576101e5565b8063cd3293de1461054d578063cdd5f2c81461056b578063d05c78da1461058a578063e5a6b10f146105ba576101e5565b8063b5931f7c116100de578063b5931f7c1461049d578063b69ef8a8146104cd578063bf353dbb146104eb578063c6b61e4c1461051b576101e5565b80639adc339d146104035780639c52a7f11461041f578063a293d1e81461043b578063a87430ba1461046b576101e5565b806367457022116101875780637824407f116101565780637824407f146103785780637f3bd56e146103965780638be03ca1146103c95780638d060dfa146103e5576101e5565b806367457022146102dd57806369c7a0511461030d57806373cd07831461034057806374299b5a1461035c576101e5565b80631c8ce890116101c35780631c8ce890146102565780632edd29761461028957806340c10f19146102a557806365fae35e146102c1576101e5565b8063078c74c3146101ea5780630e2286d31461020857806318160ddd14610238575b600080fd5b6101f2610677565b6040516101ff91906136f1565b60405180910390f35b610222600480360361021d919081019061315c565b61067d565b60405161022f91906136f1565b60405180910390f35b6102406106fb565b60405161024d91906136f1565b60405180910390f35b610270600480360361026b9190810190612ff1565b610701565b604051610280949392919061379e565b60405180910390f35b6102a3600480360361029e9190810190613069565b61080a565b005b6102bf60048036036102ba9190810190613069565b610d1f565b005b6102db60048036036102d69190810190612ff1565b610dfd565b005b6102f760048036036102f2919081019061315c565b610f1c565b60405161030491906136f1565b60405180910390f35b61032760048036036103229190810190612ff1565b610f45565b604051610337949392919061379e565b60405180910390f35b61035a6004803603610355919081019061301a565b611003565b005b61037660048036036103719190810190613069565b611105565b005b61038061161a565b60405161038d91906136f1565b60405180910390f35b6103b060048036036103ab9190810190613069565b6116c1565b6040516103c0949392919061379e565b60405180910390f35b6103e360048036036103de9190810190613198565b611a63565b005b6103ed611c48565b6040516103fa919061354e565b60405180910390f35b61041d600480360361041891908101906130ce565b611c5b565b005b61043960048036036104349190810190612ff1565b611e6a565b005b6104556004803603610450919081019061315c565b611f89565b60405161046291906136f1565b60405180910390f35b61048560048036036104809190810190612ff1565b611fd9565b60405161049493929190613767565b60405180910390f35b6104b760048036036104b2919081019061315c565b612003565b6040516104c491906136f1565b60405180910390f35b6104d5612017565b6040516104e291906136f1565b60405180910390f35b61050560048036036105009190810190612ff1565b6120eb565b60405161051291906136f1565b60405180910390f35b6105356004803603610530919081019061310a565b612103565b604051610544939291906136ba565b60405180910390f35b610555612169565b604051610562919061359f565b60405180910390f35b61057361218f565b60405161058192919061373e565b60405180910390f35b6105a4600480360361059f919081019061315c565b612226565b6040516105b191906136f1565b60405180910390f35b6105c2612288565b6040516105cf9190613569565b60405180910390f35b6105f260048036036105ed919081019061315c565b6122ae565b6040516105ff91906136f1565b60405180910390f35b6106106122fe565b60405161061d9190613584565b60405180910390f35b610640600480360361063b9190810190613069565b612324565b604051610650949392919061379e565b60405180910390f35b610661612775565b60405161066e9190613569565b60405180910390f35b60045481565b60008082116106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b89061367a565b60405180910390fd5b816106eb6106db856b033b2e3c9fd0803ce8000000612226565b600285816106e557fe5b046122ae565b816106f257fe5b04905092915050565b60035481565b60008060008060016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461075257600080fd5b6107fb85600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364c1cf336040518163ffffffff1660e01b815260040160206040518083038186803b1580156107be57600080fd5b505afa1580156107d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107f69190810190613133565b6116c1565b93509350935093509193509193565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461085557600080fd5b816000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541480156108ea57506000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154145b806109d55750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663766718086040518163ffffffff1660e01b815260040160206040518083038186803b15801561095857600080fd5b505afa15801561096c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506109909190810190613133565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b906135da565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663766718086040518163ffffffff1660e01b815260040160206040518083038186803b158015610a7c57600080fd5b505afa158015610a90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ab49190810190613133565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905082600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550610b9d610b976004548361279b565b846122ae565b60048190555080831115610cd2576000610bb78483611f89565b9050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd86600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401610c3a939291906134ee565b602060405180830381600087803b158015610c5457600080fd5b505af1158015610c68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c8c91908101906130a5565b610ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc2906135ba565b60405180910390fd5b5050610d1a565b6000610cde8285611f89565b90506000811115610d1757610d16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686836127c1565b5b50505b505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610d6a57600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401610dc7929190613525565b600060405180830381600087803b158015610de157600080fd5b505af1158015610df5573d6000803e3d6000fd5b505050505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610e4857600080fd5b60008060006004359250602435915034905060016000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081833373ffffffffffffffffffffffffffffffffffffffff166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684600036604051610f0e9392919061370c565b60405180910390a450505050565b60006b033b2e3c9fd0803ce8000000610f358484612226565b81610f3c57fe5b04905092915050565b600080600080610ff485600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364c1cf336040518163ffffffff1660e01b815260040160206040518083038186803b158015610fb757600080fd5b505afa158015610fcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fef9190810190613133565b612324565b93509350935093509193509193565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461104e57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846040518463ffffffff1660e01b81526004016110ad939291906134ee565b602060405180830381600087803b1580156110c757600080fd5b505af11580156110db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110ff91908101906130a5565b50505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461115057600080fd5b816000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541480156111e557506000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154145b806112d05750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663766718086040518163ffffffff1660e01b815260040160206040518083038186803b15801561125357600080fd5b505afa158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061128b9190810190613133565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b61130f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611306906135da565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663766718086040518163ffffffff1660e01b815260040160206040518083038186803b15801561137757600080fd5b505afa15801561138b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113af9190810190613133565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905082600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506114986114926003548361279b565b846122ae565b600381905550808311156115cd5760006114b28483611f89565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd86600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401611535939291906134ee565b602060405180830381600087803b15801561154f57600080fd5b505af1158015611563573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061158791908101906130a5565b6115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd9061361a565b60405180910390fd5b5050611615565b60006115d98285611f89565b9050600081111561161257611611600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686836127c1565b5b50505b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561168457600080fd5b505afa158015611698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116bc9190810190613133565b905090565b60008060008060016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461171257600080fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364c1cf336040518163ffffffff1660e01b815260040160206040518083038186803b15801561177a57600080fd5b505afa15801561178e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117b29190810190613133565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d9061365a565b60405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364c1cf336040518163ffffffff1660e01b815260040160206040518083038186803b1580156118a057600080fd5b505afa1580156118b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506118d89190810190613133565b9050808611156118e6578095505b6118f08787612324565b8095508196508297508398505050505082600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506119998660016122ae565b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000851115611a1657611a15600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688876127c1565b5b6000841115611a4d57611a4c600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688866127c1565b5b8484848494509450945094505092959194509250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611aae57600080fd5b60011515600960149054906101000a900460ff16151514611ace57600080fd5b6000600960146101000a81548160ff021916908315150217905550846001600088815260200190815260200160002060010160000181905550836001600088815260200190815260200160002060000160000181905550826001600088815260200190815260200160002060020160000181905550600080905060008090506000851115611b8457611b60848661067d565b9050611b81611b7b846b033b2e3c9fd0803ce8000000612226565b86612003565b91505b611b8f888284612972565b611b9a888585612adf565b611be6611ba96003548661279b565b611be186611bdc6b033b2e3c9fd0803ce8000000600160008f815260200190815260200160002060010160000154611f89565b610f1c565b6122ae565b600381905550611c38611bfb6004548461279b565b611c3384611c2e6b033b2e3c9fd0803ce8000000600160008f815260200190815260200160002060000160000154611f89565b610f1c565b6122ae565b6004819055505050505050505050565b600960149054906101000a900460ff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611ca657600080fd5b7f746f6b656e000000000000000000000000000000000000000000000000000000821415611d145780600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e66565b7f63757272656e6379000000000000000000000000000000000000000000000000821415611d825780600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e65565b7f7265736572766500000000000000000000000000000000000000000000000000821415611df05780600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e64565b7f65706f63685469636b6572000000000000000000000000000000000000000000821415611e5e5780600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e63565b600080fd5b5b5b5b5050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611eb557600080fd5b60008060006004359250602435915034905060008060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081833373ffffffffffffffffffffffffffffffffffffffff166000357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684600036604051611f7b9392919061370c565b60405180910390a450505050565b6000828284039150811115611fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fca9061369a565b60405180910390fd5b92915050565b60026020528060005260406000206000915090508060000154908060010154908060020154905083565b600081838161200e57fe5b04905092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161209691906134d3565b60206040518083038186803b1580156120ae57600080fd5b505afa1580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120e69190810190613133565b905090565b60006020528060005260406000206000915090505481565b60016020528060005260406000206000915090508060000160405180602001604052908160008201548152505090806001016040518060200160405290816000820154815250509080600201604051806020016040529081600082015481525050905083565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146121dd57600080fd5b60001515600960149054906101000a900460ff161515146121fd57600080fd5b6001600960146101000a81548160ff021916908315150217905550600354600454915091509091565b600080821480612243575082828385029250828161224057fe5b04145b612282576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612279906135fa565b60405180910390fd5b92915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282840191508110156122f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ef9061363a565b60405180910390fd5b92915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166364c1cf336040518163ffffffff1660e01b815260040160206040518083038186803b1580156123db57600080fd5b505afa1580156123ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124139190810190613133565b9050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663766718086040518163ffffffff1660e01b815260040160206040518083038186803b15801561247d57600080fd5b505afa158015612491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124b59190810190613133565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415612595578585600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549550955095509550505061276c565b808711156125a1578096505b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549350600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154925060008090505b87831115801561264e575060008514158061264d575060008414155b5b1561275c57600085146126d95761267e856001600086815260200190815260200160002060010160000154610f1c565b9050600081146126d8576126c9866126c46126a5846b033b2e3c9fd0803ce8000000612226565b6001600088815260200190815260200160002060020160000154612003565b6122ae565b95506126d58582611f89565b94505b5b6000841461274a57612704846001600086815260200190815260200160002060000160000154610f1c565b9050600081146127495761273a87612735836001600088815260200190815260200160002060020160000154610f1c565b6122ae565b96506127468482611f89565b93505b5b6127558360016122ae565b9250612631565b8686868696509650965096505050505b92959194509250565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000818310156127ae57600090506127bb565b6127b88383611f89565b90505b92915050565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161281e91906134d3565b60206040518083038186803b15801561283657600080fd5b505afa15801561284a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061286e9190810190613133565b90508082111561287c578091505b8373ffffffffffffffffffffffffffffffffffffffff166323b872dd600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685856040518463ffffffff1660e01b81526004016128db939291906134ee565b602060405180830381600087803b1580156128f557600080fd5b505af1158015612909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061292d91908101906130a5565b61296c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612963906135ba565b60405180910390fd5b50505050565b60008090506000600160008681526020019081526020016000206002016000015411156129bf576129bc836001600087815260200190815260200160002060010160000154610f1c565b90505b60006129e4836001600088815260200190815260200160002060000160000154610f1c565b905081811115612a0d5760006129fa8284611f89565b9050612a0581612cb3565b505050612ada565b6000612a198383611f89565b90506000811115612ad657600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612aa3929190613525565b600060405180830381600087803b158015612abd57600080fd5b505af1158015612ad1573d6000803e3d6000fd5b505050505b5050505b505050565b6000612b04836001600087815260200190815260200160002060010160000154610f1c565b90506000612b2b836001600088815260200190815260200160002060000160000154610f1c565b905080821115612c89576000612b418383611f89565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612bc2929190613525565b600060405180830381600087803b158015612bdc57600080fd5b505af1158015612bf0573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6b55f25826040518263ffffffff1660e01b8152600401612c4f91906136f1565b600060405180830381600087803b158015612c6957600080fd5b505af1158015612c7d573d6000803e3d6000fd5b50505050505050612cae565b6000612c958284611f89565b90506000811115612caa57612ca981612e45565b5b5050505b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401612d3291906134d3565b60206040518083038186803b158015612d4a57600080fd5b505afa158015612d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d829190810190613133565b905080821115612d90578091505b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612e0f929190613525565b600060405180830381600087803b158015612e2957600080fd5b505af1158015612e3d573d6000803e3d6000fd5b505050505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad7a672f6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612eb157600080fd5b505af1158015612ec5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612ee99190810190613133565b905080821115612ef7578091505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1152343836040518263ffffffff1660e01b8152600401612f5291906136f1565b600060405180830381600087803b158015612f6c57600080fd5b505af1158015612f80573d6000803e3d6000fd5b505050505050565b600081359050612f97816138e3565b92915050565b600081519050612fac816138fa565b92915050565b600081359050612fc181613911565b92915050565b600081359050612fd681613928565b92915050565b600081519050612feb81613928565b92915050565b60006020828403121561300357600080fd5b600061301184828501612f88565b91505092915050565b60008060006060848603121561302f57600080fd5b600061303d86828701612f88565b935050602061304e86828701612f88565b925050604061305f86828701612fc7565b9150509250925092565b6000806040838503121561307c57600080fd5b600061308a85828601612f88565b925050602061309b85828601612fc7565b9150509250929050565b6000602082840312156130b757600080fd5b60006130c584828501612f9d565b91505092915050565b600080604083850312156130e157600080fd5b60006130ef85828601612fb2565b925050602061310085828601612f88565b9150509250929050565b60006020828403121561311c57600080fd5b600061312a84828501612fc7565b91505092915050565b60006020828403121561314557600080fd5b600061315384828501612fdc565b91505092915050565b6000806040838503121561316f57600080fd5b600061317d85828601612fc7565b925050602061318e85828601612fc7565b9150509250929050565b60008060008060008060c087890312156131b157600080fd5b60006131bf89828a01612fc7565b96505060206131d089828a01612fc7565b95505060406131e189828a01612fc7565b94505060606131f289828a01612fc7565b935050608061320389828a01612fc7565b92505060a061321489828a01612fc7565b9150509295509295509295565b61322a81613805565b82525050565b61323981613817565b82525050565b600061324b83856137e3565b93506132588385846138c3565b613261836138d2565b840190509392505050565b61327581613857565b82525050565b6132848161387b565b82525050565b6132938161389f565b82525050565b60006132a66015836137f4565b91507f746f6b656e2d7472616e736665722d6661696c656400000000000000000000006000830152602082019050919050565b60006132e66011836137f4565b91507f64697362757273652072657175697265640000000000000000000000000000006000830152602082019050919050565b6000613326600f836137f4565b91507f736166652d6d756c2d6661696c656400000000000000000000000000000000006000830152602082019050919050565b60006133666018836137f4565b91507f63757272656e63792d7472616e736665722d6661696c656400000000000000006000830152602082019050919050565b60006133a6600f836137f4565b91507f736166652d6164642d6661696c656400000000000000000000000000000000006000830152602082019050919050565b60006133e66016836137f4565b91507f65706f63682d6e6f742d65786563757465642d796574000000000000000000006000830152602082019050919050565b60006134266010836137f4565b91507f6469766973696f6e206279207a65726f000000000000000000000000000000006000830152602082019050919050565b6000613466600f836137f4565b91507f736166652d7375622d6661696c656400000000000000000000000000000000006000830152602082019050919050565b6020820160008201516134af60008501826134b5565b50505050565b6134be8161384d565b82525050565b6134cd8161384d565b82525050565b60006020820190506134e86000830184613221565b92915050565b60006060820190506135036000830186613221565b6135106020830185613221565b61351d60408301846134c4565b949350505050565b600060408201905061353a6000830185613221565b61354760208301846134c4565b9392505050565b60006020820190506135636000830184613230565b92915050565b600060208201905061357e600083018461326c565b92915050565b6000602082019050613599600083018461327b565b92915050565b60006020820190506135b4600083018461328a565b92915050565b600060208201905081810360008301526135d381613299565b9050919050565b600060208201905081810360008301526135f3816132d9565b9050919050565b6000602082019050818103600083015261361381613319565b9050919050565b6000602082019050818103600083015261363381613359565b9050919050565b6000602082019050818103600083015261365381613399565b9050919050565b60006020820190508181036000830152613673816133d9565b9050919050565b6000602082019050818103600083015261369381613419565b9050919050565b600060208201905081810360008301526136b381613459565b9050919050565b60006060820190506136cf6000830186613499565b6136dc6020830185613499565b6136e96040830184613499565b949350505050565b600060208201905061370660008301846134c4565b92915050565b600060408201905061372160008301866134c4565b818103602083015261373481848661323f565b9050949350505050565b600060408201905061375360008301856134c4565b61376060208301846134c4565b9392505050565b600060608201905061377c60008301866134c4565b61378960208301856134c4565b61379660408301846134c4565b949350505050565b60006080820190506137b360008301876134c4565b6137c060208301866134c4565b6137cd60408301856134c4565b6137da60608301846134c4565b95945050505050565b600082825260208201905092915050565b600082825260208201905092915050565b60006138108261382d565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061386282613869565b9050919050565b60006138748261382d565b9050919050565b60006138868261388d565b9050919050565b60006138988261382d565b9050919050565b60006138aa826138b1565b9050919050565b60006138bc8261382d565b9050919050565b82818337600083830152505050565b6000601f19601f8301169050919050565b6138ec81613805565b81146138f757600080fd5b50565b61390381613817565b811461390e57600080fd5b50565b61391a81613823565b811461392557600080fd5b50565b6139318161384d565b811461393c57600080fd5b5056fea365627a7a723158202501a5c67486e36bc32804d2a3a6f82fb3c350c8a7b31bc8804e4b60a80f86206c6578706572696d656e74616cf564736f6c634300050f0040

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

0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000001aefc15de9c2e1ebb97146c3c2cdc4fc0ad539bc

-----Decoded View---------------
Arg [0] : currency_ (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
Arg [1] : token_ (address): 0x1AEFc15dE9C2E1Ebb97146c3C2CDC4fc0aD539bC

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [1] : 0000000000000000000000001aefc15de9c2e1ebb97146c3c2cdc4fc0ad539bc


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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.