ETH Price: $3,181.64 (+1.54%)
Gas: 8 Gwei

Contract

0x787F552BDC17332c98aA360748884513e3cB401a
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Update Price90934142019-12-12 8:26:391675 days ago1576139199IN
dYdX: Dai Price Oracle
0 ETH0.000710649.00000001
Update Price90934132019-12-12 8:25:401675 days ago1576139140IN
dYdX: Dai Price Oracle
0 ETH0.000802910.17000001
Update Price90919562019-12-12 2:22:451675 days ago1576117365IN
dYdX: Dai Price Oracle
0 ETH0.000710299.00000001
Update Price90917912019-12-12 1:38:381675 days ago1576114718IN
dYdX: Dai Price Oracle
0 ETH0.00071839.10000001
Update Price90894722019-12-11 15:44:511676 days ago1576079091IN
dYdX: Dai Price Oracle
0 ETH0.0008026310.17000001
Update Price90853252019-12-10 21:48:161677 days ago1576014496IN
dYdX: Dai Price Oracle
0 ETH0.000710299.00000001
Update Price90838412019-12-10 15:27:361677 days ago1575991656IN
dYdX: Dai Price Oracle
0 ETH0.0007894710.00000001
Update Price90741502019-12-08 22:29:401679 days ago1575844180IN
dYdX: Dai Price Oracle
0 ETH0.0008678511.00000001
Update Price90706182019-12-08 7:28:521679 days ago1575790132IN
dYdX: Dai Price Oracle
0 ETH0.0008678511.00000001
Update Price90670352019-12-07 16:07:191680 days ago1575734839IN
dYdX: Dai Price Oracle
0 ETH0.0006906211.00000001
Update Price90634152019-12-07 0:48:381680 days ago1575679718IN
dYdX: Dai Price Oracle
0 ETH0.0006906211.00000001
Update Price90568502019-12-05 20:50:201682 days ago1575579020IN
dYdX: Dai Price Oracle
0 ETH0.0006880911.00000001
Update Price90411332019-12-03 1:37:411684 days ago1575337061IN
dYdX: Dai Price Oracle
0 ETH0.0006910511.00000001
Update Price90398352019-12-02 20:06:381685 days ago1575317198IN
dYdX: Dai Price Oracle
0 ETH0.0006906211.00000001
Update Price90392642019-12-02 17:32:451685 days ago1575307965IN
dYdX: Dai Price Oracle
0 ETH0.0006911811.00000001
Update Price90366522019-12-02 6:38:391685 days ago1575268719IN
dYdX: Dai Price Oracle
0 ETH0.0006909111.00000001
Update Price90318002019-12-01 9:46:521686 days ago1575193612IN
dYdX: Dai Price Oracle
0 ETH0.0006911911.00000001
Update Price90313472019-12-01 7:55:371686 days ago1575186937IN
dYdX: Dai Price Oracle
0 ETH0.000780412.43000001
Update Price90302482019-12-01 3:16:001686 days ago1575170160IN
dYdX: Dai Price Oracle
0 ETH0.0006911911.00000001
Update Price90300512019-12-01 2:27:461686 days ago1575167266IN
dYdX: Dai Price Oracle
0 ETH0.0006911811.00000001
Update Price90282372019-11-30 18:55:301687 days ago1575140130IN
dYdX: Dai Price Oracle
0 ETH0.0006911911.00000001
Update Price90220672019-11-29 16:46:551688 days ago1575046015IN
dYdX: Dai Price Oracle
0 ETH0.0006911911.00000001
Update Price90215922019-11-29 14:34:461688 days ago1575038086IN
dYdX: Dai Price Oracle
0 ETH0.0007807212.43000001
Update Price90214512019-11-29 13:59:061688 days ago1575035946IN
dYdX: Dai Price Oracle
0 ETH0.0007532512.00000001
Update Price90151152019-11-28 11:00:481689 days ago1574938848IN
dYdX: Dai Price Oracle
0 ETH0.0007728812.30000001
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DaiPriceOracle

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 10000 runs

Other Settings:
byzantium EvmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-05-07
*/

/*

    Copyright 2019 dYdX Trading Inc.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

*/

pragma solidity 0.5.7;
pragma experimental ABIEncoderV2;

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
    * @dev Multiplies two unsigned integers, reverts on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring '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;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
    * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
    * @dev Adds two unsigned integers, reverts on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
    * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address private _owner;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    /**
     * @return the address of the owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

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

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return 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 OwnershipTransferred(_owner, address(0));
        _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;
    }
}

// File: contracts/protocol/interfaces/IErc20.sol

/**
 * @title IErc20
 * @author dYdX
 *
 * Interface for using ERC20 Tokens. We have to use a special interface to call ERC20 functions so
 * that we don't automatically revert when calling non-compliant tokens that have no return value for
 * transfer(), transferFrom(), or approve().
 */
interface IErc20 {
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 value
    );

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    function totalSupply(
    )
        external
        view
        returns (uint256);

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

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

    function transfer(
        address to,
        uint256 value
    )
        external;

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

    function approve(
        address spender,
        uint256 value
    )
        external;

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

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

    function decimals()
        external
        view
        returns (uint8);
}

// File: contracts/protocol/lib/Monetary.sol

/**
 * @title Monetary
 * @author dYdX
 *
 * Library for types involving money
 */
library Monetary {

    /*
     * The price of a base-unit of an asset.
     */
    struct Price {
        uint256 value;
    }

    /*
     * Total value of an some amount of an asset. Equal to (price * amount).
     */
    struct Value {
        uint256 value;
    }
}

// File: contracts/protocol/interfaces/IPriceOracle.sol

/**
 * @title IPriceOracle
 * @author dYdX
 *
 * Interface that Price Oracles for Solo must implement in order to report prices.
 */
contract IPriceOracle {

    // ============ Constants ============

    uint256 public constant ONE_DOLLAR = 10 ** 36;

    // ============ Public Functions ============

    /**
     * Get the price of a token
     *
     * @param  token  The ERC20 token address of the market
     * @return        The USD price of a base unit of the token, then multiplied by 10^36.
     *                So a USD-stable coin with 18 decimal places would return 10^18.
     *                This is the price of the base unit rather than the price of a "human-readable"
     *                token amount. Every ERC20 may have a different number of decimals.
     */
    function getPrice(
        address token
    )
        public
        view
        returns (Monetary.Price memory);
}

// File: contracts/protocol/lib/Require.sol

/**
 * @title Require
 * @author dYdX
 *
 * Stringifies parameters to pretty-print revert messages. Costs more gas than regular require()
 */
library Require {

    // ============ Constants ============

    uint256 constant ASCII_ZERO = 48; // '0'
    uint256 constant ASCII_RELATIVE_ZERO = 87; // 'a' - 10
    uint256 constant ASCII_LOWER_EX = 120; // 'x'
    bytes2 constant COLON = 0x3a20; // ': '
    bytes2 constant COMMA = 0x2c20; // ', '
    bytes2 constant LPAREN = 0x203c; // ' <'
    byte constant RPAREN = 0x3e; // '>'
    uint256 constant FOUR_BIT_MASK = 0xf;

    // ============ Library Functions ============

    function that(
        bool must,
        bytes32 file,
        bytes32 reason
    )
        internal
        pure
    {
        if (!must) {
            revert(
                string(
                    abi.encodePacked(
                        stringify(file),
                        COLON,
                        stringify(reason)
                    )
                )
            );
        }
    }

    function that(
        bool must,
        bytes32 file,
        bytes32 reason,
        uint256 payloadA
    )
        internal
        pure
    {
        if (!must) {
            revert(
                string(
                    abi.encodePacked(
                        stringify(file),
                        COLON,
                        stringify(reason),
                        LPAREN,
                        stringify(payloadA),
                        RPAREN
                    )
                )
            );
        }
    }

    function that(
        bool must,
        bytes32 file,
        bytes32 reason,
        uint256 payloadA,
        uint256 payloadB
    )
        internal
        pure
    {
        if (!must) {
            revert(
                string(
                    abi.encodePacked(
                        stringify(file),
                        COLON,
                        stringify(reason),
                        LPAREN,
                        stringify(payloadA),
                        COMMA,
                        stringify(payloadB),
                        RPAREN
                    )
                )
            );
        }
    }

    function that(
        bool must,
        bytes32 file,
        bytes32 reason,
        address payloadA
    )
        internal
        pure
    {
        if (!must) {
            revert(
                string(
                    abi.encodePacked(
                        stringify(file),
                        COLON,
                        stringify(reason),
                        LPAREN,
                        stringify(payloadA),
                        RPAREN
                    )
                )
            );
        }
    }

    function that(
        bool must,
        bytes32 file,
        bytes32 reason,
        address payloadA,
        uint256 payloadB
    )
        internal
        pure
    {
        if (!must) {
            revert(
                string(
                    abi.encodePacked(
                        stringify(file),
                        COLON,
                        stringify(reason),
                        LPAREN,
                        stringify(payloadA),
                        COMMA,
                        stringify(payloadB),
                        RPAREN
                    )
                )
            );
        }
    }

    function that(
        bool must,
        bytes32 file,
        bytes32 reason,
        address payloadA,
        uint256 payloadB,
        uint256 payloadC
    )
        internal
        pure
    {
        if (!must) {
            revert(
                string(
                    abi.encodePacked(
                        stringify(file),
                        COLON,
                        stringify(reason),
                        LPAREN,
                        stringify(payloadA),
                        COMMA,
                        stringify(payloadB),
                        COMMA,
                        stringify(payloadC),
                        RPAREN
                    )
                )
            );
        }
    }

    // ============ Private Functions ============

    function stringify(
        bytes32 input
    )
        private
        pure
        returns (bytes memory)
    {
        // put the input bytes into the result
        bytes memory result = abi.encodePacked(input);

        // determine the length of the input by finding the location of the last non-zero byte
        for (uint256 i = 32; i > 0; ) {
            // reverse-for-loops with unsigned integer
            /* solium-disable-next-line security/no-modify-for-iter-var */
            i--;

            // find the last non-zero byte in order to determine the length
            if (result[i] != 0) {
                uint256 length = i + 1;

                /* solium-disable-next-line security/no-inline-assembly */
                assembly {
                    mstore(result, length) // r.length = length;
                }

                return result;
            }
        }

        // all bytes are zero
        return new bytes(0);
    }

    function stringify(
        uint256 input
    )
        private
        pure
        returns (bytes memory)
    {
        if (input == 0) {
            return "0";
        }

        // get the final string length
        uint256 j = input;
        uint256 length;
        while (j != 0) {
            length++;
            j /= 10;
        }

        // allocate the string
        bytes memory bstr = new bytes(length);

        // populate the string starting with the least-significant character
        j = input;
        for (uint256 i = length; i > 0; ) {
            // reverse-for-loops with unsigned integer
            /* solium-disable-next-line security/no-modify-for-iter-var */
            i--;

            // take last decimal digit
            bstr[i] = byte(uint8(ASCII_ZERO + (j % 10)));

            // remove the last decimal digit
            j /= 10;
        }

        return bstr;
    }

    function stringify(
        address input
    )
        private
        pure
        returns (bytes memory)
    {
        uint256 z = uint256(input);

        // addresses are "0x" followed by 20 bytes of data which take up 2 characters each
        bytes memory result = new bytes(42);

        // populate the result with "0x"
        result[0] = byte(uint8(ASCII_ZERO));
        result[1] = byte(uint8(ASCII_LOWER_EX));

        // for each byte (starting from the lowest byte), populate the result with two characters
        for (uint256 i = 0; i < 20; i++) {
            // each byte takes two characters
            uint256 shift = i * 2;

            // populate the least-significant character
            result[41 - shift] = char(z & FOUR_BIT_MASK);
            z = z >> 4;

            // populate the most-significant character
            result[40 - shift] = char(z & FOUR_BIT_MASK);
            z = z >> 4;
        }

        return result;
    }

    function char(
        uint256 input
    )
        private
        pure
        returns (byte)
    {
        // return ASCII digit (0-9)
        if (input < 10) {
            return byte(uint8(input + ASCII_ZERO));
        }

        // return ASCII letter (a-f)
        return byte(uint8(input + ASCII_RELATIVE_ZERO));
    }
}

// File: contracts/protocol/lib/Math.sol

/**
 * @title Math
 * @author dYdX
 *
 * Library for non-standard Math functions
 */
library Math {
    using SafeMath for uint256;

    // ============ Constants ============

    bytes32 constant FILE = "Math";

    // ============ Library Functions ============

    /*
     * Return target * (numerator / denominator).
     */
    function getPartial(
        uint256 target,
        uint256 numerator,
        uint256 denominator
    )
        internal
        pure
        returns (uint256)
    {
        return target.mul(numerator).div(denominator);
    }

    /*
     * Return target * (numerator / denominator), but rounded up.
     */
    function getPartialRoundUp(
        uint256 target,
        uint256 numerator,
        uint256 denominator
    )
        internal
        pure
        returns (uint256)
    {
        if (target == 0 || numerator == 0) {
            // SafeMath will check for zero denominator
            return SafeMath.div(0, denominator);
        }
        return target.mul(numerator).sub(1).div(denominator).add(1);
    }

    function to128(
        uint256 number
    )
        internal
        pure
        returns (uint128)
    {
        uint128 result = uint128(number);
        Require.that(
            result == number,
            FILE,
            "Unsafe cast to uint128"
        );
        return result;
    }

    function to96(
        uint256 number
    )
        internal
        pure
        returns (uint96)
    {
        uint96 result = uint96(number);
        Require.that(
            result == number,
            FILE,
            "Unsafe cast to uint96"
        );
        return result;
    }

    function to32(
        uint256 number
    )
        internal
        pure
        returns (uint32)
    {
        uint32 result = uint32(number);
        Require.that(
            result == number,
            FILE,
            "Unsafe cast to uint32"
        );
        return result;
    }

    function min(
        uint256 a,
        uint256 b
    )
        internal
        pure
        returns (uint256)
    {
        return a < b ? a : b;
    }

    function max(
        uint256 a,
        uint256 b
    )
        internal
        pure
        returns (uint256)
    {
        return a > b ? a : b;
    }
}

// File: contracts/protocol/lib/Time.sol

/**
 * @title Time
 * @author dYdX
 *
 * Library for dealing with time, assuming timestamps fit within 32 bits (valid until year 2106)
 */
library Time {

    // ============ Library Functions ============

    function currentTime()
        internal
        view
        returns (uint32)
    {
        return Math.to32(block.timestamp);
    }
}

// File: contracts/external/interfaces/IMakerOracle.sol

/**
 * @title IMakerOracle
 * @author dYdX
 *
 * Interface for the price oracles run by MakerDao
 */
interface IMakerOracle {

    // Event that is logged when the `note` modifier is used
    event LogNote(
        bytes4 indexed msgSig,
        address indexed msgSender,
        bytes32 indexed arg1,
        bytes32 indexed arg2,
        uint256 msgValue,
        bytes msgData
    ) anonymous;

    // returns the current value (ETH/USD * 10**18) as a bytes32
    function peek()
        external
        view
        returns (bytes32, bool);

    // requires a fresh price and then returns the current value
    function read()
        external
        view
        returns (bytes32);
}

// File: contracts/external/interfaces/IOasisDex.sol

/**
 * @title IOasisDex
 * @author dYdX
 *
 * Interface for the OasisDex contract
 */
interface IOasisDex {

    // ============ Structs ================

    struct OfferInfo {
        uint256 pay_amt;
        address pay_gem;
        uint256 buy_amt;
        address buy_gem;
        address owner;
        uint64 timestamp;
    }

    struct SortInfo {
        uint256 next;  //points to id of next higher offer
        uint256 prev;  //points to id of previous lower offer
        uint256 delb;  //the blocknumber where this entry was marked for delete
    }

    // ============ Storage Getters ================

    function last_offer_id()
        external
        view
        returns (uint256);

    function offers(
        uint256 id
    )
        external
        view
        returns (OfferInfo memory);

    function close_time()
        external
        view
        returns (uint64);

    function stopped()
        external
        view
        returns (bool);

    function buyEnabled()
        external
        view
        returns (bool);

    function matchingEnabled()
        external
        view
        returns (bool);

    function _rank(
        uint256 id
    )
        external
        view
        returns (SortInfo memory);

    function _best(
        address sell_gem,
        address buy_gem
    )
        external
        view
        returns (uint256);

    function _span(
        address sell_gem,
        address buy_gem
    )
        external
        view
        returns (uint256);

    function _dust(
        address gem
    )
        external
        view
        returns (uint256);

    function _near(
        uint256 id
    )
        external
        view
        returns (uint256);

    // ============ Constant Functions ================

    function isActive(
        uint256 id
    )
        external
        view
        returns (bool);

    function getOwner(
        uint256 id
    )
        external
        view
        returns (address);

    function getOffer(
        uint256 id
    )
        external
        view
        returns (uint256, address, uint256, address);

    function getMinSell(
        address pay_gem
    )
        external
        view
        returns (uint256);

    function getBestOffer(
        address sell_gem,
        address buy_gem
    )
        external
        view
        returns (uint256);

    function getWorseOffer(
        uint256 id
    )
        external
        view
        returns (uint256);

    function getBetterOffer(
        uint256 id
    )
        external
        view
        returns (uint256);

    function getOfferCount(
        address sell_gem,
        address buy_gem
    )
        external
        view
        returns (uint256);

    function getFirstUnsortedOffer()
        external
        view
        returns (uint256);

    function getNextUnsortedOffer(
        uint256 id
    )
        external
        view
        returns (uint256);

    function isOfferSorted(
        uint256 id
    )
        external
        view
        returns (bool);

    function getBuyAmount(
        address buy_gem,
        address pay_gem,
        uint256 pay_amt
    )
        external
        view
        returns (uint256);

    function getPayAmount(
        address pay_gem,
        address buy_gem,
        uint256 buy_amt
    )
        external
        view
        returns (uint256);

    function isClosed()
        external
        view
        returns (bool);

    function getTime()
        external
        view
        returns (uint64);

    // ============ Non-Constant Functions ================

    function bump(
        bytes32 id_
    )
        external;

    function buy(
        uint256 id,
        uint256 quantity
    )
        external
        returns (bool);

    function cancel(
        uint256 id
    )
        external
        returns (bool);

    function kill(
        bytes32 id
    )
        external;

    function make(
        address  pay_gem,
        address  buy_gem,
        uint128  pay_amt,
        uint128  buy_amt
    )
        external
        returns (bytes32);

    function take(
        bytes32 id,
        uint128 maxTakeAmount
    )
        external;

    function offer(
        uint256 pay_amt,
        address pay_gem,
        uint256 buy_amt,
        address buy_gem
    )
        external
        returns (uint256);

    function offer(
        uint256 pay_amt,
        address pay_gem,
        uint256 buy_amt,
        address buy_gem,
        uint256 pos
    )
        external
        returns (uint256);

    function offer(
        uint256 pay_amt,
        address pay_gem,
        uint256 buy_amt,
        address buy_gem,
        uint256 pos,
        bool rounding
    )
        external
        returns (uint256);

    function insert(
        uint256 id,
        uint256 pos
    )
        external
        returns (bool);

    function del_rank(
        uint256 id
    )
        external
        returns (bool);

    function sellAllAmount(
        address pay_gem,
        uint256 pay_amt,
        address buy_gem,
        uint256 min_fill_amount
    )
        external
        returns (uint256);

    function buyAllAmount(
        address buy_gem,
        uint256 buy_amt,
        address pay_gem,
        uint256 max_fill_amount
    )
        external
        returns (uint256);
}

// File: contracts/external/oracles/DaiPriceOracle.sol

/**
 * @title DaiPriceOracle
 * @author dYdX
 *
 * PriceOracle that gives the price of Dai in USD
 */
contract DaiPriceOracle is
    Ownable,
    IPriceOracle
{
    using SafeMath for uint256;

    // ============ Constants ============

    bytes32 constant FILE = "DaiPriceOracle";

    uint256 constant DECIMALS = 18;

    uint256 constant EXPECTED_PRICE = ONE_DOLLAR / (10 ** DECIMALS);

    // ============ Structs ============

    struct PriceInfo {
        uint128 price;
        uint32 lastUpdate;
    }

    struct DeviationParams {
        uint64 denominator;
        uint64 maximumPerSecond;
        uint64 maximumAbsolute;
    }

    // ============ Events ============

    event PriceSet(
        PriceInfo newPriceInfo
    );

    // ============ Storage ============

    PriceInfo public g_priceInfo;

    address public g_poker;

    DeviationParams public DEVIATION_PARAMS;

    uint256 public OASIS_ETH_AMOUNT;

    IErc20 public WETH;

    IErc20 public DAI;

    IMakerOracle public MEDIANIZER;

    IOasisDex public OASIS;

    address public UNISWAP;

    // ============ Constructor =============

    constructor(
        address poker,
        address weth,
        address dai,
        address medianizer,
        address oasis,
        address uniswap,
        uint256 oasisEthAmount,
        DeviationParams memory deviationParams
    )
        public
    {
        g_poker = poker;
        MEDIANIZER = IMakerOracle(medianizer);
        WETH = IErc20(weth);
        DAI = IErc20(dai);
        OASIS = IOasisDex(oasis);
        UNISWAP = uniswap;
        DEVIATION_PARAMS = deviationParams;
        OASIS_ETH_AMOUNT = oasisEthAmount;
        g_priceInfo = PriceInfo({
            lastUpdate: uint32(block.timestamp),
            price: uint128(EXPECTED_PRICE)
        });
    }

    // ============ Admin Functions ============

    function ownerSetPokerAddress(
        address newPoker
    )
        external
        onlyOwner
    {
        g_poker = newPoker;
    }

    // ============ Public Functions ============

    function updatePrice(
        Monetary.Price memory minimum,
        Monetary.Price memory maximum
    )
        public
        returns (PriceInfo memory)
    {
        Require.that(
            msg.sender == g_poker,
            FILE,
            "Only poker can call updatePrice",
            msg.sender
        );

        Monetary.Price memory newPrice = getBoundedTargetPrice();

        Require.that(
            newPrice.value >= minimum.value,
            FILE,
            "newPrice below minimum",
            newPrice.value,
            minimum.value
        );

        Require.that(
            newPrice.value <= maximum.value,
            FILE,
            "newPrice above maximum",
            newPrice.value,
            maximum.value
        );

        g_priceInfo = PriceInfo({
            price: Math.to128(newPrice.value),
            lastUpdate: Time.currentTime()
        });

        emit PriceSet(g_priceInfo);
        return g_priceInfo;
    }

    // ============ IPriceOracle Functions ============

    function getPrice(
        address /* token */
    )
        public
        view
        returns (Monetary.Price memory)
    {
        return Monetary.Price({
            value: g_priceInfo.price
        });
    }

    // ============ Price-Query Functions ============

    /**
     * Get the new price that would be stored if updated right now.
     */
    function getBoundedTargetPrice()
        public
        view
        returns (Monetary.Price memory)
    {
        Monetary.Price memory targetPrice = getTargetPrice();

        PriceInfo memory oldInfo = g_priceInfo;
        uint256 timeDelta = uint256(Time.currentTime()).sub(oldInfo.lastUpdate);
        (uint256 minPrice, uint256 maxPrice) = getPriceBounds(oldInfo.price, timeDelta);
        uint256 boundedTargetPrice = boundValue(targetPrice.value, minPrice, maxPrice);

        return Monetary.Price({
            value: boundedTargetPrice
        });
    }

    /**
     * Get the USD price of DAI that this contract will move towards when updated. This price is
     * not bounded by the variables governing the maximum deviation from the old price.
     */
    function getTargetPrice()
        public
        view
        returns (Monetary.Price memory)
    {
        Monetary.Price memory ethUsd = getMedianizerPrice();

        uint256 targetPrice = getMidValue(
            EXPECTED_PRICE,
            getOasisPrice(ethUsd).value,
            getUniswapPrice(ethUsd).value
        );

        return Monetary.Price({
            value: targetPrice
        });
    }

    /**
     * Get the USD price of ETH according the Maker Medianizer contract.
     */
    function getMedianizerPrice()
        public
        view
        returns (Monetary.Price memory)
    {
        // throws if the price is not fresh
        return Monetary.Price({
            value: uint256(MEDIANIZER.read())
        });
    }

    /**
     * Get the USD price of DAI according to OasisDEX given the USD price of ETH.
     */
    function getOasisPrice(
        Monetary.Price memory ethUsd
    )
        public
        view
        returns (Monetary.Price memory)
    {
        IOasisDex oasis = OASIS;

        // If exchange is not operational, return old value.
        // This allows the price to move only towards 1 USD
        if (
            oasis.isClosed()
            || !oasis.buyEnabled()
            || !oasis.matchingEnabled()
        ) {
            return Monetary.Price({
                value: g_priceInfo.price
            });
        }

        uint256 numWei = OASIS_ETH_AMOUNT;
        address dai = address(DAI);
        address weth = address(WETH);

        // Assumes at least `numWei` of depth on both sides of the book if the exchange is active.
        // Will revert if not enough depth.
        uint256 daiAmt1 = oasis.getBuyAmount(dai, weth, numWei);
        uint256 daiAmt2 = oasis.getPayAmount(dai, weth, numWei);

        uint256 num = numWei.mul(daiAmt2).add(numWei.mul(daiAmt1));
        uint256 den = daiAmt1.mul(daiAmt2).mul(2);
        uint256 oasisPrice = Math.getPartial(ethUsd.value, num, den);

        return Monetary.Price({
            value: oasisPrice
        });
    }

    /**
     * Get the USD price of DAI according to Uniswap given the USD price of ETH.
     */
    function getUniswapPrice(
        Monetary.Price memory ethUsd
    )
        public
        view
        returns (Monetary.Price memory)
    {
        address uniswap = address(UNISWAP);
        uint256 ethAmt = uniswap.balance;
        uint256 daiAmt = DAI.balanceOf(uniswap);
        uint256 uniswapPrice = Math.getPartial(ethUsd.value, ethAmt, daiAmt);

        return Monetary.Price({
            value: uniswapPrice
        });
    }

    // ============ Helper Functions ============

    function getPriceBounds(
        uint256 oldPrice,
        uint256 timeDelta
    )
        private
        view
        returns (uint256, uint256)
    {
        DeviationParams memory deviation = DEVIATION_PARAMS;

        uint256 maxDeviation = Math.getPartial(
            oldPrice,
            Math.min(deviation.maximumAbsolute, timeDelta.mul(deviation.maximumPerSecond)),
            deviation.denominator
        );

        return (
            oldPrice.sub(maxDeviation),
            oldPrice.add(maxDeviation)
        );
    }

    function getMidValue(
        uint256 valueA,
        uint256 valueB,
        uint256 valueC
    )
        private
        pure
        returns (uint256)
    {
        uint256 maximum = Math.max(valueA, Math.max(valueB, valueC));
        if (maximum == valueA) {
            return Math.max(valueB, valueC);
        }
        if (maximum == valueB) {
            return Math.max(valueA, valueC);
        }
        return Math.max(valueA, valueB);
    }

    function boundValue(
        uint256 value,
        uint256 minimum,
        uint256 maximum
    )
        private
        pure
        returns (uint256)
    {
        assert(minimum <= maximum);
        return Math.max(minimum, Math.min(maximum, value));
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"newPoker","type":"address"}],"name":"ownerSetPokerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getBoundedTargetPrice","outputs":[{"components":[{"name":"value","type":"uint256"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMedianizerPrice","outputs":[{"components":[{"name":"value","type":"uint256"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"components":[{"name":"value","type":"uint256"}],"name":"ethUsd","type":"tuple"}],"name":"getOasisPrice","outputs":[{"components":[{"name":"value","type":"uint256"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"OASIS","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DEVIATION_PARAMS","outputs":[{"name":"denominator","type":"uint64"},{"name":"maximumPerSecond","type":"uint64"},{"name":"maximumAbsolute","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"getPrice","outputs":[{"components":[{"name":"value","type":"uint256"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"components":[{"name":"value","type":"uint256"}],"name":"ethUsd","type":"tuple"}],"name":"getUniswapPrice","outputs":[{"components":[{"name":"value","type":"uint256"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ONE_DOLLAR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"g_poker","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MEDIANIZER","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"OASIS_ETH_AMOUNT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"components":[{"name":"value","type":"uint256"}],"name":"minimum","type":"tuple"},{"components":[{"name":"value","type":"uint256"}],"name":"maximum","type":"tuple"}],"name":"updatePrice","outputs":[{"components":[{"name":"price","type":"uint128"},{"name":"lastUpdate","type":"uint32"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"WETH","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"g_priceInfo","outputs":[{"name":"price","type":"uint128"},{"name":"lastUpdate","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTargetPrice","outputs":[{"components":[{"name":"value","type":"uint256"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UNISWAP","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DAI","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"poker","type":"address"},{"name":"weth","type":"address"},{"name":"dai","type":"address"},{"name":"medianizer","type":"address"},{"name":"oasis","type":"address"},{"name":"uniswap","type":"address"},{"name":"oasisEthAmount","type":"uint256"},{"components":[{"name":"denominator","type":"uint64"},{"name":"maximumPerSecond","type":"uint64"},{"name":"maximumAbsolute","type":"uint64"}],"name":"deviationParams","type":"tuple"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"components":[{"name":"price","type":"uint128"},{"name":"lastUpdate","type":"uint32"}],"indexed":false,"name":"newPriceInfo","type":"tuple"}],"name":"PriceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60806040523480156200001157600080fd5b50604051610140806200228c833981018060405262000034919081019062000251565b60008054600160a060020a0319163317808255604051600160a060020a039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360028054600160a060020a03998a16600160a060020a03199182161790915560078054968a169682169690961790955560058054978916978616979097179096556006805495881695851695909517909455600880549287169284169290921790915560098054919095169116179092558051600380546020808501516040958601516001604060020a03908116700100000000000000000000000000000000908102608060020a60c060020a03199383166801000000000000000002604060020a608060020a03199390981667ffffffffffffffff1990961695909517919091169590951716919091179091556004939093558151808301909252670de0b6b3a76400008083524263ffffffff1692909301829052600180546001608060020a031916909317608060020a63ffffffff021916910217905562000367565b6000620001ca825162000339565b9392505050565b600060608284031215620001e457600080fd5b620001f0606062000312565b9050600062000200848462000243565b8252506020620002138484830162000243565b6020830152506040620002298482850162000243565b60408301525092915050565b6000620001ca825162000358565b6000620001ca82516200035b565b600080600080600080600080610140898b0312156200026f57600080fd5b60006200027d8b8b620001bc565b9850506020620002908b828c01620001bc565b9750506040620002a38b828c01620001bc565b9650506060620002b68b828c01620001bc565b9550506080620002c98b828c01620001bc565b94505060a0620002dc8b828c01620001bc565b93505060c0620002ef8b828c0162000235565b92505060e0620003028b828c01620001d1565b9150509295985092959890939650565b6040518181016001604060020a03811182821017156200033157600080fd5b604052919050565b600062000346826200034c565b92915050565b600160a060020a031690565b90565b6001604060020a031690565b611f1580620003776000396000f3fe608060405234801561001057600080fd5b506004361061019e576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b116100f5578063ad5c4648116100a9578063c745d9e711610083578063c745d9e7146102e8578063e0bab4c4146102f0578063f2fde38b146102f85761019e565b8063ad5c4648146102c2578063afb1f8d6146102ca578063bd01bb32146102e05761019e565b806394c5eddb116100da57806394c5eddb1461029257806396363e291461029a578063a9000566146102a25761019e565b80638da5cb5b146102755780638f32d59b1461027d5761019e565b806325878e0d11610157578063572ca9e711610131578063572ca9e714610243578063715018a614610258578063748635c7146102605761019e565b806325878e0d1461020657806341976e091461021d5780634a7454f8146102305761019e565b80630a7d8486116101885780630a7d8486146101d65780630ced7610146101de5780631ebd567b146101f15761019e565b8062a341c8146101a357806303ad0d63146101b8575b600080fd5b6101b66101b1366004611980565b61030b565b005b6101c0610363565b6040516101cd9190611d0b565b60405180910390f35b6101c061043f565b6101c06101ec3660046119e2565b610515565b6101f9610926565b6040516101cd9190611cd0565b61020e610942565b6040516101cd93929190611d42565b6101c061022b366004611980565b61097a565b6101c061023e3660046119e2565b6109a9565b61024b610a8e565b6040516101cd9190611d34565b6101b6610aa1565b610268610b21565b6040516101cd9190611c8c565b610268610b3d565b610285610b59565b6040516101cd9190611cc2565b6101f9610b77565b61024b610b93565b6102b56102b0366004611a00565b610b99565b6040516101cd9190611cef565b6101f9610e14565b6102d2610e30565b6040516101cd929190611d19565b6101c0610e64565b610268610eba565b6101f9610ed6565b6101b6610306366004611980565b610ef2565b610313610b59565b61031c57600080fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61036b6118d3565b6103736118d3565b61037b610e64565b90506103856118e6565b50604080518082019091526001546fffffffffffffffffffffffffffffffff81168252700100000000000000000000000000000000900463ffffffff16602082018190526000906103ec906103d8610f0f565b63ffffffff16610f1f90919063ffffffff16565b905060008061041184600001516fffffffffffffffffffffffffffffffff1684610f34565b91509150600061042686600001518484610ff2565b6040805160208101909152908152965050505050505090565b6104476118d3565b6040518060200160405280600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357de26a46040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156104d657600080fd5b505afa1580156104ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061050e91908101906119c4565b9052905090565b61051d6118d3565b600854604080517fc2b6b58c000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691829163c2b6b58c916004808301926020929190829003018186803b15801561058957600080fd5b505afa15801561059d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105c191908101906119a6565b8061066357508073ffffffffffffffffffffffffffffffffffffffff1663f582d2936040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561062957600080fd5b505afa15801561063d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061066191908101906119a6565b155b8061070557508073ffffffffffffffffffffffffffffffffffffffff166301492a0b6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156106cb57600080fd5b505afa1580156106df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061070391908101906119a6565b155b1561073357505060408051602081019091526001546fffffffffffffffffffffffffffffffff168152610921565b600480546006546005546040517f144a2752000000000000000000000000000000000000000000000000000000008152929373ffffffffffffffffffffffffffffffffffffffff92831693918316926000929087169163144a27529161079f91879187918a9101611c9a565b60206040518083038186803b1580156107b757600080fd5b505afa1580156107cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107ef91908101906119c4565b905060008573ffffffffffffffffffffffffffffffffffffffff1663ff1fd9748585886040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161084c93929190611c9a565b60206040518083038186803b15801561086457600080fd5b505afa158015610878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061089c91908101906119c4565b905060006108cf6108b3878563ffffffff61101b16565b6108c3888563ffffffff61101b16565b9063ffffffff61104216565b905060006108f460026108e8868663ffffffff61101b16565b9063ffffffff61101b16565b905060006109078b600001518484611054565b604080516020810190915290815299505050505050505050505b919050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60035467ffffffffffffffff808216916801000000000000000081048216917001000000000000000000000000000000009091041683565b6109826118d3565b505060408051602081019091526001546fffffffffffffffffffffffffffffffff16815290565b6109b16118d3565b6009546006546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316928331926000929116906370a0823190610a13908690600401611c8c565b60206040518083038186803b158015610a2b57600080fd5b505afa158015610a3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a6391908101906119c4565b90506000610a7686600001518484611054565b60408051602081019091529081529695505050505050565b6ec097ce7bc90715b34b9f100000000081565b610aa9610b59565b610ab257600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff16331490565b60075473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b610ba16118e6565b600254610c0c9073ffffffffffffffffffffffffffffffffffffffff1633908114907f44616950726963654f7261636c65000000000000000000000000000000000000907f4f6e6c7920706f6b65722063616e2063616c6c2075706461746550726963650090611076565b610c146118d3565b610c1c610363565b84518151919250610c759181811015917f44616950726963654f7261636c65000000000000000000000000000000000000917f6e657750726963652062656c6f77206d696e696d756d000000000000000000009161117b565b82518151610ccc9180821115917f44616950726963654f7261636c65000000000000000000000000000000000000917f6e657750726963652061626f7665206d6178696d756d00000000000000000000919061117b565b6040518060400160405280610ce48360000151611246565b6fffffffffffffffffffffffffffffffff168152602001610d03610f0f565b63ffffffff908116909152815160018054602090940151909216700100000000000000000000000000000000027fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941693909317169190911781556040517fe98273326f8618f83229329c983e5dfeafe5dd27b8d4bdf152fb230a73f112d491610dc291611cfd565b60405180910390a15050604080518082019091526001546fffffffffffffffffffffffffffffffff81168252700100000000000000000000000000000000900463ffffffff1660208201525b92915050565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b6001546fffffffffffffffffffffffffffffffff811690700100000000000000000000000000000000900463ffffffff1682565b610e6c6118d3565b610e746118d3565b610e7c61043f565b90506000610ea5670de0b6b3a7640000610e9584610515565b51610e9f856109a9565b516112a8565b60408051602081019091529081529250505090565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b610efa610b59565b610f0357600080fd5b610f0c816112fa565b50565b6000610f1a426113a7565b905090565b600082821115610f2e57600080fd5b50900390565b600080610f3f6118fd565b506040805160608101825260035467ffffffffffffffff8082168352680100000000000000008204811660208401819052700100000000000000000000000000000000909204169282018390529091600091610fc3918891610fb29190610fad908a9063ffffffff61101b16565b6113fd565b845167ffffffffffffffff16611054565b9050610fd5868263ffffffff610f1f16565b610fe5878363ffffffff61104216565b9350935050509250929050565b600081831115610ffe57fe5b6110118361100c84876113fd565b611413565b90505b9392505050565b60008261102a57506000610e0e565b8282028284828161103757fe5b041461101457600080fd5b60008282018381101561101457600080fd5b60006110118261106a868663ffffffff61101b16565b9063ffffffff61142216565b836111755761108483611444565b7f3a200000000000000000000000000000000000000000000000000000000000006110ae84611444565b7f203c0000000000000000000000000000000000000000000000000000000000006110d885611543565b60405161110e9594939291907f3e0000000000000000000000000000000000000000000000000000000000000090602001611bb2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261116c91600401611cde565b60405180910390fd5b50505050565b8461123f5761118984611444565b7f3a200000000000000000000000000000000000000000000000000000000000006111b385611444565b7f203c0000000000000000000000000000000000000000000000000000000000006111dd866116f6565b7f2c20000000000000000000000000000000000000000000000000000000000000611207876116f6565b60405161110e97969594939291907f3e0000000000000000000000000000000000000000000000000000000000000090602001611c10565b5050505050565b600081610e0e6fffffffffffffffffffffffffffffffff821682147f4d617468000000000000000000000000000000000000000000000000000000007f556e73616665206361737420746f2075696e7431323800000000000000000000611824565b6000806112b98561100c8686611413565b9050848114156112d5576112cd8484611413565b915050611014565b838114156112e7576112cd8584611413565b6112f18585611413565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811661131a57600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600081610e0e63ffffffff821682147f4d617468000000000000000000000000000000000000000000000000000000007f556e73616665206361737420746f2075696e7433320000000000000000000000611824565b600081831061140c5781611014565b5090919050565b600081831161140c5781611014565b600080821161143057600080fd5b600082848161143b57fe5b04949350505050565b606080826040516020016114589190611b75565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060205b80156115285781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101908290829081106114c457fe5b6020910101517f010000000000000000000000000000000000000000000000000000000000000090819004027fff0000000000000000000000000000000000000000000000000000000000000016156115235760010181529050610921565b61148b565b5060408051600080825260208201909252905b509392505050565b60408051602a808252606082810190935273ffffffffffffffffffffffffffffffffffffffff841691839160208201818038833901905050905060307f010000000000000000000000000000000000000000000000000000000000000002816000815181106115ae57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060787f0100000000000000000000000000000000000000000000000000000000000000028160018151811061160e57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b601481101561153b5760028102611659600f8516611873565b83826029038151811061166857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010909304926116a9600f8516611873565b8382602803815181106116b857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050601090920491600101611640565b606081611737575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610921565b8160005b811561174f57600101600a8204915061173b565b6060816040519080825280601f01601f19166020018201604052801561177c576020820181803883390190505b508593509050815b801561181b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600a84066030017f0100000000000000000000000000000000000000000000000000000000000000028282815181106117e157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350611784565b50949350505050565b8261186e5761183282611444565b7f3a2000000000000000000000000000000000000000000000000000000000000061185c83611444565b60405160200161110e93929190611b8a565b505050565b6000600a8210156118aa57507f01000000000000000000000000000000000000000000000000000000000000006030820102610921565b506057017f01000000000000000000000000000000000000000000000000000000000000000290565b6040518060200160405280600081525090565b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b60006110148235611d9e565b60006110148251611da9565b60006110148251611df8565b60006020828403121561195357600080fd5b61195d6020611d6a565b9050600061196b8484611974565b82525092915050565b60006110148235611df8565b60006020828403121561199257600080fd5b600061199e848461191d565b949350505050565b6000602082840312156119b857600080fd5b600061199e8484611929565b6000602082840312156119d657600080fd5b600061199e8484611935565b6000602082840312156119f457600080fd5b600061199e8484611941565b60008060408385031215611a1357600080fd5b6000611a1f8585611941565b9250506020611a3085828601611941565b9150509250929050565b611a4381611d9e565b82525050565b611a4381611da9565b611a43611a5e82611dae565b611df8565b611a43611a5e82611dd3565b611a43611a5e82611df8565b6000611a8682611d91565b611a908185610921565b9350611aa0818560208601611e4a565b9290920192915050565b611a4381611e3f565b6000611abe82611d91565b611ac88185611d95565b9350611ad8818560208601611e4a565b611ae181611e9c565b9093019392505050565b80516040830190611afc8482611b51565b5060208201516111756020850182611b63565b80546040830190611b1f81611e76565b611b298582611b51565b50611b3381611e89565b61123f6020860182611b63565b805160208301906111758482611b5a565b611a4381611dfb565b611a4381611df8565b611a4381611e29565b611a4381611e32565b6000611b818284611a6f565b50602001919050565b6000611b968286611a7b565b9150611ba28285611a63565b6002820191506112f18284611a7b565b6000611bbe8289611a7b565b9150611bca8288611a63565b600282019150611bda8287611a7b565b9150611be68286611a63565b600282019150611bf68285611a7b565b9150611c028284611a52565b506001019695505050505050565b6000611c1c828b611a7b565b9150611c28828a611a63565b600282019150611c388289611a7b565b9150611c448288611a63565b600282019150611c548287611a7b565b9150611c608286611a63565b600282019150611c708285611a7b565b9150611c7c8284611a52565b5060010198975050505050505050565b60208101610e0e8284611a3a565b60608101611ca88286611a3a565b611cb56020830185611a3a565b61199e6040830184611b5a565b60208101610e0e8284611a49565b60208101610e0e8284611aaa565b602080825281016110148184611ab3565b60408101610e0e8284611aeb565b60408101610e0e8284611b0f565b60208101610e0e8284611b40565b60408101611d278285611b51565b6110146020830184611b63565b60208101610e0e8284611b5a565b60608101611d508286611b6c565b611d5d6020830185611b6c565b61199e6040830184611b6c565b60405181810167ffffffffffffffff81118282101715611d8957600080fd5b604052919050565b5190565b90815260200190565b6000610e0e82611e10565b151590565b7fff000000000000000000000000000000000000000000000000000000000000001690565b7fffff0000000000000000000000000000000000000000000000000000000000001690565b90565b6fffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b63ffffffff1690565b67ffffffffffffffff1690565b6000610e0e82611d9e565b60005b83811015611e65578181015183820152602001611e4d565b838111156111755750506000910152565b6000610e0e611e8483611df8565b611dfb565b6000610e0e611e9783611ec4565b611e29565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b70010000000000000000000000000000000090049056fea265627a7a72305820f259a3791853ed2d4b183f3a8bb3d3725747d18b68b8327f7cb69065000a7a576c6578706572696d656e74616cf50037000000000000000000000000ac89e378758c97625d5448065d92f63f4851f1e2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359000000000000000000000000729d19f657bd0614b4985cf1d82531c67569197b00000000000000000000000039755357759ce0d7f32dc8dc45414cca409ae24e00000000000000000000000009cabec1ead1c0ba254b09efb3ee13841712be14000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000002386f26fc10000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061019e576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b116100f5578063ad5c4648116100a9578063c745d9e711610083578063c745d9e7146102e8578063e0bab4c4146102f0578063f2fde38b146102f85761019e565b8063ad5c4648146102c2578063afb1f8d6146102ca578063bd01bb32146102e05761019e565b806394c5eddb116100da57806394c5eddb1461029257806396363e291461029a578063a9000566146102a25761019e565b80638da5cb5b146102755780638f32d59b1461027d5761019e565b806325878e0d11610157578063572ca9e711610131578063572ca9e714610243578063715018a614610258578063748635c7146102605761019e565b806325878e0d1461020657806341976e091461021d5780634a7454f8146102305761019e565b80630a7d8486116101885780630a7d8486146101d65780630ced7610146101de5780631ebd567b146101f15761019e565b8062a341c8146101a357806303ad0d63146101b8575b600080fd5b6101b66101b1366004611980565b61030b565b005b6101c0610363565b6040516101cd9190611d0b565b60405180910390f35b6101c061043f565b6101c06101ec3660046119e2565b610515565b6101f9610926565b6040516101cd9190611cd0565b61020e610942565b6040516101cd93929190611d42565b6101c061022b366004611980565b61097a565b6101c061023e3660046119e2565b6109a9565b61024b610a8e565b6040516101cd9190611d34565b6101b6610aa1565b610268610b21565b6040516101cd9190611c8c565b610268610b3d565b610285610b59565b6040516101cd9190611cc2565b6101f9610b77565b61024b610b93565b6102b56102b0366004611a00565b610b99565b6040516101cd9190611cef565b6101f9610e14565b6102d2610e30565b6040516101cd929190611d19565b6101c0610e64565b610268610eba565b6101f9610ed6565b6101b6610306366004611980565b610ef2565b610313610b59565b61031c57600080fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61036b6118d3565b6103736118d3565b61037b610e64565b90506103856118e6565b50604080518082019091526001546fffffffffffffffffffffffffffffffff81168252700100000000000000000000000000000000900463ffffffff16602082018190526000906103ec906103d8610f0f565b63ffffffff16610f1f90919063ffffffff16565b905060008061041184600001516fffffffffffffffffffffffffffffffff1684610f34565b91509150600061042686600001518484610ff2565b6040805160208101909152908152965050505050505090565b6104476118d3565b6040518060200160405280600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357de26a46040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156104d657600080fd5b505afa1580156104ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061050e91908101906119c4565b9052905090565b61051d6118d3565b600854604080517fc2b6b58c000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691829163c2b6b58c916004808301926020929190829003018186803b15801561058957600080fd5b505afa15801561059d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105c191908101906119a6565b8061066357508073ffffffffffffffffffffffffffffffffffffffff1663f582d2936040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561062957600080fd5b505afa15801561063d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061066191908101906119a6565b155b8061070557508073ffffffffffffffffffffffffffffffffffffffff166301492a0b6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156106cb57600080fd5b505afa1580156106df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061070391908101906119a6565b155b1561073357505060408051602081019091526001546fffffffffffffffffffffffffffffffff168152610921565b600480546006546005546040517f144a2752000000000000000000000000000000000000000000000000000000008152929373ffffffffffffffffffffffffffffffffffffffff92831693918316926000929087169163144a27529161079f91879187918a9101611c9a565b60206040518083038186803b1580156107b757600080fd5b505afa1580156107cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107ef91908101906119c4565b905060008573ffffffffffffffffffffffffffffffffffffffff1663ff1fd9748585886040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161084c93929190611c9a565b60206040518083038186803b15801561086457600080fd5b505afa158015610878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061089c91908101906119c4565b905060006108cf6108b3878563ffffffff61101b16565b6108c3888563ffffffff61101b16565b9063ffffffff61104216565b905060006108f460026108e8868663ffffffff61101b16565b9063ffffffff61101b16565b905060006109078b600001518484611054565b604080516020810190915290815299505050505050505050505b919050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60035467ffffffffffffffff808216916801000000000000000081048216917001000000000000000000000000000000009091041683565b6109826118d3565b505060408051602081019091526001546fffffffffffffffffffffffffffffffff16815290565b6109b16118d3565b6009546006546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316928331926000929116906370a0823190610a13908690600401611c8c565b60206040518083038186803b158015610a2b57600080fd5b505afa158015610a3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a6391908101906119c4565b90506000610a7686600001518484611054565b60408051602081019091529081529695505050505050565b6ec097ce7bc90715b34b9f100000000081565b610aa9610b59565b610ab257600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff16331490565b60075473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b610ba16118e6565b600254610c0c9073ffffffffffffffffffffffffffffffffffffffff1633908114907f44616950726963654f7261636c65000000000000000000000000000000000000907f4f6e6c7920706f6b65722063616e2063616c6c2075706461746550726963650090611076565b610c146118d3565b610c1c610363565b84518151919250610c759181811015917f44616950726963654f7261636c65000000000000000000000000000000000000917f6e657750726963652062656c6f77206d696e696d756d000000000000000000009161117b565b82518151610ccc9180821115917f44616950726963654f7261636c65000000000000000000000000000000000000917f6e657750726963652061626f7665206d6178696d756d00000000000000000000919061117b565b6040518060400160405280610ce48360000151611246565b6fffffffffffffffffffffffffffffffff168152602001610d03610f0f565b63ffffffff908116909152815160018054602090940151909216700100000000000000000000000000000000027fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941693909317169190911781556040517fe98273326f8618f83229329c983e5dfeafe5dd27b8d4bdf152fb230a73f112d491610dc291611cfd565b60405180910390a15050604080518082019091526001546fffffffffffffffffffffffffffffffff81168252700100000000000000000000000000000000900463ffffffff1660208201525b92915050565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b6001546fffffffffffffffffffffffffffffffff811690700100000000000000000000000000000000900463ffffffff1682565b610e6c6118d3565b610e746118d3565b610e7c61043f565b90506000610ea5670de0b6b3a7640000610e9584610515565b51610e9f856109a9565b516112a8565b60408051602081019091529081529250505090565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b610efa610b59565b610f0357600080fd5b610f0c816112fa565b50565b6000610f1a426113a7565b905090565b600082821115610f2e57600080fd5b50900390565b600080610f3f6118fd565b506040805160608101825260035467ffffffffffffffff8082168352680100000000000000008204811660208401819052700100000000000000000000000000000000909204169282018390529091600091610fc3918891610fb29190610fad908a9063ffffffff61101b16565b6113fd565b845167ffffffffffffffff16611054565b9050610fd5868263ffffffff610f1f16565b610fe5878363ffffffff61104216565b9350935050509250929050565b600081831115610ffe57fe5b6110118361100c84876113fd565b611413565b90505b9392505050565b60008261102a57506000610e0e565b8282028284828161103757fe5b041461101457600080fd5b60008282018381101561101457600080fd5b60006110118261106a868663ffffffff61101b16565b9063ffffffff61142216565b836111755761108483611444565b7f3a200000000000000000000000000000000000000000000000000000000000006110ae84611444565b7f203c0000000000000000000000000000000000000000000000000000000000006110d885611543565b60405161110e9594939291907f3e0000000000000000000000000000000000000000000000000000000000000090602001611bb2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261116c91600401611cde565b60405180910390fd5b50505050565b8461123f5761118984611444565b7f3a200000000000000000000000000000000000000000000000000000000000006111b385611444565b7f203c0000000000000000000000000000000000000000000000000000000000006111dd866116f6565b7f2c20000000000000000000000000000000000000000000000000000000000000611207876116f6565b60405161110e97969594939291907f3e0000000000000000000000000000000000000000000000000000000000000090602001611c10565b5050505050565b600081610e0e6fffffffffffffffffffffffffffffffff821682147f4d617468000000000000000000000000000000000000000000000000000000007f556e73616665206361737420746f2075696e7431323800000000000000000000611824565b6000806112b98561100c8686611413565b9050848114156112d5576112cd8484611413565b915050611014565b838114156112e7576112cd8584611413565b6112f18585611413565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff811661131a57600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600081610e0e63ffffffff821682147f4d617468000000000000000000000000000000000000000000000000000000007f556e73616665206361737420746f2075696e7433320000000000000000000000611824565b600081831061140c5781611014565b5090919050565b600081831161140c5781611014565b600080821161143057600080fd5b600082848161143b57fe5b04949350505050565b606080826040516020016114589190611b75565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060205b80156115285781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101908290829081106114c457fe5b6020910101517f010000000000000000000000000000000000000000000000000000000000000090819004027fff0000000000000000000000000000000000000000000000000000000000000016156115235760010181529050610921565b61148b565b5060408051600080825260208201909252905b509392505050565b60408051602a808252606082810190935273ffffffffffffffffffffffffffffffffffffffff841691839160208201818038833901905050905060307f010000000000000000000000000000000000000000000000000000000000000002816000815181106115ae57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060787f0100000000000000000000000000000000000000000000000000000000000000028160018151811061160e57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b601481101561153b5760028102611659600f8516611873565b83826029038151811061166857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010909304926116a9600f8516611873565b8382602803815181106116b857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050601090920491600101611640565b606081611737575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610921565b8160005b811561174f57600101600a8204915061173b565b6060816040519080825280601f01601f19166020018201604052801561177c576020820181803883390190505b508593509050815b801561181b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600a84066030017f0100000000000000000000000000000000000000000000000000000000000000028282815181106117e157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350611784565b50949350505050565b8261186e5761183282611444565b7f3a2000000000000000000000000000000000000000000000000000000000000061185c83611444565b60405160200161110e93929190611b8a565b505050565b6000600a8210156118aa57507f01000000000000000000000000000000000000000000000000000000000000006030820102610921565b506057017f01000000000000000000000000000000000000000000000000000000000000000290565b6040518060200160405280600081525090565b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b60006110148235611d9e565b60006110148251611da9565b60006110148251611df8565b60006020828403121561195357600080fd5b61195d6020611d6a565b9050600061196b8484611974565b82525092915050565b60006110148235611df8565b60006020828403121561199257600080fd5b600061199e848461191d565b949350505050565b6000602082840312156119b857600080fd5b600061199e8484611929565b6000602082840312156119d657600080fd5b600061199e8484611935565b6000602082840312156119f457600080fd5b600061199e8484611941565b60008060408385031215611a1357600080fd5b6000611a1f8585611941565b9250506020611a3085828601611941565b9150509250929050565b611a4381611d9e565b82525050565b611a4381611da9565b611a43611a5e82611dae565b611df8565b611a43611a5e82611dd3565b611a43611a5e82611df8565b6000611a8682611d91565b611a908185610921565b9350611aa0818560208601611e4a565b9290920192915050565b611a4381611e3f565b6000611abe82611d91565b611ac88185611d95565b9350611ad8818560208601611e4a565b611ae181611e9c565b9093019392505050565b80516040830190611afc8482611b51565b5060208201516111756020850182611b63565b80546040830190611b1f81611e76565b611b298582611b51565b50611b3381611e89565b61123f6020860182611b63565b805160208301906111758482611b5a565b611a4381611dfb565b611a4381611df8565b611a4381611e29565b611a4381611e32565b6000611b818284611a6f565b50602001919050565b6000611b968286611a7b565b9150611ba28285611a63565b6002820191506112f18284611a7b565b6000611bbe8289611a7b565b9150611bca8288611a63565b600282019150611bda8287611a7b565b9150611be68286611a63565b600282019150611bf68285611a7b565b9150611c028284611a52565b506001019695505050505050565b6000611c1c828b611a7b565b9150611c28828a611a63565b600282019150611c388289611a7b565b9150611c448288611a63565b600282019150611c548287611a7b565b9150611c608286611a63565b600282019150611c708285611a7b565b9150611c7c8284611a52565b5060010198975050505050505050565b60208101610e0e8284611a3a565b60608101611ca88286611a3a565b611cb56020830185611a3a565b61199e6040830184611b5a565b60208101610e0e8284611a49565b60208101610e0e8284611aaa565b602080825281016110148184611ab3565b60408101610e0e8284611aeb565b60408101610e0e8284611b0f565b60208101610e0e8284611b40565b60408101611d278285611b51565b6110146020830184611b63565b60208101610e0e8284611b5a565b60608101611d508286611b6c565b611d5d6020830185611b6c565b61199e6040830184611b6c565b60405181810167ffffffffffffffff81118282101715611d8957600080fd5b604052919050565b5190565b90815260200190565b6000610e0e82611e10565b151590565b7fff000000000000000000000000000000000000000000000000000000000000001690565b7fffff0000000000000000000000000000000000000000000000000000000000001690565b90565b6fffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b63ffffffff1690565b67ffffffffffffffff1690565b6000610e0e82611d9e565b60005b83811015611e65578181015183820152602001611e4d565b838111156111755750506000910152565b6000610e0e611e8483611df8565b611dfb565b6000610e0e611e9783611ec4565b611e29565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b70010000000000000000000000000000000090049056fea265627a7a72305820f259a3791853ed2d4b183f3a8bb3d3725747d18b68b8327f7cb69065000a7a576c6578706572696d656e74616cf50037

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

000000000000000000000000ac89e378758c97625d5448065d92f63f4851f1e2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359000000000000000000000000729d19f657bd0614b4985cf1d82531c67569197b00000000000000000000000039755357759ce0d7f32dc8dc45414cca409ae24e00000000000000000000000009cabec1ead1c0ba254b09efb3ee13841712be14000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000005af3107a4000000000000000000000000000000000000000000000000000002386f26fc10000

-----Decoded View---------------
Arg [0] : poker (address): 0xac89e378758c97625D5448065d92F63F4851F1E2
Arg [1] : weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : dai (address): 0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359
Arg [3] : medianizer (address): 0x729D19f657BD0614b4985Cf1D82531c67569197B
Arg [4] : oasis (address): 0x39755357759cE0d7f32dC8dC45414CCa409AE24e
Arg [5] : uniswap (address): 0x09cabEC1eAd1c0Ba254B09efb3EE13841712bE14
Arg [6] : oasisEthAmount (uint256): 10000000000000000
Arg [7] : deviationParams (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 000000000000000000000000ac89e378758c97625d5448065d92f63f4851f1e2
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359
Arg [3] : 000000000000000000000000729d19f657bd0614b4985cf1d82531c67569197b
Arg [4] : 00000000000000000000000039755357759ce0d7f32dc8dc45414cca409ae24e
Arg [5] : 00000000000000000000000009cabec1ead1c0ba254b09efb3ee13841712be14
Arg [6] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [7] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [8] : 00000000000000000000000000000000000000000000000000005af3107a4000
Arg [9] : 000000000000000000000000000000000000000000000000002386f26fc10000


Deployed Bytecode Sourcemap

25112:8341:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25112:8341:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26957:143;;;;;;;;;:::i;:::-;;28612:579;;;:::i;:::-;;;;;;;;;;;;;;;;29928:252;;;:::i;30289:1227::-;;;;;;;;;:::i;26082:22::-;;;:::i;:::-;;;;;;;;25902:39;;;:::i;:::-;;;;;;;;;;28236:223;;;;;;;;;:::i;31624:453::-;;;;;;;;;:::i;7088:45::-;;;:::i;:::-;;;;;;;;4071:140;;;:::i;25871:22::-;;;:::i;:::-;;;;;;;;3358:79;;;:::i;3693:92::-;;;:::i;:::-;;;;;;;;26043:30;;;:::i;25950:31::-;;;:::i;27161:1008::-;;;;;;;;;:::i;:::-;;;;;;;;25990:18;;;:::i;25834:28::-;;;:::i;:::-;;;;;;;;;29404:424;;;:::i;26113:22::-;;;:::i;26017:17::-;;;:::i;4388:109::-;;;;;;;;;:::i;26957:143::-;3570:9;:7;:9::i;:::-;3562:18;;;;;;27074:7;:18;;;;;;;;;;;;;;;26957:143::o;28612:579::-;28693:21;;:::i;:::-;28732:33;;:::i;:::-;28768:16;:14;:16::i;:::-;28732:52;;28797:24;;:::i;:::-;-1:-1:-1;28797:38:0;;;;;;;;;28824:11;28797:38;;;;;;;;;;;;;;;;;-1:-1:-1;;28866:51:0;;28874:18;:16;:18::i;:::-;28866:27;;:31;;:51;;;;:::i;:::-;28846:71;;28929:16;28947;28967:40;28982:7;:13;;;28967:40;;28997:9;28967:14;:40::i;:::-;28928:79;;;;29018:26;29047:49;29058:11;:17;;;29077:8;29087;29047:10;:49::i;:::-;29116:67;;;;;;;;;;;;;-1:-1:-1;;;;;;;28612:579:0;:::o;29928:252::-;30006:21;;:::i;:::-;30097:75;;;;;;;;30142:10;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30142:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30142:17:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30142:17:0;;;;;;;;;30097:75;;30090:82;-1:-1:-1;29928:252:0;:::o;30289:1227::-;30406:21;;:::i;:::-;30463:5;;30622:16;;;;;;;;30463:5;;;;;;;30622:14;;:16;;;;;;;;;;;;;;30463:5;30622:16;;;5:2:-1;;;;30:1;27;20:12;5:2;30622:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30622:16:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30622:16:0;;;;;;;;;:52;;;;30656:5;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30656:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30656:18:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30656:18:0;;;;;;;;;30655:19;30622:52;:93;;;;30692:5;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30692:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30692:23:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30692:23:0;;;;;;;;;30691:24;30622:93;30604:231;;;-1:-1:-1;;30749:74:0;;;;;;;;;30790:11;:17;;;30749:74;;30742:81;;30604:231;30864:16;;;30913:3;;30951:4;;31132:37;;;;;30864:16;;30913:3;;;;;30951:4;;;;30847:14;;31132:18;;;;;;:37;;30913:3;;30951:4;;30864:16;;31132:37;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31132:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31132:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;31132:37:0;;;;;;;;;31114:55;;31180:15;31198:5;:18;;;31217:3;31222:4;31228:6;31198:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31198:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31198:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;31198:37:0;;;;;;;;;31180:55;-1:-1:-1;31248:11:0;31262:44;31286:19;:6;31297:7;31286:19;:10;:19;:::i;:::-;31262;:6;31273:7;31262:19;:10;:19;:::i;:::-;:23;:44;:23;:44;:::i;:::-;31248:58;-1:-1:-1;31317:11:0;31331:27;31356:1;31331:20;:7;31343;31331:20;:11;:20;:::i;:::-;:24;:27;:24;:27;:::i;:::-;31317:41;;31369:18;31390:39;31406:6;:12;;;31420:3;31425;31390:15;:39::i;:::-;31449:59;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;30289:1227:0;;;;:::o;26082:22::-;;;;;;:::o;25902:39::-;;;;;;;;;;;;;;;;;;;;:::o;28236:223::-;28339:21;;:::i;:::-;-1:-1:-1;;28385:66:0;;;;;;;;;28422:11;:17;;;28385:66;;;28236:223::o;31624:453::-;31743:21;;:::i;:::-;31808:7;;31887:3;;:22;;;;;31808:7;;;;;31844:15;;;31782;;31887:3;;;:13;;:22;;31808:7;;31887:22;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31887:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31887:22:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;31887:22:0;;;;;;;;;31870:39;;31920:20;31943:45;31959:6;:12;;;31973:6;31981;31943:15;:45::i;:::-;32008:61;;;;;;;;;;;;;31624:453;-1:-1:-1;;;;;;31624:453:0:o;7088:45::-;7125:8;7088:45;:::o;4071:140::-;3570:9;:7;:9::i;:::-;3562:18;;;;;;4170:1;4154:6;;4133:40;;;4154:6;;;;4133:40;;4170:1;;4133:40;4201:1;4184:19;;;;;;4071:140::o;25871:22::-;;;;;;:::o;3358:79::-;3396:7;3423:6;;;3358:79;:::o;3693:92::-;3733:4;3771:6;;;3757:10;:20;;3693:92::o;26043:30::-;;;;;;:::o;25950:31::-;;;;:::o;27161:1008::-;27303:16;;:::i;:::-;27378:7;;27337:151;;27378:7;;27364:10;:21;;;;27400:4;;27337:151;;:12;:151::i;:::-;27501:30;;:::i;:::-;27534:23;:21;:23::i;:::-;27615:13;;27597:14;;27501:56;;-1:-1:-1;27570:184:0;;27597:31;;;;;27643:4;;27570:184;;:12;:184::i;:::-;27812:13;;27794:14;;27767:184;;27794:31;;;;;27840:4;;27767:184;;27794:14;27767:12;:184::i;:::-;27978:115;;;;;;;;28010:26;28021:8;:14;;;28010:10;:26::i;:::-;27978:115;;;;;;28063:18;:16;:18::i;:::-;27978:115;;;;;;;27964:129;;:11;:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28111:21;;;;;;;;;;;;;;;;-1:-1:-1;;28143:18:0;;;;;;;;;28150:11;28143:18;;;;;;;;;;;;;;;27161:1008;;;;;:::o;25990:18::-;;;;;;:::o;25834:28::-;;;;;;;;;;;;;:::o;29404:424::-;29478:21;;:::i;:::-;29517:28;;:::i;:::-;29548:20;:18;:20::i;:::-;29517:51;-1:-1:-1;29581:19:0;29603:137;25396:14;29658:21;29517:51;29658:13;:21::i;:::-;:27;29700:23;29716:6;29700:15;:23::i;:::-;:29;29603:11;:137::i;:::-;29760:60;;;;;;;;;;;;;-1:-1:-1;;;29404:424:0;:::o;26113:22::-;;;;;;:::o;26017:17::-;;;;;;:::o;4388:109::-;3570:9;:7;:9::i;:::-;3562:18;;;;;;4461:28;4480:8;4461:18;:28::i;:::-;4388:109;:::o;18296:138::-;18369:6;18400:26;18410:15;18400:9;:26::i;:::-;18393:33;;18296:138;:::o;1961:150::-;2019:7;2052:1;2047;:6;;2039:15;;;;;;-1:-1:-1;2077:5:0;;;1961:150::o;32138:555::-;32273:7;32282;32307:32;;:::i;:::-;-1:-1:-1;32307:51:0;;;;;;;;32342:16;32307:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32394:178:0;;32424:8;;32447:78;;32307:51;32483:41;;:9;;:41;:13;:41;:::i;:::-;32447:8;:78::i;:::-;32540:21;;32394:178;;:15;:178::i;:::-;32371:201;-1:-1:-1;32607:26:0;:8;32371:201;32607:26;:12;:26;:::i;:::-;32648;:8;32661:12;32648:26;:12;:26;:::i;:::-;32585:100;;;;;;32138:555;;;;;:::o;33178:272::-;33330:7;33373;33362;:18;;33355:26;;;;33399:43;33408:7;33417:24;33426:7;33435:5;33417:8;:24::i;:::-;33399:8;:43::i;:::-;33392:50;;33178:272;;;;;;:::o;956:433::-;1014:7;1258:6;1254:47;;-1:-1:-1;1288:1:0;1281:8;;1254:47;1325:5;;;1329:1;1325;:5;:1;1349:5;;;;;:10;1341:19;;;;;2197:150;2255:7;2287:5;;;2311:6;;;;2303:15;;;;;15988:238;16148:7;16180:38;16206:11;16180:21;:6;16191:9;16180:21;:10;:21;:::i;:::-;:25;:38;:25;:38;:::i;10200:566::-;10369:4;10364:395;;10487:15;10497:4;10487:9;:15::i;:::-;10529:5;10561:17;10571:6;10561:9;:17::i;:::-;10605:6;10638:19;10648:8;10638:9;:19::i;:::-;10444:269;;;;;;;;;10684:6;;10444:269;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;10444:269:0;;;;10390:357;;;;;;;;;;;;;;;;;10364:395;10200:566;;;;:::o;9521:671::-;9717:4;9712:473;;9835:15;9845:4;9835:9;:15::i;:::-;9877:5;9909:17;9919:6;9909:9;:17::i;:::-;9953:6;9986:19;9996:8;9986:9;:19::i;:::-;10032:5;10064:19;10074:8;10064:9;:19::i;:::-;9792:347;;;;;;;;;;;10110:6;;9792:347;;;;9712:473;9521:671;;;;;:::o;16749:309::-;16846:7;16896:6;16914:112;16941:16;;;;;16972:4;16914:112;:12;:112::i;32701:469::-;32853:7;32878:15;32896:42;32905:6;32913:24;32922:6;32930;32913:8;:24::i;32896:42::-;32878:60;;32964:6;32953:7;:17;32949:81;;;32994:24;33003:6;33011;32994:8;:24::i;:::-;32987:31;;;;;32949:81;33055:6;33044:7;:17;33040:81;;;33085:24;33094:6;33102;33085:8;:24::i;33040:81::-;33138:24;33147:6;33155;33138:8;:24::i;:::-;33131:31;32701:469;-1:-1:-1;;;;;32701:469:0:o;4647:187::-;4721:22;;;4713:31;;;;;;4781:6;;;4760:38;;;;;;;4781:6;;;4760:38;;;4809:6;:17;;;;;;;;;;;;;;;4647:187::o;17378:304::-;17474:6;17521;17539:111;17566:16;;;;;17597:4;17539:111;:12;:111::i;17690:163::-;17800:7;17836:1;17832;:5;:13;;17844:1;17832:13;;;-1:-1:-1;17840:1:0;;17825:20;-1:-1:-1;17690:163:0:o;17861:::-;17971:7;18007:1;18003;:5;:13;;18015:1;18003:13;;1522:303;1580:7;1679:1;1675;:5;1667:14;;;;;;1692:9;1708:1;1704;:5;;;;;;;1522:303;-1:-1:-1;;;;1522:303:0:o;12291:988::-;12390:12;12468:19;12507:5;12490:23;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;12490:23:0;;;;-1:-1:-1;49:4;12622:587:0;12643:5;;12622:587;;12900:9;;12799:3;;;;;12900:6;;12799:3;;12900:9;;;;;;;;;;;;;;;;;:14;;;12896:302;;12956:1;12952:5;13086:22;;13093:6;-1:-1:-1;13169:13:0;;12896:302;12622:587;;;-1:-1:-1;13259:12:0;;;13269:1;13259:12;;;;;;;;;;;-1:-1:-1;13252:19:0;12291:988;-1:-1:-1;;;12291:988:0:o;14244:993::-;14526:13;;;14536:2;14526:13;;;14343:12;14526:13;;;;;;14385:14;;;;14343:12;;14526:13;;;21:6:-1;;104:10;14526:13:0;87:34:-1;135:17;;-1:-1;14526:13:0;14504:35;;8109:2;14606:23;;14594:6;14601:1;14594:9;;;;;;;;;;;:35;;;;;;;;;;;8219:3;14652:27;;14640:6;14647:1;14640:9;;;;;;;;;;;:39;;;;;;;;;;-1:-1:-1;14796:9:0;14791:413;14815:2;14811:1;:6;14791:413;;;14906:1;14902:5;;15002:23;8446:3;15007:17;;15002:4;:23::i;:::-;14981:6;14993:5;14988:2;:10;14981:18;;;;;;;;;;;:44;;;;;;;;;;-1:-1:-1;45:20;25:41;;;;15144:23:0;8446:3;15149:17;;15144:4;:23::i;:::-;15123:6;15135:5;15130:2;:10;15123:18;;;;;;;;;;;:44;;;;;;;;;;-1:-1:-1;;45:20;25:41;;;;14819:3:0;;14791:413;;13287:949;13386:12;13420:10;13416:53;;-1:-1:-1;13447:10:0;;;;;;;;;;;;;;;;;;;13416:53;13533:5;13521:9;13574:72;13581:6;;13574:72;;13604:8;;13632:2;13627:7;;;;13574:72;;;13690:17;13720:6;13710:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;13710:17:0;87:34:-1;135:17;;-1:-1;13710:17:0;-1:-1:-1;13822:5:0;;-1:-1:-1;13690:37:0;-1:-1:-1;13855:6:0;13838:367;13863:5;;13838:367;;14019:3;;14118:2;14114:1;:6;8109:2;14100:21;14089:34;;14079:4;14084:1;14079:7;;;;;;;;;;;:44;;;;;;;;;;-1:-1:-1;14191:2:0;14186:7;;;;13838:367;;;-1:-1:-1;14224:4:0;13287:949;-1:-1:-1;;;;13287:949:0:o;8512:427::-;8654:4;8649:283;;8772:15;8782:4;8772:9;:15::i;:::-;8814:5;8846:17;8856:6;8846:9;:17::i;:::-;8729:157;;;;;;;;;;;8649:283;8512:427;;;:::o;15245:339::-;15339:4;15410:2;15402:5;:10;15398:81;;;-1:-1:-1;15436:31:0;8109:2;15447:18;;15436:31;15429:38;;15398:81;-1:-1:-1;8164:2:0;15547:27;15536:40;;;15245:339::o;25112:8341::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;25112:8341:0;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;25112:8341:0;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;130:116;;205:36;233:6;227:13;205:36;;253:122;;331:39;362:6;356:13;331:39;;410:320;;521:4;509:9;504:3;500:19;496:30;493:2;;;539:1;536;529:12;493:2;557:20;572:4;557:20;;;548:29;-1:-1;628:1;659:49;704:3;684:9;659:49;;;635:74;;-1:-1;646:5;487:243;-1:-1;;487:243;737:118;;804:46;842:6;829:20;804:46;;991:241;;1095:2;1083:9;1074:7;1070:23;1066:32;1063:2;;;1111:1;1108;1101:12;1063:2;1146:1;1163:53;1208:7;1188:9;1163:53;;;1153:63;1057:175;-1:-1;;;;1057:175;1239:257;;1351:2;1339:9;1330:7;1326:23;1322:32;1319:2;;;1367:1;1364;1357:12;1319:2;1402:1;1419:61;1472:7;1452:9;1419:61;;1503:263;;1618:2;1606:9;1597:7;1593:23;1589:32;1586:2;;;1634:1;1631;1624:12;1586:2;1669:1;1686:64;1742:7;1722:9;1686:64;;1773:285;;1899:2;1887:9;1878:7;1874:23;1870:32;1867:2;;;1915:1;1912;1905:12;1867:2;1950:1;1967:75;2034:7;2014:9;1967:75;;2065:454;;;2230:2;2218:9;2209:7;2205:23;2201:32;2198:2;;;2246:1;2243;2236:12;2198:2;2281:1;2298:75;2365:7;2345:9;2298:75;;;2288:85;;2260:119;2410:2;2428:75;2495:7;2486:6;2475:9;2471:22;2428:75;;;2418:85;;2389:120;2192:327;;;;;;2796:120;2879:31;2904:5;2879:31;;;2874:3;2867:44;2861:55;;;2923:111;3000:28;3022:5;3000:28;;3041:155;3140:50;3159:30;3183:5;3159:30;;;3140:50;;3203:155;3302:50;3321:30;3345:5;3321:30;;3365:159;3466:52;3486:31;3511:5;3486:31;;3531:356;;3659:38;3691:5;3659:38;;;3709:88;3790:6;3785:3;3709:88;;;3702:95;;3802:52;3847:6;3842:3;3835:4;3828:5;3824:16;3802:52;;;3866:16;;;;;3639:248;-1:-1;;3639:248;3894:154;3991:51;4036:5;3991:51;;4399:347;;4511:39;4544:5;4511:39;;;4562:71;4626:6;4621:3;4562:71;;;4555:78;;4638:52;4683:6;4678:3;4671:4;4664:5;4660:16;4638:52;;;4711:29;4733:6;4711:29;;;4702:39;;;;4491:255;-1:-1;;;4491:255;4826:479;5039:22;;4973:4;4964:14;;;5067:61;4968:3;5039:22;5067:61;;;4993:141;5212:4;5205:5;5201:16;5195:23;5224:60;5278:4;5273:3;5269:14;5256:11;5224:60;;5385:594;5601:22;;5529:4;5520:14;;;5648:55;5601:22;5648:55;;;5709:61;5760:3;5743:11;5709:61;;;5567:209;5837:55;5882:9;5837:55;;;5898:60;5952:4;5947:3;5943:14;5930:11;5898:60;;6039:313;6242:22;;6176:4;6167:14;;;6270:61;6171:3;6242:22;6270:61;;6359:110;6432:31;6457:5;6432:31;;6603:110;6676:31;6701:5;6676:31;;6847:107;6918:30;6942:5;6918:30;;7085:117;7166:30;7190:5;7166:30;;7209:244;;7328:75;7399:3;7390:6;7328:75;;;-1:-1;7425:2;7416:12;;7316:137;-1:-1;7316:137;7460:553;;7676:93;7765:3;7756:6;7676:93;;;7669:100;;7780:73;7849:3;7840:6;7780:73;;;7875:1;7870:3;7866:11;7859:18;;7895:93;7984:3;7975:6;7895:93;;8020:978;;8334:93;8423:3;8414:6;8334:93;;;8327:100;;8438:73;8507:3;8498:6;8438:73;;;8533:1;8528:3;8524:11;8517:18;;8553:93;8642:3;8633:6;8553:93;;;8546:100;;8657:73;8726:3;8717:6;8657:73;;;8752:1;8747:3;8743:11;8736:18;;8772:93;8861:3;8852:6;8772:93;;;8765:100;;8876:73;8945:3;8936:6;8876:73;;;-1:-1;8971:1;8962:11;;8315:683;-1:-1;;;;;;8315:683;9005:1269;;9391:93;9480:3;9471:6;9391:93;;;9384:100;;9495:73;9564:3;9555:6;9495:73;;;9590:1;9585:3;9581:11;9574:18;;9610:93;9699:3;9690:6;9610:93;;;9603:100;;9714:73;9783:3;9774:6;9714:73;;;9809:1;9804:3;9800:11;9793:18;;9829:93;9918:3;9909:6;9829:93;;;9822:100;;9933:73;10002:3;9993:6;9933:73;;;10028:1;10023:3;10019:11;10012:18;;10048:93;10137:3;10128:6;10048:93;;;10041:100;;10152:73;10221:3;10212:6;10152:73;;;-1:-1;10247:1;10238:11;;9372:902;-1:-1;;;;;;;;9372:902;10281:213;10399:2;10384:18;;10413:71;10388:9;10457:6;10413:71;;10501:435;10675:2;10660:18;;10689:71;10664:9;10733:6;10689:71;;;10771:72;10839:2;10828:9;10824:18;10815:6;10771:72;;;10854;10922:2;10911:9;10907:18;10898:6;10854:72;;10943:201;11055:2;11040:18;;11069:65;11044:9;11107:6;11069:65;;11151:241;11283:2;11268:18;;11297:85;11272:9;11355:6;11297:85;;11917:301;12055:2;12069:47;;;12040:18;;12130:78;12040:18;12194:6;12130:78;;12225:321;12397:2;12382:18;;12411:125;12386:9;12509:6;12411:125;;12553:315;12722:2;12707:18;;12736:122;12711:9;12831:6;12736:122;;12875:301;13037:2;13022:18;;13051:115;13026:9;13139:6;13051:115;;13183:320;13327:2;13312:18;;13341:71;13316:9;13385:6;13341:71;;;13423:70;13489:2;13478:9;13474:18;13465:6;13423:70;;13510:213;13628:2;13613:18;;13642:71;13617:9;13686:6;13642:71;;13730:423;13898:2;13883:18;;13912:69;13887:9;13954:6;13912:69;;;13992:70;14058:2;14047:9;14043:18;14034:6;13992:70;;;14073;14139:2;14128:9;14124:18;14115:6;14073:70;;14160:256;14222:2;14216:9;14248:17;;;14323:18;14308:34;;14344:22;;;14305:62;14302:2;;;14380:1;14377;14370:12;14302:2;14396;14389:22;14200:216;;-1:-1;14200:216;14423:91;14497:12;;14481:33;14774:163;14877:19;;;14926:4;14917:14;;14870:67;14945:105;;15014:31;15039:5;15014:31;;15057:92;15130:13;15123:21;;15106:43;15156:151;15235:66;15224:78;;15207:100;15314:151;15393:66;15382:78;;15365:100;15472:79;15541:5;15524:27;15558:120;15638:34;15627:46;;15610:68;15685:128;15765:42;15754:54;;15737:76;15906:95;15985:10;15974:22;;15957:44;16008:103;16087:18;16076:30;;16059:52;16877:149;;16970:51;17015:5;16970:51;;17787:268;17852:1;17859:101;17873:6;17870:1;17867:13;17859:101;;;17940:11;;;17934:18;17921:11;;;17914:39;17895:2;17888:10;17859:101;;;17975:6;17972:1;17969:13;17966:2;;;-1:-1;;18040:1;18022:16;;18015:27;17836:219;18063:161;;18153:66;18184:34;18207:10;18184:34;;;18153:66;;18231:162;;18321:67;18351:36;18376:10;18351:36;;;18321:67;;18641:97;18729:2;18709:14;18725:7;18705:28;;18689:49;18848:125;18931:35;18920:47;;;18901:72

Swarm Source

bzzr://f259a3791853ed2d4b183f3a8bb3d3725747d18b68b8327f7cb69065000a7a57

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.