Contract 0xDFEA02F2824Ee177733d6f108005E95C85D1D4bE

Contract Overview

Balance:
0 Ether
Txn Hash Method
Block
From
To
Value
0x1a9c5e0c7538a5bb8478705ede52c7b505bac8b3a2c4e828aea9425cab197ab9Add Pair243671442021-04-21 5:42:2027 days 15 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether0.0000474671
0xbde726cd5723e76b5aec52879709a5118faafc924a7cb032c93663a611cbdceeAdd Pair243671422021-04-21 5:42:1227 days 15 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether0.0000474671
0xafeb07a2795d1116d4bc97aad0af901687538f08a91573eb3b796682f0a5822fAdd Pair243671402021-04-21 5:42:0427 days 15 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether0.0000474551
0xb523c43fd9b31cf0403c9adbd56b43c99ca7437445aa0e92a7d4a2c0230ae297Add Pair242779842021-04-16 6:58:2032 days 13 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether0.000574350712.1
0xc9b6bf82a26319ad56cbd2653aadd9ab4ab358768d395232bbd0e145b19033c8Add Pair242779802021-04-16 6:57:5632 days 13 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether0.000574350712.1
0x6dc1bc40ac596b63fc8753ad48db9eb8ed6ab5e71a248dc4ab14cbe62d32f956Add Pair242779782021-04-16 6:57:4832 days 13 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether0.000574205512.1
0xd20ea765f5e1f26a0d562cf668cba7e6954c58bde5b2968d50a7fc7aadfb332aAdd Pair242779752021-04-16 6:57:3232 days 13 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether0.000574350712.1
0x3bfdd99de7a562ffbc19e7f989482e6908f87229c6350286fb96087c105e1454Edit Pair210665942020-09-21 19:37:52239 days 1 hr ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether0.0002919969
0x1d1d9603dd87d06e169c316b24dd7f92b35b6c1c6c3649733e1d34fb7a920dc80x60806040210655822020-09-21 18:29:32239 days 2 hrs ago0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3 IN  Contract Creation0 Ether0.0153845710
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x7ce5dc43372f6589f748039ba8d31b42100155e5901bf6b0f961e38c26263a28243576822021-04-20 19:02:3228 days 1 hr ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0x1c3d24cc87994e9f00960e9106a9e2ec7e89e38a0 Ether
0x7ce5dc43372f6589f748039ba8d31b42100155e5901bf6b0f961e38c26263a28243576822021-04-20 19:02:3228 days 1 hr ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0x7970ac597e74829dece89afcce608eb716cac8cc0 Ether
0x7ce5dc43372f6589f748039ba8d31b42100155e5901bf6b0f961e38c26263a28243576822021-04-20 19:02:3228 days 1 hr ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x7ce5dc43372f6589f748039ba8d31b42100155e5901bf6b0f961e38c26263a28243576822021-04-20 19:02:3228 days 1 hr ago 0xa37f4c5a7ad72eea9034195b75e7498c7ed1d4e3 0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether
0x7ce5dc43372f6589f748039ba8d31b42100155e5901bf6b0f961e38c26263a28243576822021-04-20 19:02:3228 days 1 hr ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0xe2cfc870edfb863bef5057ed19cb8f904c84100c0 Ether
0x7ce5dc43372f6589f748039ba8d31b42100155e5901bf6b0f961e38c26263a28243576822021-04-20 19:02:3228 days 1 hr ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x7ce5dc43372f6589f748039ba8d31b42100155e5901bf6b0f961e38c26263a28243576822021-04-20 19:02:3228 days 1 hr ago 0xa37f4c5a7ad72eea9034195b75e7498c7ed1d4e3 0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether
0x7ce5dc43372f6589f748039ba8d31b42100155e5901bf6b0f961e38c26263a28243576822021-04-20 19:02:3228 days 1 hr ago 0xa37f4c5a7ad72eea9034195b75e7498c7ed1d4e3 0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether
0x6f89e1bffee679622d14cbc4a00578bf9e500b23aeb946608e8e42bb6c39da9b240521872021-03-25 17:41:1654 days 3 hrs ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0x1c3d24cc87994e9f00960e9106a9e2ec7e89e38a0 Ether
0x6f89e1bffee679622d14cbc4a00578bf9e500b23aeb946608e8e42bb6c39da9b240521872021-03-25 17:41:1654 days 3 hrs ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0x7970ac597e74829dece89afcce608eb716cac8cc0 Ether
0x6f89e1bffee679622d14cbc4a00578bf9e500b23aeb946608e8e42bb6c39da9b240521872021-03-25 17:41:1654 days 3 hrs ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0x6f89e1bffee679622d14cbc4a00578bf9e500b23aeb946608e8e42bb6c39da9b240521872021-03-25 17:41:1654 days 3 hrs ago 0xa37f4c5a7ad72eea9034195b75e7498c7ed1d4e3 0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether
0x6f89e1bffee679622d14cbc4a00578bf9e500b23aeb946608e8e42bb6c39da9b240521872021-03-25 17:41:1654 days 3 hrs ago 0xa37f4c5a7ad72eea9034195b75e7498c7ed1d4e3 0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether
0xf4e6a3a20e5bfb286488cd8721e608987c20e3a97b04f389639448b1407fac48239559592021-03-17 4:07:4062 days 16 hrs ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0xe2cfc870edfb863bef5057ed19cb8f904c84100c0 Ether
0xf4e6a3a20e5bfb286488cd8721e608987c20e3a97b04f389639448b1407fac48239559592021-03-17 4:07:4062 days 16 hrs ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xf4e6a3a20e5bfb286488cd8721e608987c20e3a97b04f389639448b1407fac48239559592021-03-17 4:07:4062 days 16 hrs ago 0xa37f4c5a7ad72eea9034195b75e7498c7ed1d4e3 0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether
0xf4e6a3a20e5bfb286488cd8721e608987c20e3a97b04f389639448b1407fac48239559592021-03-17 4:07:4062 days 16 hrs ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0xe2cfc870edfb863bef5057ed19cb8f904c84100c0 Ether
0xf4e6a3a20e5bfb286488cd8721e608987c20e3a97b04f389639448b1407fac48239559592021-03-17 4:07:4062 days 16 hrs ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xf4e6a3a20e5bfb286488cd8721e608987c20e3a97b04f389639448b1407fac48239559592021-03-17 4:07:4062 days 16 hrs ago 0xa37f4c5a7ad72eea9034195b75e7498c7ed1d4e3 0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether
0xf4e6a3a20e5bfb286488cd8721e608987c20e3a97b04f389639448b1407fac48239559592021-03-17 4:07:4062 days 16 hrs ago 0xa37f4c5a7ad72eea9034195b75e7498c7ed1d4e3 0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether
0xb96bb6cd637b8f589f56fa10690633893f2f8b0c71bed7d5f424693722132c71239559482021-03-17 4:06:4062 days 16 hrs ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0xe2cfc870edfb863bef5057ed19cb8f904c84100c0 Ether
0xb96bb6cd637b8f589f56fa10690633893f2f8b0c71bed7d5f424693722132c71239559482021-03-17 4:06:4062 days 16 hrs ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
0xb96bb6cd637b8f589f56fa10690633893f2f8b0c71bed7d5f424693722132c71239559482021-03-17 4:06:4062 days 16 hrs ago 0xa37f4c5a7ad72eea9034195b75e7498c7ed1d4e3 0xdfea02f2824ee177733d6f108005e95c85d1d4be0 Ether
0xb96bb6cd637b8f589f56fa10690633893f2f8b0c71bed7d5f424693722132c71239559482021-03-17 4:06:4062 days 16 hrs ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0xe2cfc870edfb863bef5057ed19cb8f904c84100c0 Ether
0xb96bb6cd637b8f589f56fa10690633893f2f8b0c71bed7d5f424693722132c71239559482021-03-17 4:06:4062 days 16 hrs ago 0xdfea02f2824ee177733d6f108005e95c85d1d4be 0x9048278ca7e874f9338e4898c436ab07aa4547010 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PriceOracle

Compiler Version
v0.6.10+commit.00c0fcaf

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-21
*/

// Dependency file: @openzeppelin/contracts/math/SignedSafeMath.sol



// pragma solidity ^0.6.0;

/**
 * @title SignedSafeMath
 * @dev Signed math operations with safety checks that revert on error.
 */
library SignedSafeMath {
    int256 constant private _INT256_MIN = -2**255;

        /**
     * @dev Returns the multiplication of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // 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-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");

        int256 c = a * b;
        require(c / a == b, "SignedSafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two signed integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0, "SignedSafeMath: division by zero");
        require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");

        int256 c = a / b;

        return c;
    }

    /**
     * @dev Returns the subtraction of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");

        return c;
    }

    /**
     * @dev Returns the addition of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");

        return c;
    }
}

// Dependency file: @openzeppelin/contracts/math/SafeMath.sol



// pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot 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-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// Dependency file: @openzeppelin/contracts/GSN/Context.sol



// pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// Dependency file: contracts/lib/PreciseUnitMath.sol

/*
    Copyright 2020 Set Labs 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.6.10;
// pragma experimental ABIEncoderV2;

// import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol";
// import { SignedSafeMath } from "@openzeppelin/contracts/math/SignedSafeMath.sol";


/**
 * @title PreciseUnitMath
 * @author Set Protocol
 *
 * Arithmetic for fixed-point numbers with 18 decimals of precision. Some functions taken from
 * dYdX's BaseMath library.
 *
 * CHANGELOG:
 * - 9/21/20: Added safePower function
 */
library PreciseUnitMath {
    using SafeMath for uint256;
    using SignedSafeMath for int256;

    // The number One in precise units.
    uint256 constant internal PRECISE_UNIT = 10 ** 18;
    int256 constant internal PRECISE_UNIT_INT = 10 ** 18;

    // Max unsigned integer value
    uint256 constant internal MAX_UINT_256 = type(uint256).max;
    // Max and min signed integer value
    int256 constant internal MAX_INT_256 = type(int256).max;
    int256 constant internal MIN_INT_256 = type(int256).min;

    /**
     * @dev Getter function since constants can't be read directly from libraries.
     */
    function preciseUnit() internal pure returns (uint256) {
        return PRECISE_UNIT;
    }

    /**
     * @dev Getter function since constants can't be read directly from libraries.
     */
    function preciseUnitInt() internal pure returns (int256) {
        return PRECISE_UNIT_INT;
    }

    /**
     * @dev Getter function since constants can't be read directly from libraries.
     */
    function maxUint256() internal pure returns (uint256) {
        return MAX_UINT_256;
    }

    /**
     * @dev Getter function since constants can't be read directly from libraries.
     */
    function maxInt256() internal pure returns (int256) {
        return MAX_INT_256;
    }

    /**
     * @dev Getter function since constants can't be read directly from libraries.
     */
    function minInt256() internal pure returns (int256) {
        return MIN_INT_256;
    }

    /**
     * @dev Multiplies value a by value b (result is rounded down). It's assumed that the value b is the significand
     * of a number with 18 decimals precision.
     */
    function preciseMul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a.mul(b).div(PRECISE_UNIT);
    }

    /**
     * @dev Multiplies value a by value b (result is rounded towards zero). It's assumed that the value b is the
     * significand of a number with 18 decimals precision.
     */
    function preciseMul(int256 a, int256 b) internal pure returns (int256) {
        return a.mul(b).div(PRECISE_UNIT_INT);
    }

    /**
     * @dev Multiplies value a by value b (result is rounded up). It's assumed that the value b is the significand
     * of a number with 18 decimals precision.
     */
    function preciseMulCeil(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0 || b == 0) {
            return 0;
        }
        return a.mul(b).sub(1).div(PRECISE_UNIT).add(1);
    }

    /**
     * @dev Divides value a by value b (result is rounded down).
     */
    function preciseDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        return a.mul(PRECISE_UNIT).div(b);
    }


    /**
     * @dev Divides value a by value b (result is rounded towards 0).
     */
    function preciseDiv(int256 a, int256 b) internal pure returns (int256) {
        return a.mul(PRECISE_UNIT_INT).div(b);
    }

    /**
     * @dev Divides value a by value b (result is rounded up or away from 0).
     */
    function preciseDivCeil(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "Cant divide by 0");

        return a > 0 ? a.mul(PRECISE_UNIT).sub(1).div(b).add(1) : 0;
    }

    /**
     * @dev Divides value a by value b (result is rounded down - positive numbers toward 0 and negative away from 0).
     */
    function divDown(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0, "Cant divide by 0");
        require(a != MIN_INT_256 || b != -1, "Invalid input");

        int256 result = a.div(b);
        if (a ^ b < 0 && a % b != 0) {
            result -= 1;
        }

        return result;
    }

    /**
     * @dev Multiplies value a by value b where rounding is towards the lesser number. 
     * (positive values are rounded towards zero and negative values are rounded away from 0). 
     */
    function conservativePreciseMul(int256 a, int256 b) internal pure returns (int256) {
        return divDown(a.mul(b), PRECISE_UNIT_INT);
    }

    /**
     * @dev Divides value a by value b where rounding is towards the lesser number. 
     * (positive values are rounded towards zero and negative values are rounded away from 0). 
     */
    function conservativePreciseDiv(int256 a, int256 b) internal pure returns (int256) {
        return divDown(a.mul(PRECISE_UNIT_INT), b);
    }

    /**
    * @dev Performs the power on a specified value, reverts on overflow.
    */
    function safePower(
        uint256 a,
        uint256 pow
    )
        internal
        pure
        returns (uint256)
    {
        require(a > 0, "Value must be positive");

        uint256 result = 1;
        for (uint256 i = 0; i < pow; i++){
            uint256 previousResult = result;

            // Using safemath multiplication prevents overflows
            result = previousResult.mul(a);
        }

        return result;
    }
}
// Dependency file: contracts/interfaces/IOracleAdapter.sol

/*
    Copyright 2020 Set Labs 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.6.10;


/**
 * @title IOracleAdapter
 * @author Set Protocol
 *
 * Interface for calling an oracle adapter.
 */
interface IOracleAdapter {

    /**
     * Function for retrieving a price that requires sourcing data from outside protocols to calculate.
     *
     * @param  _assetOne    First asset in pair
     * @param  _assetTwo    Second asset in pair
     * @return                  Boolean indicating if oracle exists
     * @return              Current price of asset represented in uint256
     */
    function getPrice(address _assetOne, address _assetTwo) external view returns (bool, uint256);
}
// Dependency file: contracts/interfaces/IOracle.sol

/*
    Copyright 2020 Set Labs 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.6.10;


/**
 * @title IOracle
 * @author Set Protocol
 *
 * Interface for operating with any external Oracle that returns uint256 or
 * an adapting contract that converts oracle output to uint256
 */
interface IOracle {
    /**
     * @return  Current price of asset represented in uint256, typically a preciseUnit where 10^18 = 1.
     */
    function read() external view returns (uint256);
}
// Dependency file: contracts/interfaces/IController.sol

/*
    Copyright 2020 Set Labs 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.6.10;

interface IController {
    function addSet(address _setToken) external;
    function feeRecipient() external view returns(address);
    function getModuleFee(address _module, uint256 _feeType) external view returns(uint256);
    function isModule(address _module) external view returns(bool);
    function isSet(address _setToken) external view returns(bool);
    function isSystemContract(address _contractAddress) external view returns (bool);
    function resourceId(uint256 _id) external view returns(address);
}
// Dependency file: contracts/lib/AddressArrayUtils.sol

/*
    Copyright 2020 Set Labs 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.6.10;

/**
 * @title AddressArrayUtils
 * @author Set Protocol
 *
 * Utility functions to handle Address Arrays
 */
library AddressArrayUtils {

    /**
     * Finds the index of the first occurrence of the given element.
     * @param A The input array to search
     * @param a The value to find
     * @return Returns (index and isIn) for the first occurrence starting from index 0
     */
    function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) {
        uint256 length = A.length;
        for (uint256 i = 0; i < length; i++) {
            if (A[i] == a) {
                return (i, true);
            }
        }
        return (uint256(-1), false);
    }

    /**
    * Returns true if the value is present in the list. Uses indexOf internally.
    * @param A The input array to search
    * @param a The value to find
    * @return Returns isIn for the first occurrence starting from index 0
    */
    function contains(address[] memory A, address a) internal pure returns (bool) {
        (, bool isIn) = indexOf(A, a);
        return isIn;
    }

    /**
    * Returns true if there are 2 elements that are the same in an array
    * @param A The input array to search
    * @return Returns boolean for the first occurrence of a duplicate
    */
    function hasDuplicate(address[] memory A) internal pure returns(bool) {
        require(A.length > 0, "A is empty");

        for (uint256 i = 0; i < A.length - 1; i++) {
            address current = A[i];
            for (uint256 j = i + 1; j < A.length; j++) {
                if (current == A[j]) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * @param A The input array to search
     * @param a The address to remove     
     * @return Returns the array with the object removed.
     */
    function remove(address[] memory A, address a)
        internal
        pure
        returns (address[] memory)
    {
        (uint256 index, bool isIn) = indexOf(A, a);
        if (!isIn) {
            revert("Address not in array.");
        } else {
            (address[] memory _A,) = pop(A, index);
            return _A;
        }
    }

    /**
    * Removes specified index from array
    * @param A The input array to search
    * @param index The index to remove
    * @return Returns the new array and the removed entry
    */
    function pop(address[] memory A, uint256 index)
        internal
        pure
        returns (address[] memory, address)
    {
        uint256 length = A.length;
        require(index < A.length, "Index must be < A length");
        address[] memory newAddresses = new address[](length - 1);
        for (uint256 i = 0; i < index; i++) {
            newAddresses[i] = A[i];
        }
        for (uint256 j = index + 1; j < length; j++) {
            newAddresses[j - 1] = A[j];
        }
        return (newAddresses, A[index]);
    }
}
// Dependency file: @openzeppelin/contracts/access/Ownable.sol



// pragma solidity ^0.6.0;

// import "../GSN/Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/*
    Copyright 2020 Set Labs 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.6.10;
pragma experimental "ABIEncoderV2";

// import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";

// import { AddressArrayUtils } from "../lib/AddressArrayUtils.sol";
// import { IController } from "../interfaces/IController.sol";
// import { IOracle } from "../interfaces/IOracle.sol";
// import { IOracleAdapter } from "../interfaces/IOracleAdapter.sol";
// import { PreciseUnitMath } from "../lib/PreciseUnitMath.sol";


/**
 * @title PriceOracle
 * @author Set Protocol
 *
 * Contract that returns the price for any given asset pair. Price is retrieved either directly from an oracle,
 * calculated using common asset pairs, or uses external data to calculate price.
 * Note: Prices are returned in preciseUnits (i.e. 18 decimals of precision)
 */
contract PriceOracle is Ownable {
    using PreciseUnitMath for uint256;
    using AddressArrayUtils for address[];

    /* ============ Events ============ */

    event PairAdded(address indexed _assetOne, address indexed _assetTwo, address _oracle);
    event PairRemoved(address indexed _assetOne, address indexed _assetTwo, address _oracle);
    event PairEdited(address indexed _assetOne, address indexed _assetTwo, address _newOracle);
    event AdapterAdded(address _adapter);
    event AdapterRemoved(address _adapter);
    event MasterQuoteAssetEdited(address _newMasterQuote);

    /* ============ State Variables ============ */

    // Address of the Controller contract
    IController public controller;

    // Mapping between assetA/assetB and its associated Price Oracle
    // Asset 1 -> Asset 2 -> IOracle Interface
    mapping(address => mapping(address => IOracle)) public oracles;

    // Token address of the bridge asset that prices are derived from if the specified pair price is missing
    address public masterQuoteAsset;

    // List of IOracleAdapters used to return prices of third party protocols (e.g. Uniswap, Compound, Balancer)
    address[] public adapters;

    /* ============ Constructor ============ */

    /**
     * Set state variables and map asset pairs to their oracles
     *
     * @param _controller             Address of controller contract
     * @param _masterQuoteAsset       Address of asset that can be used to link unrelated asset pairs
     * @param _adapters               List of adapters used to price assets created by other protocols
     * @param _assetOnes              List of first asset in pair, index i maps to same index in assetTwos and oracles
     * @param _assetTwos              List of second asset in pair, index i maps to same index in assetOnes and oracles
     * @param _oracles                List of oracles, index i maps to same index in assetOnes and assetTwos
     */
    constructor(
        IController _controller,
        address _masterQuoteAsset,
        address[] memory _adapters,
        address[] memory _assetOnes,
        address[] memory _assetTwos,
        IOracle[] memory _oracles
    )
        public
    {
        controller = _controller;
        masterQuoteAsset = _masterQuoteAsset;
        adapters = _adapters;
        require(
            _assetOnes.length == _assetTwos.length && _assetTwos.length == _oracles.length,
            "Array lengths do not match."
        );

        for (uint256 i = 0; i < _assetOnes.length; i++) {
            oracles[_assetOnes[i]][_assetTwos[i]] = _oracles[i];
        }
    }

    /* ============ External Functions ============ */

    /**
     * SYSTEM-ONLY PRIVELEGE: Find price of passed asset pair, if possible. The steps it takes are:
     *  1) Check to see if a direct or inverse oracle of the pair exists,
     *  2) If not, use masterQuoteAsset to link pairs together (i.e. BTC/ETH and ETH/USDC
     *     could be used to calculate BTC/USDC).
     *  3) If not, check oracle adapters in case one or more of the assets needs external protocol data
     *     to price.
     *  4) If all steps fail, revert.
     *
     * @param _assetOne         Address of first asset in pair
     * @param _assetTwo         Address of second asset in pair
     * @return                  Price of asset pair to 18 decimals of precision
     */
    function getPrice(address _assetOne, address _assetTwo) external view returns (uint256) {
        require(
            controller.isSystemContract(msg.sender),
            "PriceOracle.getPrice: Caller must be system contract."
        );

        bool priceFound;
        uint256 price;

        (priceFound, price) = _getDirectOrInversePrice(_assetOne, _assetTwo);

        if (!priceFound) {
            (priceFound, price) = _getPriceFromMasterQuote(_assetOne, _assetTwo);
        }

        if (!priceFound) {
            (priceFound, price) = _getPriceFromAdapters(_assetOne, _assetTwo);
        }

        require(priceFound, "PriceOracle.getPrice: Price not found.");

        return price;
    }

    /**
     * GOVERNANCE FUNCTION: Add new asset pair oracle.
     *
     * @param _assetOne         Address of first asset in pair
     * @param _assetTwo         Address of second asset in pair
     * @param _oracle           Address of asset pair's oracle
     */
    function addPair(address _assetOne, address _assetTwo, IOracle _oracle) external onlyOwner {
        require(
            address(oracles[_assetOne][_assetTwo]) == address(0),
            "PriceOracle.addPair: Pair already exists."
        );
        oracles[_assetOne][_assetTwo] = _oracle;

        emit PairAdded(_assetOne, _assetTwo, address(_oracle));
    }

    /**
     * GOVERNANCE FUNCTION: Edit an existing asset pair's oracle.
     *
     * @param _assetOne         Address of first asset in pair
     * @param _assetTwo         Address of second asset in pair
     * @param _oracle           Address of asset pair's new oracle
     */
    function editPair(address _assetOne, address _assetTwo, IOracle _oracle) external onlyOwner {
        require(
            address(oracles[_assetOne][_assetTwo]) != address(0),
            "PriceOracle.editPair: Pair doesn't exist."
        );
        oracles[_assetOne][_assetTwo] = _oracle;

        emit PairEdited(_assetOne, _assetTwo, address(_oracle));
    }

    /**
     * GOVERNANCE FUNCTION: Remove asset pair's oracle.
     *
     * @param _assetOne         Address of first asset in pair
     * @param _assetTwo         Address of second asset in pair
     */
    function removePair(address _assetOne, address _assetTwo) external onlyOwner {
        require(
            address(oracles[_assetOne][_assetTwo]) != address(0),
            "PriceOracle.removePair: Pair doesn't exist."
        );
        IOracle oldOracle = oracles[_assetOne][_assetTwo];
        delete oracles[_assetOne][_assetTwo];

        emit PairRemoved(_assetOne, _assetTwo, address(oldOracle));
    }

    /**
     * GOVERNANCE FUNCTION: Add new oracle adapter.
     *
     * @param _adapter         Address of new adapter
     */
    function addAdapter(address _adapter) external onlyOwner {
        require(
            !adapters.contains(_adapter),
            "PriceOracle.addAdapter: Adapter already exists."
        );
        adapters.push(_adapter);

        emit AdapterAdded(_adapter);
    }

    /**
     * GOVERNANCE FUNCTION: Remove oracle adapter.
     *
     * @param _adapter         Address of adapter to remove
     */
    function removeAdapter(address _adapter) external onlyOwner {
        require(
            adapters.contains(_adapter),
            "PriceOracle.removeAdapter: Adapter does not exist."
        );
        adapters = adapters.remove(_adapter);

        emit AdapterRemoved(_adapter);
    }

    /**
     * GOVERNANCE FUNCTION: Change the master quote asset.
     *
     * @param _newMasterQuoteAsset         New address of master quote asset
     */
    function editMasterQuoteAsset(address _newMasterQuoteAsset) external onlyOwner {
        masterQuoteAsset = _newMasterQuoteAsset;

        emit MasterQuoteAssetEdited(_newMasterQuoteAsset);
    }

    /* ============ External View Functions ============ */

    /**
     * Returns an array of adapters
     */
    function getAdapters() external view returns (address[] memory) {
        return adapters;
    }

    /* ============ Internal Functions ============ */

    /**
     * Check if direct or inverse oracle exists. If so return that price along with boolean indicating
     * it exists. Otherwise return boolean indicating oracle doesn't exist.
     *
     * @param _assetOne         Address of first asset in pair
     * @param _assetTwo         Address of second asset in pair
     * @return bool             Boolean indicating if oracle exists
     * @return uint256          Price of asset pair to 18 decimal precision (if exists, otherwise 0)
     */
    function _getDirectOrInversePrice(
        address _assetOne,
        address _assetTwo
    )
        internal
        view
        returns (bool, uint256)
    {
        IOracle directOracle = oracles[_assetOne][_assetTwo];
        bool hasDirectOracle = address(directOracle) != address(0);

        // Check asset1 -> asset 2. If exists, then return value
        if (hasDirectOracle) {
            return (true, directOracle.read());
        }

        IOracle inverseOracle = oracles[_assetTwo][_assetOne];
        bool hasInverseOracle = address(inverseOracle) != address(0);

        // If not, check asset 2 -> asset 1. If exists, then return 1 / asset1 -> asset2
        if (hasInverseOracle) {
            return (true, _calculateInversePrice(inverseOracle));
        }

        return (false, 0);
    }

    /**
     * Try to calculate asset pair price by getting each asset in the pair's price relative to master
     * quote asset. Both prices must exist otherwise function returns false and no price.
     *
     * @param _assetOne         Address of first asset in pair
     * @param _assetTwo         Address of second asset in pair
     * @return bool             Boolean indicating if oracle exists
     * @return uint256          Price of asset pair to 18 decimal precision (if exists, otherwise 0)
     */
    function _getPriceFromMasterQuote(
        address _assetOne,
        address _assetTwo
    )
        internal
        view
        returns (bool, uint256)
    {
        (
            bool priceFoundOne,
            uint256 assetOnePrice
        ) = _getDirectOrInversePrice(_assetOne, masterQuoteAsset);

        (
            bool priceFoundTwo,
            uint256 assetTwoPrice
        ) = _getDirectOrInversePrice(_assetTwo, masterQuoteAsset);

        if (priceFoundOne && priceFoundTwo) {
            return (true, assetOnePrice.preciseDiv(assetTwoPrice));
        }

        return (false, 0);
    }

    /**
     * Scan adapters to see if one or more of the assets needs external protocol data to be priced. If
     * does not exist return false and no price.
     *
     * @param _assetOne         Address of first asset in pair
     * @param _assetTwo         Address of second asset in pair
     * @return bool             Boolean indicating if oracle exists
     * @return uint256          Price of asset pair to 18 decimal precision (if exists, otherwise 0)
     */
    function _getPriceFromAdapters(
        address _assetOne,
        address _assetTwo
    )
        internal
        view
        returns (bool, uint256)
    {
        for (uint256 i = 0; i < adapters.length; i++) {
            (
                bool priceFound,
                uint256 price
            ) = IOracleAdapter(adapters[i]).getPrice(_assetOne, _assetTwo);

            if (priceFound) {
                return (priceFound, price);
            }
        }

        return (false, 0);
    }

    /**
     * Calculate inverse price of passed oracle. The inverse price is 1 (or 1e18) / inverse price
     *
     * @param _inverseOracle        Address of oracle to invert
     * @return uint256              Inverted price of asset pair to 18 decimal precision
     */
    function _calculateInversePrice(IOracle _inverseOracle) internal view returns(uint256) {
        uint256 inverseValue = _inverseOracle.read();

        return PreciseUnitMath.preciseUnit().preciseDiv(inverseValue);
    }
}

Contract ABI

[{"inputs":[{"internalType":"contract IController","name":"_controller","type":"address"},{"internalType":"address","name":"_masterQuoteAsset","type":"address"},{"internalType":"address[]","name":"_adapters","type":"address[]"},{"internalType":"address[]","name":"_assetOnes","type":"address[]"},{"internalType":"address[]","name":"_assetTwos","type":"address[]"},{"internalType":"contract IOracle[]","name":"_oracles","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_adapter","type":"address"}],"name":"AdapterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_adapter","type":"address"}],"name":"AdapterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newMasterQuote","type":"address"}],"name":"MasterQuoteAssetEdited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_assetOne","type":"address"},{"indexed":true,"internalType":"address","name":"_assetTwo","type":"address"},{"indexed":false,"internalType":"address","name":"_oracle","type":"address"}],"name":"PairAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_assetOne","type":"address"},{"indexed":true,"internalType":"address","name":"_assetTwo","type":"address"},{"indexed":false,"internalType":"address","name":"_newOracle","type":"address"}],"name":"PairEdited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_assetOne","type":"address"},{"indexed":true,"internalType":"address","name":"_assetTwo","type":"address"},{"indexed":false,"internalType":"address","name":"_oracle","type":"address"}],"name":"PairRemoved","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adapters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adapter","type":"address"}],"name":"addAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_assetOne","type":"address"},{"internalType":"address","name":"_assetTwo","type":"address"},{"internalType":"contract IOracle","name":"_oracle","type":"address"}],"name":"addPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"contract IController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newMasterQuoteAsset","type":"address"}],"name":"editMasterQuoteAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_assetOne","type":"address"},{"internalType":"address","name":"_assetTwo","type":"address"},{"internalType":"contract IOracle","name":"_oracle","type":"address"}],"name":"editPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdapters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_assetOne","type":"address"},{"internalType":"address","name":"_assetTwo","type":"address"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterQuoteAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"oracles","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adapter","type":"address"}],"name":"removeAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_assetOne","type":"address"},{"internalType":"address","name":"_assetTwo","type":"address"}],"name":"removePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162001bca38038062001bca83398101604081905262000034916200036a565b6000620000496001600160e01b03620001d016565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b038089166001600160a01b03199283161790925560038054928816929091169190911790558351620000d8906004906020870190620001d5565b5081518351148015620000ec575080518251145b620001145760405162461bcd60e51b81526004016200010b9062000445565b60405180910390fd5b60005b8351811015620001c3578181815181106200012e57fe5b6020026020010151600260008684815181106200014757fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008584815181106200017e57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b0319169290911691909117905560010162000117565b50505050505050620004dc565b335b90565b8280548282559060005260206000209081019282156200022d579160200282015b828111156200022d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620001f6565b506200023b9291506200023f565b5090565b620001d291905b808211156200023b5780546001600160a01b031916815560010162000246565b80516200027381620004c3565b92915050565b600082601f8301126200028a578081fd5b8151620002a16200029b82620004a3565b6200047c565b818152915060208083019084810181840286018201871015620002c357600080fd5b60005b84811015620002ef578151620002dc81620004c3565b84529282019290820190600101620002c6565b505050505092915050565b600082601f8301126200030b578081fd5b81516200031c6200029b82620004a3565b8181529150602080830190848101818402860182018710156200033e57600080fd5b60005b84811015620002ef5781516200035781620004c3565b8452928201929082019060010162000341565b60008060008060008060c0878903121562000383578182fd5b6200038f888862000266565b9550620003a0886020890162000266565b60408801519095506001600160401b0380821115620003bd578384fd5b620003cb8a838b0162000279565b95506060890151915080821115620003e1578384fd5b620003ef8a838b0162000279565b9450608089015191508082111562000405578384fd5b620004138a838b0162000279565b935060a089015191508082111562000429578283fd5b506200043889828a01620002fa565b9150509295509295509295565b6020808252601b908201527f4172726179206c656e6774687320646f206e6f74206d617463682e0000000000604082015260600190565b6040518181016001600160401b03811182821017156200049b57600080fd5b604052919050565b60006001600160401b03821115620004b9578081fd5b5060209081020190565b6001600160a01b0381168114620004d957600080fd5b50565b6116de80620004ec6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806361d5b14411610097578063b82e16e311610066578063b82e16e3146101cf578063f1ec23cf146101e4578063f2fde38b146101f7578063f77c47911461020a576100f5565b806361d5b1441461018c578063715018a61461019f5780638da5cb5b146101a7578063ac41865a146101af576100f5565b806352a03c03116100d357806352a03c0314610140578063585cd34b146101535780635861b2271461016657806360d54d4114610179576100f5565b806304289853146100fa578063342833541461010f5780634ef501ac1461012d575b600080fd5b61010d6101083660046111b3565b610212565b005b61011761030d565b604051610124919061127e565b60405180910390f35b61011761013b36600461124e565b61031c565b61011761014e36600461117b565b610343565b61010d61016136600461115f565b610369565b61010d61017436600461117b565b6104e3565b61010d61018736600461115f565b6105ca565b61010d61019a36600461115f565b610702565b61010d610782565b610117610801565b6101c26101bd36600461117b565b610811565b6040516101249190611687565b6101d7610911565b60405161012491906112ac565b61010d6101f23660046111b3565b610973565b61010d61020536600461115f565b610a59565b610117610b0f565b61021a610b1e565b6000546001600160a01b039081169116146102505760405162461bcd60e51b8152600401610247906115be565b60405180910390fd5b6001600160a01b0383811660009081526002602090815260408083208685168452909152902054166102945760405162461bcd60e51b8152600401610247906115f3565b6001600160a01b03838116600081815260026020908152604080832087861680855292529182902080546001600160a01b03191694861694909417909355517f31639ce2bfc7c00ec8297cb6df66924b38918a7417c8e6b10eb7dc9f958389109061030090859061127e565b60405180910390a3505050565b6003546001600160a01b031681565b6004818154811061032957fe5b6000918252602090912001546001600160a01b0316905081565b60026020908152600092835260408084209091529082529020546001600160a01b031681565b610371610b1e565b6000546001600160a01b0390811691161461039e5760405162461bcd60e51b8152600401610247906115be565b61040b8160048054806020026020016040519081016040528092919081815260200182805480156103f857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116103da575b5050505050610b2290919063ffffffff16565b6104275760405162461bcd60e51b8152600401610247906113f8565b61049481600480548060200260200160405190810160405280929190818152602001828054801561048157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610463575b5050505050610b3890919063ffffffff16565b80516104a8916004916020909101906110d6565b507fdf980d21d8c7bb34800e668dbe003299093bac8e693614151d3c57f73f98a93d816040516104d8919061127e565b60405180910390a150565b6104eb610b1e565b6000546001600160a01b039081169116146105185760405162461bcd60e51b8152600401610247906115be565b6001600160a01b03828116600090815260026020908152604080832085851684529091529020541661055c5760405162461bcd60e51b81526004016102479061163c565b6001600160a01b03828116600081815260026020908152604080832086861680855292529182902080546001600160a01b031981169091559151919093169291907fd9001d4fd555e50f50619eeca8a260400b5e944989042d0652c5834aa2b968609061030090859061127e565b6105d2610b1e565b6000546001600160a01b039081169116146105ff5760405162461bcd60e51b8152600401610247906115be565b61066a8160048054806020026020016040519081016040528092919081815260200182805480156103f8576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103da575050505050610b2290919063ffffffff16565b156106875760405162461bcd60e51b8152600401610247906114d9565b600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0383161790556040517fcf9c2c7f9adbb156bd76affb04df84595f8f5e69cab2e61221b05b05a902fa26906104d890839061127e565b61070a610b1e565b6000546001600160a01b039081169116146107375760405162461bcd60e51b8152600401610247906115be565b600380546001600160a01b0319166001600160a01b0383161790556040517f748818fcd84486bc2804c035b8dec2300489b070a39a4a290d8311cd9791d867906104d890839061127e565b61078a610b1e565b6000546001600160a01b039081169116146107b75760405162461bcd60e51b8152600401610247906115be565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03165b90565b6001546040516313bc6d4b60e01b81526000916001600160a01b0316906313bc6d4b9061084290339060040161127e565b60206040518083038186803b15801561085a57600080fd5b505afa15801561086e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089291906111fd565b6108ae5760405162461bcd60e51b815260040161024790611528565b6000806108bb8585610b80565b9092509050816108d5576108cf8585610c8f565b90925090505b816108ea576108e48585610cf5565b90925090505b816109075760405162461bcd60e51b81526004016102479061144a565b9150505b92915050565b6060600480548060200260200160405190810160405280929190818152602001828054801561096957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161094b575b5050505050905090565b61097b610b1e565b6000546001600160a01b039081169116146109a85760405162461bcd60e51b8152600401610247906115be565b6001600160a01b038381166000908152600260209081526040808320868516845290915290205416156109ed5760405162461bcd60e51b815260040161024790611490565b6001600160a01b03838116600081815260026020908152604080832087861680855292529182902080546001600160a01b03191694861694909417909355517f7f46075c67ca5bbd3aaf82d8e324282141f27b7cba3376e5498a6b70c9931c2a9061030090859061127e565b610a61610b1e565b6000546001600160a01b03908116911614610a8e5760405162461bcd60e51b8152600401610247906115be565b6001600160a01b038116610ab45760405162461bcd60e51b8152600401610247906113b2565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b3390565b600080610b2f8484610dcb565b95945050505050565b6060600080610b478585610dcb565b9150915080610b685760405162461bcd60e51b81526004016102479061134c565b6060610b748684610e2e565b50935061090b92505050565b6001600160a01b038083166000908152600260209081526040808320858516845290915281205490918291168015801590610c33576001826001600160a01b03166357de26a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610bf057600080fd5b505afa158015610c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c289190611266565b935093505050610c88565b6001600160a01b0380861660009081526002602090815260408083208a85168452909152902054168015801590610c7c576001610c6f83610f5d565b9550955050505050610c88565b50600094508493505050505b9250929050565b600354600090819081908190610caf9087906001600160a01b0316610b80565b60035491935091506000908190610cd09088906001600160a01b0316610b80565b91509150838015610cde5750815b15610c7c576001610c6f848363ffffffff610ff216565b600080805b600454811015610dbe5760008060048381548110610d1457fe5b600091825260209091200154604051635620c32d60e11b81526001600160a01b039091169063ac41865a90610d4f908a908a90600401611292565b604080518083038186803b158015610d6657600080fd5b505afa158015610d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9e919061121d565b915091508115610db4579093509150610c889050565b5050600101610cfa565b5060009485945092505050565b81516000908190815b81811015610e1e57846001600160a01b0316868281518110610df257fe5b60200260200101516001600160a01b03161415610e1657925060019150610c889050565b600101610dd4565b5060001995600095509350505050565b8151606090600090808410610e555760405162461bcd60e51b81526004016102479061137b565b60606001820367ffffffffffffffff81118015610e7157600080fd5b50604051908082528060200260200182016040528015610e9b578160200160208202803683370190505b50905060005b85811015610ee957868181518110610eb557fe5b6020026020010151828281518110610ec957fe5b6001600160a01b0390921660209283029190910190910152600101610ea1565b50600185015b82811015610f3a57868181518110610f0357fe5b6020026020010151826001830381518110610f1a57fe5b6001600160a01b0390921660209283029190910190910152600101610eef565b5080868681518110610f4857fe5b60200260200101519350935050509250929050565b600080826001600160a01b03166357de26a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610f9957600080fd5b505afa158015610fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd19190611266565b9050610feb81610fdf61101c565b9063ffffffff610ff216565b9392505050565b6000610feb8261101085670de0b6b3a764000063ffffffff61102816565b9063ffffffff61106216565b670de0b6b3a764000090565b6000826110375750600061090b565b8282028284828161104457fe5b0414610feb5760405162461bcd60e51b81526004016102479061157d565b6000610feb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250600081836110c05760405162461bcd60e51b815260040161024791906112f9565b5060008385816110cc57fe5b0495945050505050565b82805482825590600052602060002090810192821561112b579160200282015b8281111561112b57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906110f6565b5061113792915061113b565b5090565b61080e91905b808211156111375780546001600160a01b0319168155600101611141565b600060208284031215611170578081fd5b8135610feb81611690565b6000806040838503121561118d578081fd5b823561119881611690565b915060208301356111a881611690565b809150509250929050565b6000806000606084860312156111c7578081fd5b83356111d281611690565b925060208401356111e281611690565b915060408401356111f281611690565b809150509250925092565b60006020828403121561120e578081fd5b81518015158114610feb578182fd5b6000806040838503121561122f578182fd5b8251801515811461123e578283fd5b6020939093015192949293505050565b60006020828403121561125f578081fd5b5035919050565b600060208284031215611277578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156112ed5783516001600160a01b0316835292840192918401916001016112c8565b50909695505050505050565b6000602080835283518082850152825b8181101561132557858101830151858201604001528201611309565b818111156113365783604083870101525b50601f01601f1916929092016040019392505050565b60208082526015908201527420b2323932b9b9903737ba1034b71030b93930bc9760591b604082015260600190565b60208082526018908201527f496e646578206d757374206265203c2041206c656e6774680000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526032908201527f50726963654f7261636c652e72656d6f7665416461707465723a20416461707460408201527132b9103237b2b9903737ba1032bc34b9ba1760711b606082015260800190565b60208082526026908201527f50726963654f7261636c652e67657450726963653a205072696365206e6f74206040820152653337bab7321760d11b606082015260800190565b60208082526029908201527f50726963654f7261636c652e616464506169723a205061697220616c726561646040820152683c9032bc34b9ba399760b91b606082015260800190565b6020808252602f908201527f50726963654f7261636c652e616464416461707465723a20416461707465722060408201526e30b63932b0b23c9032bc34b9ba399760891b606082015260800190565b60208082526035908201527f50726963654f7261636c652e67657450726963653a2043616c6c6572206d75736040820152743a1031329039bcb9ba32b69031b7b73a3930b1ba1760591b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f50726963654f7261636c652e65646974506169723a205061697220646f65736e60408201526813ba1032bc34b9ba1760b91b606082015260800190565b6020808252602b908201527f50726963654f7261636c652e72656d6f7665506169723a205061697220646f6560408201526a39b713ba1032bc34b9ba1760a91b606082015260800190565b90815260200190565b6001600160a01b03811681146116a557600080fd5b5056fea2646970667358221220812e976985b421b7d641d8b5b8b3cd0ec3757ae4eb3938e1974e79f94b51653c64736f6c634300060a00330000000000000000000000009048278ca7e874f9338e4898c436ab07aa45470100000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001c3d24cc87994e9f00960e9106a9e2ec7e89e38a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a000000000000000000000000d0a1e359811322d97991e03f863a0c30c2cf029c000000000000000000000000f091720dea579d7eec922d8b2a3a67ba522ccf6d000000000000000000000000595f8dab94b9c718cbf5c693cd539fd00b286d3d000000000000000000000000000000000000000000000000000000000000000400000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a00000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a00000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a00000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000007970ac597e74829dece89afcce608eb716cac8cc000000000000000000000000e2cfc870edfb863bef5057ed19cb8f904c84100c0000000000000000000000002890830e40cb2e1e82245b359491a8f8e7560a4b00000000000000000000000069bdb276a17dd90f9d3a545944ccb20e593ae8e3

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

0000000000000000000000009048278ca7e874f9338e4898c436ab07aa45470100000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000010000000000000000000000001c3d24cc87994e9f00960e9106a9e2ec7e89e38a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a000000000000000000000000d0a1e359811322d97991e03f863a0c30c2cf029c000000000000000000000000f091720dea579d7eec922d8b2a3a67ba522ccf6d000000000000000000000000595f8dab94b9c718cbf5c693cd539fd00b286d3d000000000000000000000000000000000000000000000000000000000000000400000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a00000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a00000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a00000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000007970ac597e74829dece89afcce608eb716cac8cc000000000000000000000000e2cfc870edfb863bef5057ed19cb8f904c84100c0000000000000000000000002890830e40cb2e1e82245b359491a8f8e7560a4b00000000000000000000000069bdb276a17dd90f9d3a545944ccb20e593ae8e3

-----Decoded View---------------
Arg [0] : _controller (address): 0x9048278ca7e874f9338e4898c436ab07aa454701
Arg [1] : _masterQuoteAsset (address): 0x15758350decea0e5a96cfe9024e3f352d039905a
Arg [2] : _adapters (address[]): 0x1c3d24cc87994e9f00960e9106a9e2ec7e89e38a
Arg [3] : _assetOnes (address[]): 0x15758350decea0e5a96cfe9024e3f352d039905a,0xd0a1e359811322d97991e03f863a0c30c2cf029c,0xf091720dea579d7eec922d8b2a3a67ba522ccf6d,0x595f8dab94b9c718cbf5c693cd539fd00b286d3d
Arg [4] : _assetTwos (address[]): 0x15758350decea0e5a96cfe9024e3f352d039905a,0x15758350decea0e5a96cfe9024e3f352d039905a,0x15758350decea0e5a96cfe9024e3f352d039905a,0x15758350decea0e5a96cfe9024e3f352d039905a
Arg [5] : _oracles (address[]): 0x7970ac597e74829dece89afcce608eb716cac8cc,0xe2cfc870edfb863bef5057ed19cb8f904c84100c,0x2890830e40cb2e1e82245b359491a8f8e7560a4b,0x69bdb276a17dd90f9d3a545944ccb20e593ae8e3

-----Encoded View---------------
23 Constructor Arguments found :
Arg [0] : 0000000000000000000000009048278ca7e874f9338e4898c436ab07aa454701
Arg [1] : 00000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 0000000000000000000000001c3d24cc87994e9f00960e9106a9e2ec7e89e38a
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 00000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a
Arg [10] : 000000000000000000000000d0a1e359811322d97991e03f863a0c30c2cf029c
Arg [11] : 000000000000000000000000f091720dea579d7eec922d8b2a3a67ba522ccf6d
Arg [12] : 000000000000000000000000595f8dab94b9c718cbf5c693cd539fd00b286d3d
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [14] : 00000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a
Arg [15] : 00000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a
Arg [16] : 00000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a
Arg [17] : 00000000000000000000000015758350decea0e5a96cfe9024e3f352d039905a
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [19] : 0000000000000000000000007970ac597e74829dece89afcce608eb716cac8cc
Arg [20] : 000000000000000000000000e2cfc870edfb863bef5057ed19cb8f904c84100c
Arg [21] : 0000000000000000000000002890830e40cb2e1e82245b359491a8f8e7560a4b
Arg [22] : 00000000000000000000000069bdb276a17dd90f9d3a545944ccb20e593ae8e3


Deployed ByteCode Sourcemap

26594:11701:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31739:372;;;;;;;;;:::i;:::-;;27635:31;;;:::i;:::-;;;;;;;;;;;;;;;;27789:25;;;;;;;;;:::i;27454:62::-;;;;;;;;;:::i;33314:295::-;;;;;;;;;:::i;32331:419::-;;;;;;;;;:::i;32892:275::-;;;;;;;;;:::i;33781:199::-;;;;;;;;;:::i;24614:148::-;;;:::i;23972:79::-;;;:::i;30062:726::-;;;;;;;;;:::i;:::-;;;;;;;;34106:98;;;:::i;:::-;;;;;;;;31071:370;;;;;;;;;:::i;24917:244::-;;;;;;;;;:::i;27298:29::-;;;:::i;31739:372::-;24194:12;:10;:12::i;:::-;24184:6;;-1:-1:-1;;;;;24184:6:0;;;:22;;;24176:67;;;;-1:-1:-1;;;24176:67:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31872:18:0;;::::1;31914:1;31872:18:::0;;;:7:::1;:18;::::0;;;;;;;:29;;::::1;::::0;;;;;;;;::::1;31842:143;;;;-1:-1:-1::0;;;31842:143:0::1;;;;;;;;;-1:-1:-1::0;;;;;31996:18:0;;::::1;;::::0;;;:7:::1;:18;::::0;;;;;;;:29;;::::1;::::0;;;;;;;;;:39;;-1:-1:-1;;;;;;31996:39:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;32053:50;::::1;::::0;::::1;::::0;31996:39;;32053:50:::1;;;;;;;;;;31739:372:::0;;;:::o;27635:31::-;;;-1:-1:-1;;;;;27635:31:0;;:::o;27789:25::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27789:25:0;;-1:-1:-1;27789:25:0;:::o;27454:62::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27454:62:0;;:::o;33314:295::-;24194:12;:10;:12::i;:::-;24184:6;;-1:-1:-1;;;;;24184:6:0;;;:22;;;24176:67;;;;-1:-1:-1;;;24176:67:0;;;;;;;;;33407:27:::1;33425:8;33407;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;33407:17:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;:27;;;;:::i;:::-;33385:127;;;;-1:-1:-1::0;;;33385:127:0::1;;;;;;;;;33534:25;33550:8;33534;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;33534:15:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;:25;;;;:::i;:::-;33523:36:::0;;::::1;::::0;:8:::1;::::0;:36:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;33577:24;33592:8;33577:24;;;;;;;;;;;;;;;33314:295:::0;:::o;32331:419::-;24194:12;:10;:12::i;:::-;24184:6;;-1:-1:-1;;;;;24184:6:0;;;:22;;;24176:67;;;;-1:-1:-1;;;24176:67:0;;;;;;;;;-1:-1:-1;;;;;32449:18:0;;::::1;32491:1;32449:18:::0;;;:7:::1;:18;::::0;;;;;;;:29;;::::1;::::0;;;;;;;;::::1;32419:145;;;;-1:-1:-1::0;;;32419:145:0::1;;;;;;;;;-1:-1:-1::0;;;;;32595:18:0;;::::1;32575:17;32595:18:::0;;;:7:::1;:18;::::0;;;;;;;:29;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;;32635:36:0;::::1;::::0;;;32689:53;;32595:29;;;::::1;::::0;;:18;32689:53:::1;::::0;::::1;::::0;32595:29;;32689:53:::1;;32892:275:::0;24194:12;:10;:12::i;:::-;24184:6;;-1:-1:-1;;;;;24184:6:0;;;:22;;;24176:67;;;;-1:-1:-1;;;24176:67:0;;;;;;;;;32983:27:::1;33001:8;32983;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;32983:17:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;:27;;;;:::i;:::-;32982:28;32960:125;;;;-1:-1:-1::0;;;32960:125:0::1;;;;;;;;;33096:8;:23:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;33096:23:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;33096:23:0::1;-1:-1:-1::0;;;;;33096:23:0;::::1;;::::0;;33137:22:::1;::::0;::::1;::::0;::::1;::::0;33096:23;;33137:22:::1;;33781:199:::0;24194:12;:10;:12::i;:::-;24184:6;;-1:-1:-1;;;;;24184:6:0;;;:22;;;24176:67;;;;-1:-1:-1;;;24176:67:0;;;;;;;;;33871:16:::1;:39:::0;;-1:-1:-1;;;;;;33871:39:0::1;-1:-1:-1::0;;;;;33871:39:0;::::1;;::::0;;33928:44:::1;::::0;::::1;::::0;::::1;::::0;33871:39;;33928:44:::1;;24614:148:::0;24194:12;:10;:12::i;:::-;24184:6;;-1:-1:-1;;;;;24184:6:0;;;:22;;;24176:67;;;;-1:-1:-1;;;24176:67:0;;;;;;;;;24721:1:::1;24705:6:::0;;24684:40:::1;::::0;-1:-1:-1;;;;;24705:6:0;;::::1;::::0;24684:40:::1;::::0;24721:1;;24684:40:::1;24752:1;24735:19:::0;;-1:-1:-1;;;;;;24735:19:0::1;::::0;;24614:148::o;23972:79::-;24010:7;24037:6;-1:-1:-1;;;;;24037:6:0;23972:79;;:::o;30062:726::-;30183:10;;:39;;-1:-1:-1;;;30183:39:0;;30141:7;;-1:-1:-1;;;;;30183:10:0;;:27;;:39;;30211:10;;30183:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30161:142;;;;-1:-1:-1;;;30161:142:0;;;;;;;;;30316:15;30342:13;30390:46;30415:9;30426;30390:24;:46::i;:::-;30368:68;;-1:-1:-1;30368:68:0;-1:-1:-1;30368:68:0;30449:112;;30503:46;30528:9;30539;30503:24;:46::i;:::-;30481:68;;-1:-1:-1;30481:68:0;-1:-1:-1;30449:112:0;30578:10;30573:109;;30627:43;30649:9;30660;30627:21;:43::i;:::-;30605:65;;-1:-1:-1;30605:65:0;-1:-1:-1;30573:109:0;30702:10;30694:61;;;;-1:-1:-1;;;30694:61:0;;;;;;;;;30775:5;-1:-1:-1;;30062:726:0;;;;;:::o;34106:98::-;34152:16;34188:8;34181:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34181:15:0;;;;;;;;;;;;;;;;;;;;;;;34106:98;:::o;31071:370::-;24194:12;:10;:12::i;:::-;24184:6;;-1:-1:-1;;;;;24184:6:0;;;:22;;;24176:67;;;;-1:-1:-1;;;24176:67:0;;;;;;;;;-1:-1:-1;;;;;31203:18:0;;::::1;31245:1;31203:18:::0;;;:7:::1;:18;::::0;;;;;;;:29;;::::1;::::0;;;;;;;;::::1;31195:52:::0;31173:143:::1;;;;-1:-1:-1::0;;;31173:143:0::1;;;;;;;;;-1:-1:-1::0;;;;;31327:18:0;;::::1;;::::0;;;:7:::1;:18;::::0;;;;;;;:29;;::::1;::::0;;;;;;;;;:39;;-1:-1:-1;;;;;;31327:39:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;31384:49;::::1;::::0;::::1;::::0;31327:39;;31384:49:::1;;24917:244:::0;24194:12;:10;:12::i;:::-;24184:6;;-1:-1:-1;;;;;24184:6:0;;;:22;;;24176:67;;;;-1:-1:-1;;;24176:67:0;;;;;;;;;-1:-1:-1;;;;;25006:22:0;::::1;24998:73;;;;-1:-1:-1::0;;;24998:73:0::1;;;;;;;;;25108:6;::::0;;25087:38:::1;::::0;-1:-1:-1;;;;;25087:38:0;;::::1;::::0;25108:6;::::1;::::0;25087:38:::1;::::0;::::1;25136:6;:17:::0;;-1:-1:-1;;;;;;25136:17:0::1;-1:-1:-1::0;;;;;25136:17:0;;;::::1;::::0;;;::::1;::::0;;24917:244::o;27298:29::-;;;-1:-1:-1;;;;;27298:29:0;;:::o;8839:106::-;8927:10;8839:106;:::o;20763:148::-;20835:4;20855:9;20868:13;20876:1;20879;20868:7;:13::i;:::-;20852:29;20763:148;-1:-1:-1;;;;;20763:148:0:o;21712:355::-;21809:16;21844:13;21859:9;21872:13;21880:1;21883;21872:7;:13::i;:::-;21843:42;;;;21901:4;21896:164;;21922:31;;-1:-1:-1;;;21922:31:0;;;;;;;;21896:164;21987:19;22011:13;22015:1;22018:5;22011:3;:13::i;:::-;-1:-1:-1;21986:38:0;-1:-1:-1;22039:9:0;;-1:-1:-1;;;22039:9:0;34777:837;-1:-1:-1;;;;;34978:18:0;;;34924:4;34978:18;;;:7;:18;;;;;;;;:29;;;;;;;;;;;34924:4;;;;34978:29;35041:35;;;;;35155:82;;35199:4;35205:12;-1:-1:-1;;;;;35205:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35191:34;;;;;;;;35155:82;-1:-1:-1;;;;;35273:18:0;;;35249:21;35273:18;;;:7;:18;;;;;;;;:29;;;;;;;;;;;;35337:36;;;;;35476:101;;35521:4;35527:37;35550:13;35527:22;:37::i;:::-;35513:52;;;;;;;;;;35476:101;-1:-1:-1;35597:5:0;;-1:-1:-1;35597:5:0;;-1:-1:-1;;;;34777:837:0;;;;;;:::o;36142:630::-;36439:16;;36289:4;;;;;;;;36403:53;;36428:9;;-1:-1:-1;;;;;36439:16:0;36403:24;:53::i;:::-;36588:16;;36320:136;;-1:-1:-1;36320:136:0;-1:-1:-1;36484:18:0;;;;36552:53;;36577:9;;-1:-1:-1;;;;;36588:16:0;36552:24;:53::i;:::-;36469:136;;;;36622:13;:30;;;;;36639:13;36622:30;36618:117;;;36677:4;36683:39;:13;36708;36683:39;:24;:39;:::i;37260:520::-;37404:4;;;37435:308;37459:8;:15;37455:19;;37435:308;;;37515:15;37549:13;37595:8;37604:1;37595:11;;;;;;;;;;;;;;;;;;37580:58;;-1:-1:-1;;;37580:58:0;;-1:-1:-1;;;;;37595:11:0;;;;37580:36;;:58;;37617:9;;37628;;37580:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37496:142;;;;37659:10;37655:77;;;37698:10;;-1:-1:-1;37710:5:0;-1:-1:-1;37690:26:0;;-1:-1:-1;37690:26:0;37655:77;-1:-1:-1;;37476:3:0;;37435:308;;;-1:-1:-1;37763:5:0;;;;-1:-1:-1;37260:520:0;-1:-1:-1;;;37260:520:0:o;20198:307::-;20312:8;;20269:7;;;;;20331:129;20355:6;20351:1;:10;20331:129;;;20395:1;-1:-1:-1;;;;;20387:9:0;:1;20389;20387:4;;;;;;;;;;;;;;-1:-1:-1;;;;;20387:9:0;;20383:66;;;20425:1;-1:-1:-1;20428:4:0;;-1:-1:-1;20417:16:0;;-1:-1:-1;20417:16:0;20383:66;20363:3;;20331:129;;;-1:-1:-1;;;20486:2:0;20491:5;;-1:-1:-1;20198:307:0;-1:-1:-1;;;;20198:307:0:o;22275:551::-;22433:8;;22373:16;;22391:7;;22460:16;;;22452:53;;;;-1:-1:-1;;;22452:53:0;;;;;;;;;22516:29;22571:1;22562:6;:10;22548:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22548:25:0;-1:-1:-1;22516:57:0;-1:-1:-1;22589:9:0;22584:85;22608:5;22604:1;:9;22584:85;;;22653:1;22655;22653:4;;;;;;;;;;;;;;22635:12;22648:1;22635:15;;;;;;;;-1:-1:-1;;;;;22635:22:0;;;:15;;;;;;;;;;;:22;22615:3;;22584:85;;;-1:-1:-1;22704:1:0;22696:9;;22679:98;22711:6;22707:1;:10;22679:98;;;22761:1;22763;22761:4;;;;;;;;;;;;;;22739:12;22756:1;22752;:5;22739:19;;;;;;;;-1:-1:-1;;;;;22739:26:0;;;:19;;;;;;;;;;;:26;22719:3;;22679:98;;;;22795:12;22809:1;22811:5;22809:8;;;;;;;;;;;;;;22787:31;;;;;;22275:551;;;;;:::o;38068:224::-;38146:7;38166:20;38189:14;-1:-1:-1;;;;;38189:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38166:44;;38230:54;38271:12;38230:29;:27;:29::i;:::-;:40;:54;:40;:54;:::i;:::-;38223:61;38068:224;-1:-1:-1;;;38068:224:0:o;13020:126::-;13085:7;13112:26;13136:1;13112:19;:1;10535:8;13112:19;:5;:19;:::i;:::-;:23;:26;:23;:26;:::i;10980:93::-;10535:8;10980:93;:::o;5093:471::-;5151:7;5396:6;5392:47;;-1:-1:-1;5426:1:0;5419:8;;5392:47;5463:5;;;5467:1;5463;:5;:1;5487:5;;;;;:10;5479:56;;;;-1:-1:-1;;;5479:56:0;;;;;;;;6040:132;6098:7;6125:39;6129:1;6132;6125:39;;;;;;;;;;;;;;;;;6754:7;6789:12;6782:5;6774:28;;;;-1:-1:-1;;;6774:28:0;;;;;;;;;;;6813:9;6829:1;6825;:5;;;;;;;6668:278;-1:-1:-1;;;;;6668:278:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;722:241;;826:2;814:9;805:7;801:23;797:32;794:2;;;-1:-1;;832:12;794:2;85:6;72:20;97:33;124:5;97:33;;970:366;;;1091:2;1079:9;1070:7;1066:23;1062:32;1059:2;;;-1:-1;;1097:12;1059:2;85:6;72:20;97:33;124:5;97:33;;;1149:63;-1:-1;1249:2;1288:22;;72:20;97:33;72:20;97:33;;;1257:63;;;;1053:283;;;;;;1343:521;;;;1496:2;1484:9;1475:7;1471:23;1467:32;1464:2;;;-1:-1;;1502:12;1464:2;85:6;72:20;97:33;124:5;97:33;;;1554:63;-1:-1;1654:2;1693:22;;72:20;97:33;72:20;97:33;;;1662:63;-1:-1;1762:2;1816:22;;359:20;384:48;359:20;384:48;;;1770:78;;;;1458:406;;;;;;1871:257;;1983:2;1971:9;1962:7;1958:23;1954:32;1951:2;;;-1:-1;;1989:12;1951:2;223:6;217:13;19961:5;18061:13;18054:21;19939:5;19936:32;19926:2;;-1:-1;;19972:12;2135:393;;;2264:2;2252:9;2243:7;2239:23;2235:32;2232:2;;;-1:-1;;2270:12;2232:2;223:6;217:13;19961:5;18061:13;18054:21;19939:5;19936:32;19926:2;;-1:-1;;19972:12;19926:2;2430;2480:22;;;;659:13;2322:71;;659:13;;-1:-1;;;2226:302;2535:241;;2639:2;2627:9;2618:7;2614:23;2610:32;2607:2;;;-1:-1;;2645:12;2607:2;-1:-1;511:20;;2601:175;-1:-1;2601:175;2783:263;;2898:2;2886:9;2877:7;2873:23;2869:32;2866:2;;;-1:-1;;2904:12;2866:2;-1:-1;659:13;;2860:186;-1:-1;2860:186;9653:222;-1:-1;;;;;18262:54;;;;3445:37;;9780:2;9765:18;;9751:124;10127:333;-1:-1;;;;;18262:54;;;3445:37;;18262:54;;10446:2;10431:18;;3445:37;10282:2;10267:18;;10253:207;10467:370;10644:2;10658:47;;;17253:12;;10629:18;;;17657:19;;;10467:370;;10644:2;17107:14;;;;17697;;;;10467:370;4053:260;4078:6;4075:1;4072:13;4053:260;;;4139:13;;-1:-1;;;;;18262:54;3445:37;;17512:14;;;;3207;;;;18273:42;4093:9;4053:260;;;-1:-1;10711:116;;10615:222;-1:-1;;;;;;10615:222;11370:310;;11517:2;;11538:17;11531:47;4822:5;17253:12;17669:6;11517:2;11506:9;11502:18;17657:19;-1:-1;19447:101;19461:6;19458:1;19455:13;19447:101;;;19528:11;;;;;19522:18;19509:11;;;17697:14;19509:11;19502:39;19476:10;;19447:101;;;19563:6;19560:1;19557:13;19554:2;;;-1:-1;17697:14;19619:6;11506:9;19610:16;;19603:27;19554:2;-1:-1;19735:7;19719:14;-1:-1;;19715:28;4980:39;;;;17697:14;4980:39;;11488:192;-1:-1;;;11488:192;11687:416;11887:2;11901:47;;;5256:2;11872:18;;;17657:19;-1:-1;;;17697:14;;;5272:44;5335:12;;;11858:245;12110:416;12310:2;12324:47;;;5586:2;12295:18;;;17657:19;5622:26;17697:14;;;5602:47;5668:12;;;12281:245;12533:416;12733:2;12747:47;;;5919:2;12718:18;;;17657:19;5955:34;17697:14;;;5935:55;-1:-1;;;6010:12;;;6003:30;6052:12;;;12704:245;12956:416;13156:2;13170:47;;;6303:2;13141:18;;;17657:19;6339:34;17697:14;;;6319:55;-1:-1;;;6394:12;;;6387:42;6448:12;;;13127:245;13379:416;13579:2;13593:47;;;6699:2;13564:18;;;17657:19;6735:34;17697:14;;;6715:55;-1:-1;;;6790:12;;;6783:30;6832:12;;;13550:245;13802:416;14002:2;14016:47;;;7083:2;13987:18;;;17657:19;7119:34;17697:14;;;7099:55;-1:-1;;;7174:12;;;7167:33;7219:12;;;13973:245;14225:416;14425:2;14439:47;;;7470:2;14410:18;;;17657:19;7506:34;17697:14;;;7486:55;-1:-1;;;7561:12;;;7554:39;7612:12;;;14396:245;14648:416;14848:2;14862:47;;;7863:2;14833:18;;;17657:19;7899:34;17697:14;;;7879:55;-1:-1;;;7954:12;;;7947:45;8011:12;;;14819:245;15071:416;15271:2;15285:47;;;8262:2;15256:18;;;17657:19;8298:34;17697:14;;;8278:55;-1:-1;;;8353:12;;;8346:25;8390:12;;;15242:245;15494:416;15694:2;15708:47;;;15679:18;;;17657:19;8677:34;17697:14;;;8657:55;8731:12;;;15665:245;15917:416;16117:2;16131:47;;;8982:2;16102:18;;;17657:19;9018:34;17697:14;;;8998:55;-1:-1;;;9073:12;;;9066:33;9118:12;;;16088:245;16340:416;16540:2;16554:47;;;9369:2;16525:18;;;17657:19;9405:34;17697:14;;;9385:55;-1:-1;;;9460:12;;;9453:35;9507:12;;;16511:245;16763:222;9604:37;;;16890:2;16875:18;;16861:124;19756:117;-1:-1;;;;;18262:54;;19815:35;;19805:2;;19864:1;;19854:12;19805:2;19799:74;

Swarm Source

ipfs://812e976985b421b7d641d8b5b8b3cd0ec3757ae4eb3938e1974e79f94b51653c
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading