ETH Price: $2,063.07 (+1.75%)

Contract

0xFF31e9ACBc9D42B4F964F54f9752D2F74E4aCF1C
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Pair152129682022-07-25 17:13:311325 days ago1658769211IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0037025275
Add Pair138188842021-12-16 22:33:121546 days ago1639693992IN
0xFF31e9AC...74E4aCF1C
0 ETH0.00513985104.11514761
Add Pair133303782021-10-01 1:04:161622 days ago1633050256IN
0xFF31e9AC...74E4aCF1C
0 ETH0.00647169131.09360717
Transfer Ownersh...131929992021-09-09 17:55:531644 days ago1631210153IN
0xFF31e9AC...74E4aCF1C
0 ETH0.002844999.01851663
Add Pair131500752021-09-03 2:34:361650 days ago1630636476IN
0xFF31e9AC...74E4aCF1C
0 ETH0.00574493116.37193765
Add Pair130825862021-08-23 16:18:331661 days ago1629735513IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0037006174.97955624
Transfer Ownersh...130825592021-08-23 16:14:161661 days ago1629735256IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0019926169.35403832
Add Pair130103552021-08-12 12:32:061672 days ago1628771526IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0022719346.02136687
Add Pair129531722021-08-03 15:46:191681 days ago1628005579IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0020734142.00000145
Add Pair129531482021-08-03 15:40:431681 days ago1628005243IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0020734142.00000145
Add Pair129094272021-07-27 17:30:041688 days ago1627407004IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0012835426
Add Pair126977022021-06-24 15:42:301721 days ago1624549350IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0010858122
Add Pair125679692021-06-04 12:30:111741 days ago1622809811IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0011354423
Add Pair125679662021-06-04 12:29:371741 days ago1622809777IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0011354423
Add Pair125137732021-05-27 2:43:151749 days ago1622083395IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0015303731
Add Pair125137202021-05-27 2:31:041749 days ago1622082664IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0015303731
Add Pair125136832021-05-27 2:22:071749 days ago1622082127IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0015303731
Add Pair125136732021-05-27 2:20:041749 days ago1622082004IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0015303731
Add Pair125133342021-05-27 1:04:331749 days ago1622077473IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0015303731
Add Pair123890682021-05-07 19:24:361769 days ago1620415476IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0024189849
Add Pair123890552021-05-07 19:21:581769 days ago1620415318IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0024189849
Add Pair123889852021-05-07 19:08:211769 days ago1620414501IN
0xFF31e9AC...74E4aCF1C
0 ETH0.0024189849
Add Pair122818222021-04-21 5:56:041785 days ago1618984564IN
0xFF31e9AC...74E4aCF1C
0 ETH0.00691138140
Add Pair122818212021-04-21 5:56:031785 days ago1618984563IN
0xFF31e9AC...74E4aCF1C
0 ETH0.00691138140
Add Pair122818192021-04-21 5:55:411785 days ago1618984541IN
0xFF31e9AC...74E4aCF1C
0 ETH0.00691138140
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
PriceOracle

Compiler Version
v0.6.10+commit.00c0fcaf

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license
/**
 *Submitted for verification at Etherscan.io on 2020-09-22
*/

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

// SPDX-License-Identifier: MIT

// 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 Security Audit

Contract ABI

API
[{"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"}]

60806040523480156200001157600080fd5b5060405162001bca38038062001bca83398101604081905262000034916200036a565b6000620000496001600160e01b03620001d016565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b038089166001600160a01b03199283161790925560038054928816929091169190911790558351620000d8906004906020870190620001d5565b5081518351148015620000ec575080518251145b620001145760405162461bcd60e51b81526004016200010b9062000445565b60405180910390fd5b60005b8351811015620001c3578181815181106200012e57fe5b6020026020010151600260008684815181106200014757fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008584815181106200017e57fe5b6020908102919091018101516001600160a01b0390811683529082019290925260400160002080546001600160a01b0319169290911691909117905560010162000117565b50505050505050620004dc565b335b90565b8280548282559060005260206000209081019282156200022d579160200282015b828111156200022d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620001f6565b506200023b9291506200023f565b5090565b620001d291905b808211156200023b5780546001600160a01b031916815560010162000246565b80516200027381620004c3565b92915050565b600082601f8301126200028a578081fd5b8151620002a16200029b82620004a3565b6200047c565b818152915060208083019084810181840286018201871015620002c357600080fd5b60005b84811015620002ef578151620002dc81620004c3565b84529282019290820190600101620002c6565b505050505092915050565b600082601f8301126200030b578081fd5b81516200031c6200029b82620004a3565b8181529150602080830190848101818402860182018710156200033e57600080fd5b60005b84811015620002ef5781516200035781620004c3565b8452928201929082019060010162000341565b60008060008060008060c0878903121562000383578182fd5b6200038f888862000266565b9550620003a0886020890162000266565b60408801519095506001600160401b0380821115620003bd578384fd5b620003cb8a838b0162000279565b95506060890151915080821115620003e1578384fd5b620003ef8a838b0162000279565b9450608089015191508082111562000405578384fd5b620004138a838b0162000279565b935060a089015191508082111562000429578283fd5b506200043889828a01620002fa565b9150509295509295509295565b6020808252601b908201527f4172726179206c656e6774687320646f206e6f74206d617463682e0000000000604082015260600190565b6040518181016001600160401b03811182821017156200049b57600080fd5b604052919050565b60006001600160401b03821115620004b9578081fd5b5060209081020190565b6001600160a01b0381168114620004d957600080fd5b50565b6116de80620004ec6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806361d5b14411610097578063b82e16e311610066578063b82e16e3146101cf578063f1ec23cf146101e4578063f2fde38b146101f7578063f77c47911461020a576100f5565b806361d5b1441461018c578063715018a61461019f5780638da5cb5b146101a7578063ac41865a146101af576100f5565b806352a03c03116100d357806352a03c0314610140578063585cd34b146101535780635861b2271461016657806360d54d4114610179576100f5565b806304289853146100fa578063342833541461010f5780634ef501ac1461012d575b600080fd5b61010d6101083660046111b3565b610212565b005b61011761030d565b604051610124919061127e565b60405180910390f35b61011761013b36600461124e565b61031c565b61011761014e36600461117b565b610343565b61010d61016136600461115f565b610369565b61010d61017436600461117b565b6104e3565b61010d61018736600461115f565b6105ca565b61010d61019a36600461115f565b610702565b61010d610782565b610117610801565b6101c26101bd36600461117b565b610811565b6040516101249190611687565b6101d7610911565b60405161012491906112ac565b61010d6101f23660046111b3565b610973565b61010d61020536600461115f565b610a59565b610117610b0f565b61021a610b1e565b6000546001600160a01b039081169116146102505760405162461bcd60e51b8152600401610247906115be565b60405180910390fd5b6001600160a01b0383811660009081526002602090815260408083208685168452909152902054166102945760405162461bcd60e51b8152600401610247906115f3565b6001600160a01b03838116600081815260026020908152604080832087861680855292529182902080546001600160a01b03191694861694909417909355517f31639ce2bfc7c00ec8297cb6df66924b38918a7417c8e6b10eb7dc9f958389109061030090859061127e565b60405180910390a3505050565b6003546001600160a01b031681565b6004818154811061032957fe5b6000918252602090912001546001600160a01b0316905081565b60026020908152600092835260408084209091529082529020546001600160a01b031681565b610371610b1e565b6000546001600160a01b0390811691161461039e5760405162461bcd60e51b8152600401610247906115be565b61040b8160048054806020026020016040519081016040528092919081815260200182805480156103f857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116103da575b5050505050610b2290919063ffffffff16565b6104275760405162461bcd60e51b8152600401610247906113f8565b61049481600480548060200260200160405190810160405280929190818152602001828054801561048157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610463575b5050505050610b3890919063ffffffff16565b80516104a8916004916020909101906110d6565b507fdf980d21d8c7bb34800e668dbe003299093bac8e693614151d3c57f73f98a93d816040516104d8919061127e565b60405180910390a150565b6104eb610b1e565b6000546001600160a01b039081169116146105185760405162461bcd60e51b8152600401610247906115be565b6001600160a01b03828116600090815260026020908152604080832085851684529091529020541661055c5760405162461bcd60e51b81526004016102479061163c565b6001600160a01b03828116600081815260026020908152604080832086861680855292529182902080546001600160a01b031981169091559151919093169291907fd9001d4fd555e50f50619eeca8a260400b5e944989042d0652c5834aa2b968609061030090859061127e565b6105d2610b1e565b6000546001600160a01b039081169116146105ff5760405162461bcd60e51b8152600401610247906115be565b61066a8160048054806020026020016040519081016040528092919081815260200182805480156103f8576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103da575050505050610b2290919063ffffffff16565b156106875760405162461bcd60e51b8152600401610247906114d9565b600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0383161790556040517fcf9c2c7f9adbb156bd76affb04df84595f8f5e69cab2e61221b05b05a902fa26906104d890839061127e565b61070a610b1e565b6000546001600160a01b039081169116146107375760405162461bcd60e51b8152600401610247906115be565b600380546001600160a01b0319166001600160a01b0383161790556040517f748818fcd84486bc2804c035b8dec2300489b070a39a4a290d8311cd9791d867906104d890839061127e565b61078a610b1e565b6000546001600160a01b039081169116146107b75760405162461bcd60e51b8152600401610247906115be565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03165b90565b6001546040516313bc6d4b60e01b81526000916001600160a01b0316906313bc6d4b9061084290339060040161127e565b60206040518083038186803b15801561085a57600080fd5b505afa15801561086e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089291906111fd565b6108ae5760405162461bcd60e51b815260040161024790611528565b6000806108bb8585610b80565b9092509050816108d5576108cf8585610c8f565b90925090505b816108ea576108e48585610cf5565b90925090505b816109075760405162461bcd60e51b81526004016102479061144a565b9150505b92915050565b6060600480548060200260200160405190810160405280929190818152602001828054801561096957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161094b575b5050505050905090565b61097b610b1e565b6000546001600160a01b039081169116146109a85760405162461bcd60e51b8152600401610247906115be565b6001600160a01b038381166000908152600260209081526040808320868516845290915290205416156109ed5760405162461bcd60e51b815260040161024790611490565b6001600160a01b03838116600081815260026020908152604080832087861680855292529182902080546001600160a01b03191694861694909417909355517f7f46075c67ca5bbd3aaf82d8e324282141f27b7cba3376e5498a6b70c9931c2a9061030090859061127e565b610a61610b1e565b6000546001600160a01b03908116911614610a8e5760405162461bcd60e51b8152600401610247906115be565b6001600160a01b038116610ab45760405162461bcd60e51b8152600401610247906113b2565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b3390565b600080610b2f8484610dcb565b95945050505050565b6060600080610b478585610dcb565b9150915080610b685760405162461bcd60e51b81526004016102479061134c565b6060610b748684610e2e565b50935061090b92505050565b6001600160a01b038083166000908152600260209081526040808320858516845290915281205490918291168015801590610c33576001826001600160a01b03166357de26a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610bf057600080fd5b505afa158015610c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c289190611266565b935093505050610c88565b6001600160a01b0380861660009081526002602090815260408083208a85168452909152902054168015801590610c7c576001610c6f83610f5d565b9550955050505050610c88565b50600094508493505050505b9250929050565b600354600090819081908190610caf9087906001600160a01b0316610b80565b60035491935091506000908190610cd09088906001600160a01b0316610b80565b91509150838015610cde5750815b15610c7c576001610c6f848363ffffffff610ff216565b600080805b600454811015610dbe5760008060048381548110610d1457fe5b600091825260209091200154604051635620c32d60e11b81526001600160a01b039091169063ac41865a90610d4f908a908a90600401611292565b604080518083038186803b158015610d6657600080fd5b505afa158015610d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9e919061121d565b915091508115610db4579093509150610c889050565b5050600101610cfa565b5060009485945092505050565b81516000908190815b81811015610e1e57846001600160a01b0316868281518110610df257fe5b60200260200101516001600160a01b03161415610e1657925060019150610c889050565b600101610dd4565b5060001995600095509350505050565b8151606090600090808410610e555760405162461bcd60e51b81526004016102479061137b565b60606001820367ffffffffffffffff81118015610e7157600080fd5b50604051908082528060200260200182016040528015610e9b578160200160208202803683370190505b50905060005b85811015610ee957868181518110610eb557fe5b6020026020010151828281518110610ec957fe5b6001600160a01b0390921660209283029190910190910152600101610ea1565b50600185015b82811015610f3a57868181518110610f0357fe5b6020026020010151826001830381518110610f1a57fe5b6001600160a01b0390921660209283029190910190910152600101610eef565b5080868681518110610f4857fe5b60200260200101519350935050509250929050565b600080826001600160a01b03166357de26a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610f9957600080fd5b505afa158015610fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd19190611266565b9050610feb81610fdf61101c565b9063ffffffff610ff216565b9392505050565b6000610feb8261101085670de0b6b3a764000063ffffffff61102816565b9063ffffffff61106216565b670de0b6b3a764000090565b6000826110375750600061090b565b8282028284828161104457fe5b0414610feb5760405162461bcd60e51b81526004016102479061157d565b6000610feb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250600081836110c05760405162461bcd60e51b815260040161024791906112f9565b5060008385816110cc57fe5b0495945050505050565b82805482825590600052602060002090810192821561112b579160200282015b8281111561112b57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906110f6565b5061113792915061113b565b5090565b61080e91905b808211156111375780546001600160a01b0319168155600101611141565b600060208284031215611170578081fd5b8135610feb81611690565b6000806040838503121561118d578081fd5b823561119881611690565b915060208301356111a881611690565b809150509250929050565b6000806000606084860312156111c7578081fd5b83356111d281611690565b925060208401356111e281611690565b915060408401356111f281611690565b809150509250925092565b60006020828403121561120e578081fd5b81518015158114610feb578182fd5b6000806040838503121561122f578182fd5b8251801515811461123e578283fd5b6020939093015192949293505050565b60006020828403121561125f578081fd5b5035919050565b600060208284031215611277578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156112ed5783516001600160a01b0316835292840192918401916001016112c8565b50909695505050505050565b6000602080835283518082850152825b8181101561132557858101830151858201604001528201611309565b818111156113365783604083870101525b50601f01601f1916929092016040019392505050565b60208082526015908201527420b2323932b9b9903737ba1034b71030b93930bc9760591b604082015260600190565b60208082526018908201527f496e646578206d757374206265203c2041206c656e6774680000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526032908201527f50726963654f7261636c652e72656d6f7665416461707465723a20416461707460408201527132b9103237b2b9903737ba1032bc34b9ba1760711b606082015260800190565b60208082526026908201527f50726963654f7261636c652e67657450726963653a205072696365206e6f74206040820152653337bab7321760d11b606082015260800190565b60208082526029908201527f50726963654f7261636c652e616464506169723a205061697220616c726561646040820152683c9032bc34b9ba399760b91b606082015260800190565b6020808252602f908201527f50726963654f7261636c652e616464416461707465723a20416461707465722060408201526e30b63932b0b23c9032bc34b9ba399760891b606082015260800190565b60208082526035908201527f50726963654f7261636c652e67657450726963653a2043616c6c6572206d75736040820152743a1031329039bcb9ba32b69031b7b73a3930b1ba1760591b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f50726963654f7261636c652e65646974506169723a205061697220646f65736e60408201526813ba1032bc34b9ba1760b91b606082015260800190565b6020808252602b908201527f50726963654f7261636c652e72656d6f7665506169723a205061697220646f6560408201526a39b713ba1032bc34b9ba1760a91b606082015260800190565b90815260200190565b6001600160a01b03811681146116a557600080fd5b5056fea2646970667358221220812e976985b421b7d641d8b5b8b3cd0ec3757ae4eb3938e1974e79f94b51653c64736f6c634300060a0033000000000000000000000000f1b12a7b1f0af744ed21eec7d3e891c48fd3c329000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c19a26a3d56d8f85324e45978f2f9e069642c1da0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5990000000000000000000000000000000000000000000000000000000000000004000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000040000000000000000000000007561e6d8301cdac56787e203b06e98427a36b1e000000000000000000000000097c3e595e8f80169266b5534e4d7a1bb58bb45ab000000000000000000000000a0485ebfe8854855c68b6fa058aee1b62a66ea9d000000000000000000000000bf63446ecf3341e04c6569b226a57860b188edbc

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100f55760003560e01c806361d5b14411610097578063b82e16e311610066578063b82e16e3146101cf578063f1ec23cf146101e4578063f2fde38b146101f7578063f77c47911461020a576100f5565b806361d5b1441461018c578063715018a61461019f5780638da5cb5b146101a7578063ac41865a146101af576100f5565b806352a03c03116100d357806352a03c0314610140578063585cd34b146101535780635861b2271461016657806360d54d4114610179576100f5565b806304289853146100fa578063342833541461010f5780634ef501ac1461012d575b600080fd5b61010d6101083660046111b3565b610212565b005b61011761030d565b604051610124919061127e565b60405180910390f35b61011761013b36600461124e565b61031c565b61011761014e36600461117b565b610343565b61010d61016136600461115f565b610369565b61010d61017436600461117b565b6104e3565b61010d61018736600461115f565b6105ca565b61010d61019a36600461115f565b610702565b61010d610782565b610117610801565b6101c26101bd36600461117b565b610811565b6040516101249190611687565b6101d7610911565b60405161012491906112ac565b61010d6101f23660046111b3565b610973565b61010d61020536600461115f565b610a59565b610117610b0f565b61021a610b1e565b6000546001600160a01b039081169116146102505760405162461bcd60e51b8152600401610247906115be565b60405180910390fd5b6001600160a01b0383811660009081526002602090815260408083208685168452909152902054166102945760405162461bcd60e51b8152600401610247906115f3565b6001600160a01b03838116600081815260026020908152604080832087861680855292529182902080546001600160a01b03191694861694909417909355517f31639ce2bfc7c00ec8297cb6df66924b38918a7417c8e6b10eb7dc9f958389109061030090859061127e565b60405180910390a3505050565b6003546001600160a01b031681565b6004818154811061032957fe5b6000918252602090912001546001600160a01b0316905081565b60026020908152600092835260408084209091529082529020546001600160a01b031681565b610371610b1e565b6000546001600160a01b0390811691161461039e5760405162461bcd60e51b8152600401610247906115be565b61040b8160048054806020026020016040519081016040528092919081815260200182805480156103f857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116103da575b5050505050610b2290919063ffffffff16565b6104275760405162461bcd60e51b8152600401610247906113f8565b61049481600480548060200260200160405190810160405280929190818152602001828054801561048157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610463575b5050505050610b3890919063ffffffff16565b80516104a8916004916020909101906110d6565b507fdf980d21d8c7bb34800e668dbe003299093bac8e693614151d3c57f73f98a93d816040516104d8919061127e565b60405180910390a150565b6104eb610b1e565b6000546001600160a01b039081169116146105185760405162461bcd60e51b8152600401610247906115be565b6001600160a01b03828116600090815260026020908152604080832085851684529091529020541661055c5760405162461bcd60e51b81526004016102479061163c565b6001600160a01b03828116600081815260026020908152604080832086861680855292529182902080546001600160a01b031981169091559151919093169291907fd9001d4fd555e50f50619eeca8a260400b5e944989042d0652c5834aa2b968609061030090859061127e565b6105d2610b1e565b6000546001600160a01b039081169116146105ff5760405162461bcd60e51b8152600401610247906115be565b61066a8160048054806020026020016040519081016040528092919081815260200182805480156103f8576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116103da575050505050610b2290919063ffffffff16565b156106875760405162461bcd60e51b8152600401610247906114d9565b600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b0383161790556040517fcf9c2c7f9adbb156bd76affb04df84595f8f5e69cab2e61221b05b05a902fa26906104d890839061127e565b61070a610b1e565b6000546001600160a01b039081169116146107375760405162461bcd60e51b8152600401610247906115be565b600380546001600160a01b0319166001600160a01b0383161790556040517f748818fcd84486bc2804c035b8dec2300489b070a39a4a290d8311cd9791d867906104d890839061127e565b61078a610b1e565b6000546001600160a01b039081169116146107b75760405162461bcd60e51b8152600401610247906115be565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03165b90565b6001546040516313bc6d4b60e01b81526000916001600160a01b0316906313bc6d4b9061084290339060040161127e565b60206040518083038186803b15801561085a57600080fd5b505afa15801561086e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089291906111fd565b6108ae5760405162461bcd60e51b815260040161024790611528565b6000806108bb8585610b80565b9092509050816108d5576108cf8585610c8f565b90925090505b816108ea576108e48585610cf5565b90925090505b816109075760405162461bcd60e51b81526004016102479061144a565b9150505b92915050565b6060600480548060200260200160405190810160405280929190818152602001828054801561096957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161094b575b5050505050905090565b61097b610b1e565b6000546001600160a01b039081169116146109a85760405162461bcd60e51b8152600401610247906115be565b6001600160a01b038381166000908152600260209081526040808320868516845290915290205416156109ed5760405162461bcd60e51b815260040161024790611490565b6001600160a01b03838116600081815260026020908152604080832087861680855292529182902080546001600160a01b03191694861694909417909355517f7f46075c67ca5bbd3aaf82d8e324282141f27b7cba3376e5498a6b70c9931c2a9061030090859061127e565b610a61610b1e565b6000546001600160a01b03908116911614610a8e5760405162461bcd60e51b8152600401610247906115be565b6001600160a01b038116610ab45760405162461bcd60e51b8152600401610247906113b2565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b3390565b600080610b2f8484610dcb565b95945050505050565b6060600080610b478585610dcb565b9150915080610b685760405162461bcd60e51b81526004016102479061134c565b6060610b748684610e2e565b50935061090b92505050565b6001600160a01b038083166000908152600260209081526040808320858516845290915281205490918291168015801590610c33576001826001600160a01b03166357de26a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610bf057600080fd5b505afa158015610c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c289190611266565b935093505050610c88565b6001600160a01b0380861660009081526002602090815260408083208a85168452909152902054168015801590610c7c576001610c6f83610f5d565b9550955050505050610c88565b50600094508493505050505b9250929050565b600354600090819081908190610caf9087906001600160a01b0316610b80565b60035491935091506000908190610cd09088906001600160a01b0316610b80565b91509150838015610cde5750815b15610c7c576001610c6f848363ffffffff610ff216565b600080805b600454811015610dbe5760008060048381548110610d1457fe5b600091825260209091200154604051635620c32d60e11b81526001600160a01b039091169063ac41865a90610d4f908a908a90600401611292565b604080518083038186803b158015610d6657600080fd5b505afa158015610d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9e919061121d565b915091508115610db4579093509150610c889050565b5050600101610cfa565b5060009485945092505050565b81516000908190815b81811015610e1e57846001600160a01b0316868281518110610df257fe5b60200260200101516001600160a01b03161415610e1657925060019150610c889050565b600101610dd4565b5060001995600095509350505050565b8151606090600090808410610e555760405162461bcd60e51b81526004016102479061137b565b60606001820367ffffffffffffffff81118015610e7157600080fd5b50604051908082528060200260200182016040528015610e9b578160200160208202803683370190505b50905060005b85811015610ee957868181518110610eb557fe5b6020026020010151828281518110610ec957fe5b6001600160a01b0390921660209283029190910190910152600101610ea1565b50600185015b82811015610f3a57868181518110610f0357fe5b6020026020010151826001830381518110610f1a57fe5b6001600160a01b0390921660209283029190910190910152600101610eef565b5080868681518110610f4857fe5b60200260200101519350935050509250929050565b600080826001600160a01b03166357de26a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610f9957600080fd5b505afa158015610fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd19190611266565b9050610feb81610fdf61101c565b9063ffffffff610ff216565b9392505050565b6000610feb8261101085670de0b6b3a764000063ffffffff61102816565b9063ffffffff61106216565b670de0b6b3a764000090565b6000826110375750600061090b565b8282028284828161104457fe5b0414610feb5760405162461bcd60e51b81526004016102479061157d565b6000610feb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250600081836110c05760405162461bcd60e51b815260040161024791906112f9565b5060008385816110cc57fe5b0495945050505050565b82805482825590600052602060002090810192821561112b579160200282015b8281111561112b57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906110f6565b5061113792915061113b565b5090565b61080e91905b808211156111375780546001600160a01b0319168155600101611141565b600060208284031215611170578081fd5b8135610feb81611690565b6000806040838503121561118d578081fd5b823561119881611690565b915060208301356111a881611690565b809150509250929050565b6000806000606084860312156111c7578081fd5b83356111d281611690565b925060208401356111e281611690565b915060408401356111f281611690565b809150509250925092565b60006020828403121561120e578081fd5b81518015158114610feb578182fd5b6000806040838503121561122f578182fd5b8251801515811461123e578283fd5b6020939093015192949293505050565b60006020828403121561125f578081fd5b5035919050565b600060208284031215611277578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156112ed5783516001600160a01b0316835292840192918401916001016112c8565b50909695505050505050565b6000602080835283518082850152825b8181101561132557858101830151858201604001528201611309565b818111156113365783604083870101525b50601f01601f1916929092016040019392505050565b60208082526015908201527420b2323932b9b9903737ba1034b71030b93930bc9760591b604082015260600190565b60208082526018908201527f496e646578206d757374206265203c2041206c656e6774680000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526032908201527f50726963654f7261636c652e72656d6f7665416461707465723a20416461707460408201527132b9103237b2b9903737ba1032bc34b9ba1760711b606082015260800190565b60208082526026908201527f50726963654f7261636c652e67657450726963653a205072696365206e6f74206040820152653337bab7321760d11b606082015260800190565b60208082526029908201527f50726963654f7261636c652e616464506169723a205061697220616c726561646040820152683c9032bc34b9ba399760b91b606082015260800190565b6020808252602f908201527f50726963654f7261636c652e616464416461707465723a20416461707465722060408201526e30b63932b0b23c9032bc34b9ba399760891b606082015260800190565b60208082526035908201527f50726963654f7261636c652e67657450726963653a2043616c6c6572206d75736040820152743a1031329039bcb9ba32b69031b7b73a3930b1ba1760591b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f50726963654f7261636c652e65646974506169723a205061697220646f65736e60408201526813ba1032bc34b9ba1760b91b606082015260800190565b6020808252602b908201527f50726963654f7261636c652e72656d6f7665506169723a205061697220646f6560408201526a39b713ba1032bc34b9ba1760a91b606082015260800190565b90815260200190565b6001600160a01b03811681146116a557600080fd5b5056fea2646970667358221220812e976985b421b7d641d8b5b8b3cd0ec3757ae4eb3938e1974e79f94b51653c64736f6c634300060a0033

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

000000000000000000000000f1b12a7b1f0af744ed21eec7d3e891c48fd3c329000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c19a26a3d56d8f85324e45978f2f9e069642c1da0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5990000000000000000000000000000000000000000000000000000000000000004000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000040000000000000000000000007561e6d8301cdac56787e203b06e98427a36b1e000000000000000000000000097c3e595e8f80169266b5534e4d7a1bb58bb45ab000000000000000000000000a0485ebfe8854855c68b6fa058aee1b62a66ea9d000000000000000000000000bf63446ecf3341e04c6569b226a57860b188edbc

-----Decoded View---------------
Arg [0] : _controller (address): 0xF1B12A7b1f0AF744ED21eEC7d3E891C48Fd3c329
Arg [1] : _masterQuoteAsset (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [2] : _adapters (address[]): 0xC19a26a3D56d8f85324E45978f2F9e069642c1dA
Arg [3] : _assetOnes (address[]): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,0x6B175474E89094C44Da98b954EedeAC495271d0F,0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
Arg [4] : _assetTwos (address[]): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [5] : _oracles (address[]): 0x7561E6D8301cDac56787E203b06E98427a36B1e0,0x97C3e595e8f80169266B5534e4d7A1bB58BB45ab,0xa0485EbFE8854855C68B6Fa058AEe1B62A66Ea9d,0xbf63446ecF3341e04c6569b226a57860B188edBc

-----Encoded View---------------
23 Constructor Arguments found :
Arg [0] : 000000000000000000000000f1b12a7b1f0af744ed21eec7d3e891c48fd3c329
Arg [1] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 000000000000000000000000c19a26a3d56d8f85324e45978f2f9e069642c1da
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [10] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [11] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [12] : 0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [14] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [15] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [16] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [17] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [19] : 0000000000000000000000007561e6d8301cdac56787e203b06e98427a36b1e0
Arg [20] : 00000000000000000000000097c3e595e8f80169266b5534e4d7a1bb58bb45ab
Arg [21] : 000000000000000000000000a0485ebfe8854855c68b6fa058aee1b62a66ea9d
Arg [22] : 000000000000000000000000bf63446ecf3341e04c6569b226a57860b188edbc


Deployed Bytecode Sourcemap

26589:11701:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31734:372;;;;;;;;;:::i;:::-;;27630:31;;;:::i;:::-;;;;;;;;;;;;;;;;27784:25;;;;;;;;;:::i;27449:62::-;;;;;;;;;:::i;33309:295::-;;;;;;;;;:::i;32326:419::-;;;;;;;;;:::i;32887:275::-;;;;;;;;;:::i;33776:199::-;;;;;;;;;:::i;24613:148::-;;;:::i;23971:79::-;;;:::i;30057:726::-;;;;;;;;;:::i;:::-;;;;;;;;34101:98;;;:::i;:::-;;;;;;;;31066:370;;;;;;;;;:::i;24916:244::-;;;;;;;;;:::i;27293:29::-;;;:::i;31734:372::-;24193:12;:10;:12::i;:::-;24183:6;;-1:-1:-1;;;;;24183:6:0;;;:22;;;24175:67;;;;-1:-1:-1;;;24175:67:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31867:18:0;;::::1;31909:1;31867:18:::0;;;:7:::1;:18;::::0;;;;;;;:29;;::::1;::::0;;;;;;;;::::1;31837:143;;;;-1:-1:-1::0;;;31837:143:0::1;;;;;;;;;-1:-1:-1::0;;;;;31991:18:0;;::::1;;::::0;;;:7:::1;:18;::::0;;;;;;;:29;;::::1;::::0;;;;;;;;;:39;;-1:-1:-1;;;;;;31991:39:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;32048:50;::::1;::::0;::::1;::::0;31991:39;;32048:50:::1;;;;;;;;;;31734:372:::0;;;:::o;27630:31::-;;;-1:-1:-1;;;;;27630:31:0;;:::o;27784:25::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27784:25:0;;-1:-1:-1;27784:25:0;:::o;27449:62::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27449:62:0;;:::o;33309:295::-;24193:12;:10;:12::i;:::-;24183:6;;-1:-1:-1;;;;;24183:6:0;;;:22;;;24175:67;;;;-1:-1:-1;;;24175:67:0;;;;;;;;;33402:27:::1;33420:8;33402;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;33402:17:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;:27;;;;:::i;:::-;33380:127;;;;-1:-1:-1::0;;;33380:127:0::1;;;;;;;;;33529:25;33545:8;33529;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;33529:15:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;:25;;;;:::i;:::-;33518:36:::0;;::::1;::::0;:8:::1;::::0;:36:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;33572:24;33587:8;33572:24;;;;;;;;;;;;;;;33309:295:::0;:::o;32326:419::-;24193:12;:10;:12::i;:::-;24183:6;;-1:-1:-1;;;;;24183:6:0;;;:22;;;24175:67;;;;-1:-1:-1;;;24175:67:0;;;;;;;;;-1:-1:-1;;;;;32444:18:0;;::::1;32486:1;32444:18:::0;;;:7:::1;:18;::::0;;;;;;;:29;;::::1;::::0;;;;;;;;::::1;32414:145;;;;-1:-1:-1::0;;;32414:145:0::1;;;;;;;;;-1:-1:-1::0;;;;;32590:18:0;;::::1;32570:17;32590:18:::0;;;:7:::1;:18;::::0;;;;;;;:29;;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;;32630:36:0;::::1;::::0;;;32684:53;;32590:29;;;::::1;::::0;;:18;32684:53:::1;::::0;::::1;::::0;32590:29;;32684:53:::1;;32887:275:::0;24193:12;:10;:12::i;:::-;24183:6;;-1:-1:-1;;;;;24183:6:0;;;:22;;;24175:67;;;;-1:-1:-1;;;24175:67:0;;;;;;;;;32978:27:::1;32996:8;32978;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;32978:17:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;:27;;;;:::i;:::-;32977:28;32955:125;;;;-1:-1:-1::0;;;32955:125:0::1;;;;;;;;;33091:8;:23:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;33091:23:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;33091:23:0::1;-1:-1:-1::0;;;;;33091:23:0;::::1;;::::0;;33132:22:::1;::::0;::::1;::::0;::::1;::::0;33091:23;;33132:22:::1;;33776:199:::0;24193:12;:10;:12::i;:::-;24183:6;;-1:-1:-1;;;;;24183:6:0;;;:22;;;24175:67;;;;-1:-1:-1;;;24175:67:0;;;;;;;;;33866:16:::1;:39:::0;;-1:-1:-1;;;;;;33866:39:0::1;-1:-1:-1::0;;;;;33866:39:0;::::1;;::::0;;33923:44:::1;::::0;::::1;::::0;::::1;::::0;33866:39;;33923:44:::1;;24613:148:::0;24193:12;:10;:12::i;:::-;24183:6;;-1:-1:-1;;;;;24183:6:0;;;:22;;;24175:67;;;;-1:-1:-1;;;24175:67:0;;;;;;;;;24720:1:::1;24704:6:::0;;24683:40:::1;::::0;-1:-1:-1;;;;;24704:6:0;;::::1;::::0;24683:40:::1;::::0;24720:1;;24683:40:::1;24751:1;24734:19:::0;;-1:-1:-1;;;;;;24734:19:0::1;::::0;;24613:148::o;23971:79::-;24009:7;24036:6;-1:-1:-1;;;;;24036:6:0;23971:79;;:::o;30057:726::-;30178:10;;:39;;-1:-1:-1;;;30178:39:0;;30136:7;;-1:-1:-1;;;;;30178:10:0;;:27;;:39;;30206:10;;30178:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30156:142;;;;-1:-1:-1;;;30156:142:0;;;;;;;;;30311:15;30337:13;30385:46;30410:9;30421;30385:24;:46::i;:::-;30363:68;;-1:-1:-1;30363:68:0;-1:-1:-1;30363:68:0;30444:112;;30498:46;30523:9;30534;30498:24;:46::i;:::-;30476:68;;-1:-1:-1;30476:68:0;-1:-1:-1;30444:112:0;30573:10;30568:109;;30622:43;30644:9;30655;30622:21;:43::i;:::-;30600:65;;-1:-1:-1;30600:65:0;-1:-1:-1;30568:109:0;30697:10;30689:61;;;;-1:-1:-1;;;30689:61:0;;;;;;;;;30770:5;-1:-1:-1;;30057:726:0;;;;;:::o;34101:98::-;34147:16;34183:8;34176:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34176:15:0;;;;;;;;;;;;;;;;;;;;;;;34101:98;:::o;31066:370::-;24193:12;:10;:12::i;:::-;24183:6;;-1:-1:-1;;;;;24183:6:0;;;:22;;;24175:67;;;;-1:-1:-1;;;24175:67:0;;;;;;;;;-1:-1:-1;;;;;31198:18:0;;::::1;31240:1;31198:18:::0;;;:7:::1;:18;::::0;;;;;;;:29;;::::1;::::0;;;;;;;;::::1;31190:52:::0;31168:143:::1;;;;-1:-1:-1::0;;;31168:143:0::1;;;;;;;;;-1:-1:-1::0;;;;;31322:18:0;;::::1;;::::0;;;:7:::1;:18;::::0;;;;;;;:29;;::::1;::::0;;;;;;;;;:39;;-1:-1:-1;;;;;;31322:39:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;31379:49;::::1;::::0;::::1;::::0;31322:39;;31379:49:::1;;24916:244:::0;24193:12;:10;:12::i;:::-;24183:6;;-1:-1:-1;;;;;24183:6:0;;;:22;;;24175:67;;;;-1:-1:-1;;;24175:67:0;;;;;;;;;-1:-1:-1;;;;;25005:22:0;::::1;24997:73;;;;-1:-1:-1::0;;;24997:73:0::1;;;;;;;;;25107:6;::::0;;25086:38:::1;::::0;-1:-1:-1;;;;;25086:38:0;;::::1;::::0;25107:6;::::1;::::0;25086:38:::1;::::0;::::1;25135:6;:17:::0;;-1:-1:-1;;;;;;25135:17:0::1;-1:-1:-1::0;;;;;25135:17:0;;;::::1;::::0;;;::::1;::::0;;24916:244::o;27293:29::-;;;-1:-1:-1;;;;;27293:29:0;;:::o;8862:106::-;8950:10;8862:106;:::o;20766:148::-;20838:4;20858:9;20871:13;20879:1;20882;20871:7;:13::i;:::-;20855:29;20766:148;-1:-1:-1;;;;;20766:148:0:o;21715:355::-;21812:16;21847:13;21862:9;21875:13;21883:1;21886;21875:7;:13::i;:::-;21846:42;;;;21904:4;21899:164;;21925:31;;-1:-1:-1;;;21925:31:0;;;;;;;;21899:164;21990:19;22014:13;22018:1;22021:5;22014:3;:13::i;:::-;-1:-1:-1;21989:38:0;-1:-1:-1;22042:9:0;;-1:-1:-1;;;22042:9:0;34772:837;-1:-1:-1;;;;;34973:18:0;;;34919:4;34973:18;;;:7;:18;;;;;;;;:29;;;;;;;;;;;34919:4;;;;34973:29;35036:35;;;;;35150:82;;35194:4;35200:12;-1:-1:-1;;;;;35200:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35186:34;;;;;;;;35150:82;-1:-1:-1;;;;;35268:18:0;;;35244:21;35268:18;;;:7;:18;;;;;;;;:29;;;;;;;;;;;;35332:36;;;;;35471:101;;35516:4;35522:37;35545:13;35522:22;:37::i;:::-;35508:52;;;;;;;;;;35471:101;-1:-1:-1;35592:5:0;;-1:-1:-1;35592:5:0;;-1:-1:-1;;;;34772:837:0;;;;;;:::o;36137:630::-;36434:16;;36284:4;;;;;;;;36398:53;;36423:9;;-1:-1:-1;;;;;36434:16:0;36398:24;:53::i;:::-;36583:16;;36315:136;;-1:-1:-1;36315:136:0;-1:-1:-1;36479:18:0;;;;36547:53;;36572:9;;-1:-1:-1;;;;;36583:16:0;36547:24;:53::i;:::-;36464:136;;;;36617:13;:30;;;;;36634:13;36617:30;36613:117;;;36672:4;36678:39;:13;36703;36678:39;:24;:39;:::i;37255:520::-;37399:4;;;37430:308;37454:8;:15;37450:19;;37430:308;;;37510:15;37544:13;37590:8;37599:1;37590:11;;;;;;;;;;;;;;;;;;37575:58;;-1:-1:-1;;;37575:58:0;;-1:-1:-1;;;;;37590:11:0;;;;37575:36;;:58;;37612:9;;37623;;37575:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37491:142;;;;37654:10;37650:77;;;37693:10;;-1:-1:-1;37705:5:0;-1:-1:-1;37685:26:0;;-1:-1:-1;37685:26:0;37650:77;-1:-1:-1;;37471:3:0;;37430:308;;;-1:-1:-1;37758:5:0;;;;-1:-1:-1;37255:520:0;-1:-1:-1;;;37255:520:0:o;20201:307::-;20315:8;;20272:7;;;;;20334:129;20358:6;20354:1;:10;20334:129;;;20398:1;-1:-1:-1;;;;;20390:9:0;:1;20392;20390:4;;;;;;;;;;;;;;-1:-1:-1;;;;;20390:9:0;;20386:66;;;20428:1;-1:-1:-1;20431:4:0;;-1:-1:-1;20420:16:0;;-1:-1:-1;20420:16:0;20386:66;20366:3;;20334:129;;;-1:-1:-1;;;20489:2:0;20494:5;;-1:-1:-1;20201:307:0;-1:-1:-1;;;;20201:307:0:o;22278:551::-;22436:8;;22376:16;;22394:7;;22463:16;;;22455:53;;;;-1:-1:-1;;;22455:53:0;;;;;;;;;22519:29;22574:1;22565:6;:10;22551:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22551:25:0;-1:-1:-1;22519:57:0;-1:-1:-1;22592:9:0;22587:85;22611:5;22607:1;:9;22587:85;;;22656:1;22658;22656:4;;;;;;;;;;;;;;22638:12;22651:1;22638:15;;;;;;;;-1:-1:-1;;;;;22638:22:0;;;:15;;;;;;;;;;;:22;22618:3;;22587:85;;;-1:-1:-1;22707:1:0;22699:9;;22682:98;22714:6;22710:1;:10;22682:98;;;22764:1;22766;22764:4;;;;;;;;;;;;;;22742:12;22759:1;22755;:5;22742:19;;;;;;;;-1:-1:-1;;;;;22742:26:0;;;:19;;;;;;;;;;;:26;22722:3;;22682:98;;;;22798:12;22812:1;22814:5;22812:8;;;;;;;;;;;;;;22790:31;;;;;;22278:551;;;;;:::o;38063:224::-;38141:7;38161:20;38184:14;-1:-1:-1;;;;;38184:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38161:44;;38225:54;38266:12;38225:29;:27;:29::i;:::-;:40;:54;:40;:54;:::i;:::-;38218:61;38063:224;-1:-1:-1;;;38063:224:0:o;13039:126::-;13104:7;13131:26;13155:1;13131:19;:1;10554:8;13131:19;:5;:19;:::i;:::-;:23;:26;:23;:26;:::i;10999:93::-;10554:8;10999:93;:::o;5120:471::-;5178:7;5423:6;5419:47;;-1:-1:-1;5453:1:0;5446:8;;5419:47;5490:5;;;5494:1;5490;:5;:1;5514:5;;;;;:10;5506:56;;;;-1:-1:-1;;;5506:56:0;;;;;;;;6067:132;6125:7;6152:39;6156:1;6159;6152:39;;;;;;;;;;;;;;;;;6781:7;6816:12;6809:5;6801:28;;;;-1:-1:-1;;;6801:28:0;;;;;;;;;;;6840:9;6856:1;6852;:5;;;;;;;6695:278;-1:-1:-1;;;;;6695: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 Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.