OP Sepolia Testnet

Contract

0x00D79DBB8e9fC344C015ADD2D4135E5181b61e66

Overview

ETH Balance

0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Remove Markets B...170781142024-09-10 8:59:28161 days ago1725958768IN
0x00D79DBB...181b61e66
0 ETH0.0000404290270.09700001
Remove Markets B...147665072024-07-18 20:45:54214 days ago1721335554IN
0x00D79DBB...181b61e66
0 ETH0.0003895595290.10670026
Remove Markets119785282024-05-15 7:53:16279 days ago1715759596IN
0x00D79DBB...181b61e66
0 ETH0.0003354889121.50000026
Add Proxied Mark...84664472024-02-24 0:43:54360 days ago1708735434IN
0x00D79DBB...181b61e66
0 ETH0.0000026801360.00010025
Add Proxied Mark...84660192024-02-24 0:29:38360 days ago1708734578IN
0x00D79DBB...181b61e66
0 ETH0.000003125490.00010025
Add Proxied Mark...84655512024-02-24 0:14:02360 days ago1708733642IN
0x00D79DBB...181b61e66
0 ETH0.000003508050.00010025
Add Proxied Mark...84651032024-02-23 23:59:06360 days ago1708732746IN
0x00D79DBB...181b61e66
0 ETH0.0000042360520.00010025
Add Proxied Mark...73198672024-01-28 11:44:34387 days ago1706442274IN
0x00D79DBB...181b61e66
0 ETH0.0000049305320.00010025
Add Proxied Mark...73193532024-01-28 11:27:26387 days ago1706441246IN
0x00D79DBB...181b61e66
0 ETH0.0000049894590.00010025
Add Proxied Mark...73188032024-01-28 11:09:06387 days ago1706440146IN
0x00D79DBB...181b61e66
0 ETH0.0000045563620.00010025
Add Proxied Mark...73182892024-01-28 10:51:58387 days ago1706439118IN
0x00D79DBB...181b61e66
0 ETH0.0000045129250.00010025
Add Proxied Mark...73177642024-01-28 10:34:28387 days ago1706438068IN
0x00D79DBB...181b61e66
0 ETH0.0000054527640.00010025
Add Proxied Mark...73172482024-01-28 10:17:16387 days ago1706437036IN
0x00D79DBB...181b61e66
0 ETH0.0000056764140.00010025
Add Proxied Mark...73167192024-01-28 9:59:38387 days ago1706435978IN
0x00D79DBB...181b61e66
0 ETH0.0000047282620.00010025
Add Proxied Mark...73161952024-01-28 9:42:10387 days ago1706434930IN
0x00D79DBB...181b61e66
0 ETH0.0000049545520.00010025
Add Proxied Mark...73156782024-01-28 9:24:56387 days ago1706433896IN
0x00D79DBB...181b61e66
0 ETH0.0000049606350.00010025
Add Proxied Mark...73151692024-01-28 9:07:58387 days ago1706432878IN
0x00D79DBB...181b61e66
0 ETH0.0000049466690.00010025
Add Proxied Mark...73146562024-01-28 8:50:52387 days ago1706431852IN
0x00D79DBB...181b61e66
0 ETH0.000005011130.00010025
Add Proxied Mark...73141692024-01-28 8:34:38387 days ago1706430878IN
0x00D79DBB...181b61e66
0 ETH0.0000047790250.00010025
Add Proxied Mark...73136332024-01-28 8:16:46387 days ago1706429806IN
0x00D79DBB...181b61e66
0 ETH0.0000049123730.00010025
Add Proxied Mark...73131192024-01-28 7:59:38387 days ago1706428778IN
0x00D79DBB...181b61e66
0 ETH0.0000045547690.00010025
Add Proxied Mark...73126232024-01-28 7:43:06387 days ago1706427786IN
0x00D79DBB...181b61e66
0 ETH0.0000048483470.00010025
Add Proxied Mark...73121272024-01-28 7:26:34387 days ago1706426794IN
0x00D79DBB...181b61e66
0 ETH0.0000046707970.00010025
Add Proxied Mark...73116422024-01-28 7:10:24387 days ago1706425824IN
0x00D79DBB...181b61e66
0 ETH0.0000050197050.00010025
Add Proxied Mark...73111502024-01-28 6:54:00387 days ago1706424840IN
0x00D79DBB...181b61e66
0 ETH0.0000047523710.00010025
View all transactions

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FuturesMarketManager

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at sepolia-optimism.etherscan.io on 2023-12-11
*/

/*
   ____            __   __        __   _
  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __
 _\ \ / // // _ \/ __// _ \/ -_)/ __// / \ \ /
/___/ \_, //_//_/\__//_//_/\__/ \__//_/ /_\_\
     /___/

* Synthetix: FuturesMarketManager.sol
*
* Latest source (may be newer): https://github.com/Synthetixio/synthetix/blob/master/contracts/FuturesMarketManager.sol
* Docs: https://docs.synthetix.io/contracts/FuturesMarketManager
*
* Contract Dependencies: 
*	- IAddressResolver
*	- IFuturesMarketManager
*	- MixinResolver
*	- Owned
* Libraries: 
*	- AddressSetLib
*	- SafeMath
*
* MIT License
* ===========
*
* Copyright (c) 2023 Synthetix
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
*/



pragma solidity ^0.5.16;

// https://docs.synthetix.io/contracts/source/contracts/owned
contract Owned {
    address public owner;
    address public nominatedOwner;

    constructor(address _owner) public {
        require(_owner != address(0), "Owner address cannot be 0");
        owner = _owner;
        emit OwnerChanged(address(0), _owner);
    }

    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    function acceptOwnership() external {
        require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
        emit OwnerChanged(owner, nominatedOwner);
        owner = nominatedOwner;
        nominatedOwner = address(0);
    }

    modifier onlyOwner {
        _onlyOwner();
        _;
    }

    function _onlyOwner() private view {
        require(msg.sender == owner, "Only the contract owner may perform this action");
    }

    event OwnerNominated(address newOwner);
    event OwnerChanged(address oldOwner, address newOwner);
}


// https://docs.synthetix.io/contracts/source/interfaces/iaddressresolver
interface IAddressResolver {
    function getAddress(bytes32 name) external view returns (address);

    function getSynth(bytes32 key) external view returns (address);

    function requireAndGetAddress(bytes32 name, string calldata reason) external view returns (address);
}


// https://docs.synthetix.io/contracts/source/interfaces/isynth
interface ISynth {
    // Views
    function currencyKey() external view returns (bytes32);

    function transferableSynths(address account) external view returns (uint);

    // Mutative functions
    function transferAndSettle(address to, uint value) external returns (bool);

    function transferFromAndSettle(
        address from,
        address to,
        uint value
    ) external returns (bool);

    // Restricted: used internally to Synthetix
    function burn(address account, uint amount) external;

    function issue(address account, uint amount) external;
}


// https://docs.synthetix.io/contracts/source/interfaces/iissuer
interface IIssuer {
    // Views

    function allNetworksDebtInfo()
        external
        view
        returns (
            uint256 debt,
            uint256 sharesSupply,
            bool isStale
        );

    function anySynthOrSNXRateIsInvalid() external view returns (bool anyRateInvalid);

    function availableCurrencyKeys() external view returns (bytes32[] memory);

    function availableSynthCount() external view returns (uint);

    function availableSynths(uint index) external view returns (ISynth);

    function canBurnSynths(address account) external view returns (bool);

    function collateral(address account) external view returns (uint);

    function collateralisationRatio(address issuer) external view returns (uint);

    function collateralisationRatioAndAnyRatesInvalid(address _issuer)
        external
        view
        returns (uint cratio, bool anyRateIsInvalid);

    function debtBalanceOf(address issuer, bytes32 currencyKey) external view returns (uint debtBalance);

    function issuanceRatio() external view returns (uint);

    function lastIssueEvent(address account) external view returns (uint);

    function maxIssuableSynths(address issuer) external view returns (uint maxIssuable);

    function minimumStakeTime() external view returns (uint);

    function remainingIssuableSynths(address issuer)
        external
        view
        returns (
            uint maxIssuable,
            uint alreadyIssued,
            uint totalSystemDebt
        );

    function synths(bytes32 currencyKey) external view returns (ISynth);

    function getSynths(bytes32[] calldata currencyKeys) external view returns (ISynth[] memory);

    function synthsByAddress(address synthAddress) external view returns (bytes32);

    function totalIssuedSynths(bytes32 currencyKey, bool excludeOtherCollateral) external view returns (uint);

    function transferableSynthetixAndAnyRateIsInvalid(address account, uint balance)
        external
        view
        returns (uint transferable, bool anyRateIsInvalid);

    function liquidationAmounts(address account, bool isSelfLiquidation)
        external
        view
        returns (
            uint totalRedeemed,
            uint debtToRemove,
            uint escrowToLiquidate,
            uint initialDebtBalance
        );

    // Restricted: used internally to Synthetix
    function addSynths(ISynth[] calldata synthsToAdd) external;

    function issueSynths(address from, uint amount) external;

    function issueSynthsOnBehalf(
        address issueFor,
        address from,
        uint amount
    ) external;

    function issueMaxSynths(address from) external;

    function issueMaxSynthsOnBehalf(address issueFor, address from) external;

    function burnSynths(address from, uint amount) external;

    function burnSynthsOnBehalf(
        address burnForAddress,
        address from,
        uint amount
    ) external;

    function burnSynthsToTarget(address from) external;

    function burnSynthsToTargetOnBehalf(address burnForAddress, address from) external;

    function burnForRedemption(
        address deprecatedSynthProxy,
        address account,
        uint balance
    ) external;

    function setCurrentPeriodId(uint128 periodId) external;

    function liquidateAccount(address account, bool isSelfLiquidation)
        external
        returns (
            uint totalRedeemed,
            uint debtRemoved,
            uint escrowToLiquidate
        );

    function issueSynthsWithoutDebt(
        bytes32 currencyKey,
        address to,
        uint amount
    ) external returns (bool rateInvalid);

    function burnSynthsWithoutDebt(
        bytes32 currencyKey,
        address to,
        uint amount
    ) external returns (bool rateInvalid);

    function modifyDebtSharesForMigration(address account, uint amount) external;
}


// Inheritance


// Internal references


// https://docs.synthetix.io/contracts/source/contracts/addressresolver
contract AddressResolver is Owned, IAddressResolver {
    mapping(bytes32 => address) public repository;

    constructor(address _owner) public Owned(_owner) {}

    /* ========== RESTRICTED FUNCTIONS ========== */

    function importAddresses(bytes32[] calldata names, address[] calldata destinations) external onlyOwner {
        require(names.length == destinations.length, "Input lengths must match");

        for (uint i = 0; i < names.length; i++) {
            bytes32 name = names[i];
            address destination = destinations[i];
            repository[name] = destination;
            emit AddressImported(name, destination);
        }
    }

    /* ========= PUBLIC FUNCTIONS ========== */

    function rebuildCaches(MixinResolver[] calldata destinations) external {
        for (uint i = 0; i < destinations.length; i++) {
            destinations[i].rebuildCache();
        }
    }

    /* ========== VIEWS ========== */

    function areAddressesImported(bytes32[] calldata names, address[] calldata destinations) external view returns (bool) {
        for (uint i = 0; i < names.length; i++) {
            if (repository[names[i]] != destinations[i]) {
                return false;
            }
        }
        return true;
    }

    function getAddress(bytes32 name) external view returns (address) {
        return repository[name];
    }

    function requireAndGetAddress(bytes32 name, string calldata reason) external view returns (address) {
        address _foundAddress = repository[name];
        require(_foundAddress != address(0), reason);
        return _foundAddress;
    }

    function getSynth(bytes32 key) external view returns (address) {
        IIssuer issuer = IIssuer(repository["Issuer"]);
        require(address(issuer) != address(0), "Cannot find Issuer address");
        return address(issuer.synths(key));
    }

    /* ========== EVENTS ========== */

    event AddressImported(bytes32 name, address destination);
}


// Internal references


// https://docs.synthetix.io/contracts/source/contracts/mixinresolver
contract MixinResolver {
    AddressResolver public resolver;

    mapping(bytes32 => address) private addressCache;

    constructor(address _resolver) internal {
        resolver = AddressResolver(_resolver);
    }

    /* ========== INTERNAL FUNCTIONS ========== */

    function combineArrays(bytes32[] memory first, bytes32[] memory second)
        internal
        pure
        returns (bytes32[] memory combination)
    {
        combination = new bytes32[](first.length + second.length);

        for (uint i = 0; i < first.length; i++) {
            combination[i] = first[i];
        }

        for (uint j = 0; j < second.length; j++) {
            combination[first.length + j] = second[j];
        }
    }

    /* ========== PUBLIC FUNCTIONS ========== */

    // Note: this function is public not external in order for it to be overridden and invoked via super in subclasses
    function resolverAddressesRequired() public view returns (bytes32[] memory addresses) {}

    function rebuildCache() public {
        bytes32[] memory requiredAddresses = resolverAddressesRequired();
        // The resolver must call this function whenver it updates its state
        for (uint i = 0; i < requiredAddresses.length; i++) {
            bytes32 name = requiredAddresses[i];
            // Note: can only be invoked once the resolver has all the targets needed added
            address destination =
                resolver.requireAndGetAddress(name, string(abi.encodePacked("Resolver missing target: ", name)));
            addressCache[name] = destination;
            emit CacheUpdated(name, destination);
        }
    }

    /* ========== VIEWS ========== */

    function isResolverCached() external view returns (bool) {
        bytes32[] memory requiredAddresses = resolverAddressesRequired();
        for (uint i = 0; i < requiredAddresses.length; i++) {
            bytes32 name = requiredAddresses[i];
            // false if our cache is invalid or if the resolver doesn't have the required address
            if (resolver.getAddress(name) != addressCache[name] || addressCache[name] == address(0)) {
                return false;
            }
        }

        return true;
    }

    /* ========== INTERNAL FUNCTIONS ========== */

    function requireAndGetAddress(bytes32 name) internal view returns (address) {
        address _foundAddress = addressCache[name];
        require(_foundAddress != address(0), string(abi.encodePacked("Missing address: ", name)));
        return _foundAddress;
    }

    /* ========== EVENTS ========== */

    event CacheUpdated(bytes32 name, address destination);
}


interface IFuturesMarketManager {
    function markets(uint index, uint pageSize) external view returns (address[] memory);

    function markets(
        uint index,
        uint pageSize,
        bool proxiedMarkets
    ) external view returns (address[] memory);

    function numMarkets() external view returns (uint);

    function numMarkets(bool proxiedMarkets) external view returns (uint);

    function allMarkets() external view returns (address[] memory);

    function allMarkets(bool proxiedMarkets) external view returns (address[] memory);

    function marketForKey(bytes32 marketKey) external view returns (address);

    function marketsForKeys(bytes32[] calldata marketKeys) external view returns (address[] memory);

    function totalDebt() external view returns (uint debt, bool isInvalid);

    function isEndorsed(address account) external view returns (bool);

    function allEndorsedAddresses() external view returns (address[] memory);

    function addEndorsedAddresses(address[] calldata addresses) external;

    function removeEndorsedAddresses(address[] calldata addresses) external;
}


/**
 * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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-solidity/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) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}


// https://docs.synthetix.io/contracts/source/libraries/addresssetlib/
library AddressSetLib {
    struct AddressSet {
        address[] elements;
        mapping(address => uint) indices;
    }

    function contains(AddressSet storage set, address candidate) internal view returns (bool) {
        if (set.elements.length == 0) {
            return false;
        }
        uint index = set.indices[candidate];
        return index != 0 || set.elements[0] == candidate;
    }

    function getPage(
        AddressSet storage set,
        uint index,
        uint pageSize
    ) internal view returns (address[] memory) {
        // NOTE: This implementation should be converted to slice operators if the compiler is updated to v0.6.0+
        uint endIndex = index + pageSize; // The check below that endIndex <= index handles overflow.

        // If the page extends past the end of the list, truncate it.
        if (endIndex > set.elements.length) {
            endIndex = set.elements.length;
        }
        if (endIndex <= index) {
            return new address[](0);
        }

        uint n = endIndex - index; // We already checked for negative overflow.
        address[] memory page = new address[](n);
        for (uint i; i < n; i++) {
            page[i] = set.elements[i + index];
        }
        return page;
    }

    function add(AddressSet storage set, address element) internal {
        // Adding to a set is an idempotent operation.
        if (!contains(set, element)) {
            set.indices[element] = set.elements.length;
            set.elements.push(element);
        }
    }

    function remove(AddressSet storage set, address element) internal {
        require(contains(set, element), "Element not in set.");
        // Replace the removed element with the last element of the list.
        uint index = set.indices[element];
        uint lastIndex = set.elements.length - 1; // We required that element is in the list, so it is not empty.
        if (index != lastIndex) {
            // No need to shift the last element if it is the one we want to delete.
            address shiftedElement = set.elements[lastIndex];
            set.elements[index] = shiftedElement;
            set.indices[shiftedElement] = index;
        }
        set.elements.pop();
        delete set.indices[element];
    }
}


// https://docs.synthetix.io/contracts/source/interfaces/ifeepool
interface IFeePool {
    // Views

    // solhint-disable-next-line func-name-mixedcase
    function FEE_ADDRESS() external view returns (address);

    function feesAvailable(address account) external view returns (uint, uint);

    function feesBurned(address account) external view returns (uint);

    function feesToBurn(address account) external view returns (uint);

    function feePeriodDuration() external view returns (uint);

    function isFeesClaimable(address account) external view returns (bool);

    function targetThreshold() external view returns (uint);

    function totalFeesAvailable() external view returns (uint);

    function totalFeesBurned() external view returns (uint);

    function totalRewardsAvailable() external view returns (uint);

    // Mutative Functions
    function claimFees() external returns (bool);

    function claimOnBehalf(address claimingForAddress) external returns (bool);

    function closeCurrentFeePeriod() external;

    function closeSecondary(uint snxBackedDebt, uint debtShareSupply) external;

    function recordFeePaid(uint sUSDAmount) external;

    function setRewardsToDistribute(uint amount) external;
}


interface IVirtualSynth {
    // Views
    function balanceOfUnderlying(address account) external view returns (uint);

    function rate() external view returns (uint);

    function readyToSettle() external view returns (bool);

    function secsLeftInWaitingPeriod() external view returns (uint);

    function settled() external view returns (bool);

    function synth() external view returns (ISynth);

    // Mutative functions
    function settle(address account) external;
}


pragma experimental ABIEncoderV2;


// https://docs.synthetix.io/contracts/source/interfaces/iexchanger
interface IExchanger {
    struct ExchangeEntrySettlement {
        bytes32 src;
        uint amount;
        bytes32 dest;
        uint reclaim;
        uint rebate;
        uint srcRoundIdAtPeriodEnd;
        uint destRoundIdAtPeriodEnd;
        uint timestamp;
    }

    struct ExchangeEntry {
        uint sourceRate;
        uint destinationRate;
        uint destinationAmount;
        uint exchangeFeeRate;
        uint exchangeDynamicFeeRate;
        uint roundIdForSrc;
        uint roundIdForDest;
        uint sourceAmountAfterSettlement;
    }

    // Views
    function calculateAmountAfterSettlement(
        address from,
        bytes32 currencyKey,
        uint amount,
        uint refunded
    ) external view returns (uint amountAfterSettlement);

    function isSynthRateInvalid(bytes32 currencyKey) external view returns (bool);

    function maxSecsLeftInWaitingPeriod(address account, bytes32 currencyKey) external view returns (uint);

    function settlementOwing(address account, bytes32 currencyKey)
        external
        view
        returns (
            uint reclaimAmount,
            uint rebateAmount,
            uint numEntries
        );

    function hasWaitingPeriodOrSettlementOwing(address account, bytes32 currencyKey) external view returns (bool);

    function feeRateForExchange(bytes32 sourceCurrencyKey, bytes32 destinationCurrencyKey) external view returns (uint);

    function dynamicFeeRateForExchange(bytes32 sourceCurrencyKey, bytes32 destinationCurrencyKey)
        external
        view
        returns (uint feeRate, bool tooVolatile);

    function getAmountsForExchange(
        uint sourceAmount,
        bytes32 sourceCurrencyKey,
        bytes32 destinationCurrencyKey
    )
        external
        view
        returns (
            uint amountReceived,
            uint fee,
            uint exchangeFeeRate
        );

    function priceDeviationThresholdFactor() external view returns (uint);

    function waitingPeriodSecs() external view returns (uint);

    function lastExchangeRate(bytes32 currencyKey) external view returns (uint);

    // Mutative functions
    function exchange(
        address exchangeForAddress,
        address from,
        bytes32 sourceCurrencyKey,
        uint sourceAmount,
        bytes32 destinationCurrencyKey,
        address destinationAddress,
        bool virtualSynth,
        address rewardAddress,
        bytes32 trackingCode
    ) external returns (uint amountReceived, IVirtualSynth vSynth);

    function exchangeAtomically(
        address from,
        bytes32 sourceCurrencyKey,
        uint sourceAmount,
        bytes32 destinationCurrencyKey,
        address destinationAddress,
        bytes32 trackingCode,
        uint minAmount
    ) external returns (uint amountReceived);

    function settle(address from, bytes32 currencyKey)
        external
        returns (
            uint reclaimed,
            uint refunded,
            uint numEntries
        );
}

// Used to have strongly-typed access to internal mutative functions in Synthetix
interface ISynthetixInternal {
    function emitExchangeTracking(
        bytes32 trackingCode,
        bytes32 toCurrencyKey,
        uint256 toAmount,
        uint256 fee
    ) external;

    function emitSynthExchange(
        address account,
        bytes32 fromCurrencyKey,
        uint fromAmount,
        bytes32 toCurrencyKey,
        uint toAmount,
        address toAddress
    ) external;

    function emitAtomicSynthExchange(
        address account,
        bytes32 fromCurrencyKey,
        uint fromAmount,
        bytes32 toCurrencyKey,
        uint toAmount,
        address toAddress
    ) external;

    function emitExchangeReclaim(
        address account,
        bytes32 currencyKey,
        uint amount
    ) external;

    function emitExchangeRebate(
        address account,
        bytes32 currencyKey,
        uint amount
    ) external;
}

interface IExchangerInternalDebtCache {
    function updateCachedSynthDebtsWithRates(bytes32[] calldata currencyKeys, uint[] calldata currencyRates) external;

    function updateCachedSynthDebts(bytes32[] calldata currencyKeys) external;
}


// https://docs.synthetix.io/contracts/source/interfaces/ierc20
interface IERC20 {
    // ERC20 Optional Views
    function name() external view returns (string memory);

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

    function decimals() external view returns (uint8);

    // Views
    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

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

    // Mutative functions
    function transfer(address to, uint value) external returns (bool);

    function approve(address spender, uint value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint value
    ) external returns (bool);

    // Events
    event Transfer(address indexed from, address indexed to, uint value);

    event Approval(address indexed owner, address indexed spender, uint value);
}


// Inheritance


// Libraries


// Internal references


// basic views that are expected to be supported by v1 (IFuturesMarket) and v2 (via ProxyPerpsV2)
interface IMarketViews {
    function marketKey() external view returns (bytes32);

    function baseAsset() external view returns (bytes32);

    function marketSize() external view returns (uint128);

    function marketSkew() external view returns (int128);

    function assetPrice() external view returns (uint price, bool invalid);

    function marketDebt() external view returns (uint debt, bool isInvalid);

    function currentFundingRate() external view returns (int fundingRate);

    // v1 does not have a this so we never call it but this is here for v2.
    function currentFundingVelocity() external view returns (int fundingVelocity);

    // only supported by PerpsV2 Markets (and implemented in ProxyPerpsV2)
    function getAllTargets() external view returns (address[] memory);
}

// https://docs.synthetix.io/contracts/source/contracts/FuturesMarketManager
contract FuturesMarketManager is Owned, MixinResolver, IFuturesMarketManager {
    using SafeMath for uint;
    using AddressSetLib for AddressSetLib.AddressSet;

    /* ========== STATE VARIABLES ========== */

    AddressSetLib.AddressSet internal _allMarkets;
    AddressSetLib.AddressSet internal _legacyMarkets;
    AddressSetLib.AddressSet internal _proxiedMarkets;
    mapping(bytes32 => address) public marketForKey;

    // PerpsV2 implementations
    AddressSetLib.AddressSet internal _implementations;
    mapping(address => address[]) internal _marketImplementation;

    // PerpsV2 endorsed addresses
    AddressSetLib.AddressSet internal _endorsedAddresses;

    /* ========== ADDRESS RESOLVER CONFIGURATION ========== */

    bytes32 public constant CONTRACT_NAME = "FuturesMarketManager";

    bytes32 internal constant SUSD = "sUSD";
    bytes32 internal constant CONTRACT_SYNTHSUSD = "SynthsUSD";
    bytes32 internal constant CONTRACT_FEEPOOL = "FeePool";
    bytes32 internal constant CONTRACT_EXCHANGER = "Exchanger";

    /* ========== CONSTRUCTOR ========== */

    constructor(address _owner, address _resolver) public Owned(_owner) MixinResolver(_resolver) {}

    /* ========== VIEWS ========== */

    function resolverAddressesRequired() public view returns (bytes32[] memory addresses) {
        addresses = new bytes32[](3);
        addresses[0] = CONTRACT_SYNTHSUSD;
        addresses[1] = CONTRACT_FEEPOOL;
        addresses[2] = CONTRACT_EXCHANGER;
    }

    function _sUSD() internal view returns (ISynth) {
        return ISynth(requireAndGetAddress(CONTRACT_SYNTHSUSD));
    }

    function _feePool() internal view returns (IFeePool) {
        return IFeePool(requireAndGetAddress(CONTRACT_FEEPOOL));
    }

    function _exchanger() internal view returns (IExchanger) {
        return IExchanger(requireAndGetAddress(CONTRACT_EXCHANGER));
    }

    /*
     * Returns slices of the list of all markets.
     */
    function markets(uint index, uint pageSize) external view returns (address[] memory) {
        return _allMarkets.getPage(index, pageSize);
    }

    /*
     * Returns slices of the list of all v1 or v2 (proxied) markets.
     */
    function markets(
        uint index,
        uint pageSize,
        bool proxiedMarkets
    ) external view returns (address[] memory) {
        if (proxiedMarkets) {
            return _proxiedMarkets.getPage(index, pageSize);
        } else {
            return _legacyMarkets.getPage(index, pageSize);
        }
    }

    /*
     * The number of proxied + legacy markets known to the manager.
     */
    function numMarkets() external view returns (uint) {
        return _allMarkets.elements.length;
    }

    /*
     * The number of proxied or legacy markets known to the manager.
     */
    function numMarkets(bool proxiedMarkets) external view returns (uint) {
        if (proxiedMarkets) {
            return _proxiedMarkets.elements.length;
        } else {
            return _legacyMarkets.elements.length;
        }
    }

    /*
     * The list of all proxied AND legacy markets.
     */
    function allMarkets() public view returns (address[] memory) {
        return _allMarkets.getPage(0, _allMarkets.elements.length);
    }

    /*
     * The list of all proxied OR legacy markets.
     */
    function allMarkets(bool proxiedMarkets) public view returns (address[] memory) {
        if (proxiedMarkets) {
            return _proxiedMarkets.getPage(0, _proxiedMarkets.elements.length);
        } else {
            return _legacyMarkets.getPage(0, _legacyMarkets.elements.length);
        }
    }

    function _marketsForKeys(bytes32[] memory marketKeys) internal view returns (address[] memory) {
        uint mMarkets = marketKeys.length;
        address[] memory results = new address[](mMarkets);
        for (uint i; i < mMarkets; i++) {
            results[i] = marketForKey[marketKeys[i]];
        }
        return results;
    }

    /*
     * The market addresses for a given set of market key strings.
     */
    function marketsForKeys(bytes32[] calldata marketKeys) external view returns (address[] memory) {
        return _marketsForKeys(marketKeys);
    }

    /*
     * The accumulated debt contribution of all futures markets.
     */
    function totalDebt() external view returns (uint debt, bool isInvalid) {
        uint total;
        bool anyIsInvalid;
        uint numOfMarkets = _allMarkets.elements.length;
        for (uint i = 0; i < numOfMarkets; i++) {
            (uint marketDebt, bool invalid) = IMarketViews(_allMarkets.elements[i]).marketDebt();
            total = total.add(marketDebt);
            anyIsInvalid = anyIsInvalid || invalid;
        }
        return (total, anyIsInvalid);
    }

    struct MarketSummary {
        address market;
        bytes32 asset;
        bytes32 marketKey;
        uint price;
        uint marketSize;
        int marketSkew;
        uint marketDebt;
        int currentFundingRate;
        int currentFundingVelocity;
        bool priceInvalid;
        bool proxied;
    }

    function _marketSummaries(address[] memory addresses) internal view returns (MarketSummary[] memory) {
        uint nMarkets = addresses.length;
        MarketSummary[] memory summaries = new MarketSummary[](nMarkets);
        for (uint i; i < nMarkets; i++) {
            IMarketViews market = IMarketViews(addresses[i]);
            bytes32 marketKey = market.marketKey();
            bytes32 baseAsset = market.baseAsset();

            (uint price, bool invalid) = market.assetPrice();
            (uint debt, ) = market.marketDebt();

            bool proxied = _proxiedMarkets.contains(addresses[i]);
            summaries[i] = MarketSummary({
                market: address(market),
                asset: baseAsset,
                marketKey: marketKey,
                price: price,
                marketSize: market.marketSize(),
                marketSkew: market.marketSkew(),
                marketDebt: debt,
                currentFundingRate: market.currentFundingRate(),
                currentFundingVelocity: proxied ? market.currentFundingVelocity() : 0, // v1 does not have velocity.
                priceInvalid: invalid,
                proxied: proxied
            });
        }

        return summaries;
    }

    function marketSummaries(address[] calldata addresses) external view returns (MarketSummary[] memory) {
        return _marketSummaries(addresses);
    }

    function marketSummariesForKeys(bytes32[] calldata marketKeys) external view returns (MarketSummary[] memory) {
        return _marketSummaries(_marketsForKeys(marketKeys));
    }

    function allMarketSummaries() external view returns (MarketSummary[] memory) {
        return _marketSummaries(allMarkets());
    }

    function allEndorsedAddresses() external view returns (address[] memory) {
        return _endorsedAddresses.getPage(0, _endorsedAddresses.elements.length);
    }

    function isEndorsed(address account) external view returns (bool) {
        return _endorsedAddresses.contains(account);
    }

    /* ========== MUTATIVE FUNCTIONS ========== */

    function _addImplementations(address market) internal {
        address[] memory implementations = IMarketViews(market).getAllTargets();
        for (uint i = 0; i < implementations.length; i++) {
            _implementations.add(implementations[i]);
        }
        _marketImplementation[market] = implementations;
    }

    function _removeImplementations(address market) internal {
        address[] memory implementations = _marketImplementation[market];
        for (uint i = 0; i < implementations.length; i++) {
            if (_implementations.contains(implementations[i])) {
                _implementations.remove(implementations[i]);
            }
        }
        delete _marketImplementation[market];
    }

    /*
     * Add a set of new markets. Reverts if some market key already has a market.
     */
    function addMarkets(address[] calldata marketsToAdd) external onlyOwner {
        uint numOfMarkets = marketsToAdd.length;
        for (uint i; i < numOfMarkets; i++) {
            _addMarket(marketsToAdd[i], false);
        }
    }

    /*
     * Add a set of new markets. Reverts if some market key already has a market.
     */
    function addProxiedMarkets(address[] calldata marketsToAdd) external onlyOwner {
        uint numOfMarkets = marketsToAdd.length;
        for (uint i; i < numOfMarkets; i++) {
            _addMarket(marketsToAdd[i], true);
        }
    }

    /*
     * Add a set of new markets. Reverts if some market key already has a market.
     */
    function _addMarket(address market, bool isProxied) internal onlyOwner {
        require(!_allMarkets.contains(market), "Market already exists");

        bytes32 key = IMarketViews(market).marketKey();
        bytes32 baseAsset = IMarketViews(market).baseAsset();

        require(marketForKey[key] == address(0), "Market already exists for key");
        marketForKey[key] = market;
        _allMarkets.add(market);

        if (isProxied) {
            _proxiedMarkets.add(market);
            // if PerpsV2 market => add implementations
            _addImplementations(market);
        } else {
            _legacyMarkets.add(market);
        }

        // Emit the event
        emit MarketAdded(market, baseAsset, key);
    }

    function _removeMarkets(address[] memory marketsToRemove) internal {
        uint numOfMarkets = marketsToRemove.length;
        for (uint i; i < numOfMarkets; i++) {
            address market = marketsToRemove[i];
            require(market != address(0), "Unknown market");

            bytes32 key = IMarketViews(market).marketKey();
            bytes32 baseAsset = IMarketViews(market).baseAsset();

            require(marketForKey[key] != address(0), "Unknown market");

            // if PerpsV2 market => remove implementations
            if (_proxiedMarkets.contains(market)) {
                _removeImplementations(market);
                _proxiedMarkets.remove(market);
            } else {
                _legacyMarkets.remove(market);
            }

            delete marketForKey[key];
            _allMarkets.remove(market);
            emit MarketRemoved(market, baseAsset, key);
        }
    }

    /*
     * Remove a set of markets. Reverts if any market is not known to the manager.
     */
    function removeMarkets(address[] calldata marketsToRemove) external onlyOwner {
        return _removeMarkets(marketsToRemove);
    }

    /*
     * Remove the markets for a given set of market keys. Reverts if any key has no associated market.
     */
    function removeMarketsByKey(bytes32[] calldata marketKeysToRemove) external onlyOwner {
        _removeMarkets(_marketsForKeys(marketKeysToRemove));
    }

    function updateMarketsImplementations(address[] calldata marketsToUpdate) external onlyOwner {
        uint numOfMarkets = marketsToUpdate.length;
        for (uint i; i < numOfMarkets; i++) {
            address market = marketsToUpdate[i];
            require(market != address(0), "Invalid market");
            require(_allMarkets.contains(market), "Unknown market");

            // Remove old implementations
            _removeImplementations(market);

            // Pull new implementations
            _addImplementations(market);
        }
    }

    /*
     * Allows a market to issue sUSD to an account when it withdraws margin.
     * This function is not callable through the proxy, only underlying contracts interact;
     * it reverts if not called by a known market.
     */
    function issueSUSD(address account, uint amount) external onlyMarketImplementations {
        // No settlement is required to issue synths into the target account.
        _sUSD().issue(account, amount);
    }

    /*
     * Allows a market to burn sUSD from an account when it deposits margin.
     * This function is not callable through the proxy, only underlying contracts interact;
     * it reverts if not called by a known market.
     */
    function burnSUSD(address account, uint amount) external onlyMarketImplementations returns (uint postReclamationAmount) {
        // We'll settle first, in order to ensure the user has sufficient balance.
        // If the settlement reduces the user's balance below the requested amount,
        // the settled remainder will be the resulting deposit.

        // Exchanger.settle ensures synth is active
        ISynth sUSD = _sUSD();
        (uint reclaimed, , ) = _exchanger().settle(account, SUSD);

        uint balanceAfter = amount;
        if (0 < reclaimed) {
            balanceAfter = IERC20(address(sUSD)).balanceOf(account);
        }

        // Reduce the value to burn if balance is insufficient after reclamation
        amount = balanceAfter < amount ? balanceAfter : amount;

        sUSD.burn(account, amount);

        return amount;
    }

    /**
     * Allows markets to issue exchange fees into the fee pool and notify it that this occurred.
     * This function is not callable through the proxy, only underlying contracts interact;
     * it reverts if not called by a known market.
     */
    function payFee(uint amount, bytes32 trackingCode) external onlyMarketImplementations {
        _payFee(amount, trackingCode);
    }

    // backwards compatibility with futures v1
    function payFee(uint amount) external onlyMarketImplementations {
        _payFee(amount, bytes32(0));
    }

    function _payFee(uint amount, bytes32 trackingCode) internal {
        delete trackingCode; // unused for now, will be used SIP 203
        IFeePool pool = _feePool();
        _sUSD().issue(pool.FEE_ADDRESS(), amount);
        pool.recordFeePaid(amount);
    }

    /*
     * Removes a group of endorsed addresses.
     * For each address, if it's present is removed, if it's not present it does nothing
     */
    function removeEndorsedAddresses(address[] calldata addresses) external onlyOwner {
        for (uint i = 0; i < addresses.length; i++) {
            if (_endorsedAddresses.contains(addresses[i])) {
                _endorsedAddresses.remove(addresses[i]);
                emit EndorsedAddressRemoved(addresses[i]);
            }
        }
    }

    /*
     * Adds a group of endorsed addresses.
     * For each address, if it's not present it is added, if it's already present it does nothing
     */
    function addEndorsedAddresses(address[] calldata addresses) external onlyOwner {
        for (uint i = 0; i < addresses.length; i++) {
            _endorsedAddresses.add(addresses[i]);
            emit EndorsedAddressAdded(addresses[i]);
        }
    }

    /* ========== MODIFIERS ========== */

    function _requireIsMarketOrImplementation() internal view {
        require(
            _legacyMarkets.contains(msg.sender) || _implementations.contains(msg.sender),
            "Permitted only for market implementations"
        );
    }

    modifier onlyMarketImplementations() {
        _requireIsMarketOrImplementation();
        _;
    }

    /* ========== EVENTS ========== */

    event MarketAdded(address market, bytes32 indexed asset, bytes32 indexed marketKey);

    event MarketRemoved(address market, bytes32 indexed asset, bytes32 indexed marketKey);

    event EndorsedAddressAdded(address endorsedAddress);

    event EndorsedAddressRemoved(address endorsedAddress);
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_resolver","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"name","type":"bytes32"},{"indexed":false,"internalType":"address","name":"destination","type":"address"}],"name":"CacheUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"endorsedAddress","type":"address"}],"name":"EndorsedAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"endorsedAddress","type":"address"}],"name":"EndorsedAddressRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":true,"internalType":"bytes32","name":"asset","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"marketKey","type":"bytes32"}],"name":"MarketAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":true,"internalType":"bytes32","name":"asset","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"marketKey","type":"bytes32"}],"name":"MarketRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"constant":true,"inputs":[],"name":"CONTRACT_NAME","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addEndorsedAddresses","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"marketsToAdd","type":"address[]"}],"name":"addMarkets","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"marketsToAdd","type":"address[]"}],"name":"addProxiedMarkets","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"allEndorsedAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allMarketSummaries","outputs":[{"components":[{"internalType":"address","name":"market","type":"address"},{"internalType":"bytes32","name":"asset","type":"bytes32"},{"internalType":"bytes32","name":"marketKey","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"marketSize","type":"uint256"},{"internalType":"int256","name":"marketSkew","type":"int256"},{"internalType":"uint256","name":"marketDebt","type":"uint256"},{"internalType":"int256","name":"currentFundingRate","type":"int256"},{"internalType":"int256","name":"currentFundingVelocity","type":"int256"},{"internalType":"bool","name":"priceInvalid","type":"bool"},{"internalType":"bool","name":"proxied","type":"bool"}],"internalType":"struct FuturesMarketManager.MarketSummary[]","name":"","type":"tuple[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allMarkets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bool","name":"proxiedMarkets","type":"bool"}],"name":"allMarkets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnSUSD","outputs":[{"internalType":"uint256","name":"postReclamationAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isEndorsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isResolverCached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"issueSUSD","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"marketForKey","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"marketSummaries","outputs":[{"components":[{"internalType":"address","name":"market","type":"address"},{"internalType":"bytes32","name":"asset","type":"bytes32"},{"internalType":"bytes32","name":"marketKey","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"marketSize","type":"uint256"},{"internalType":"int256","name":"marketSkew","type":"int256"},{"internalType":"uint256","name":"marketDebt","type":"uint256"},{"internalType":"int256","name":"currentFundingRate","type":"int256"},{"internalType":"int256","name":"currentFundingVelocity","type":"int256"},{"internalType":"bool","name":"priceInvalid","type":"bool"},{"internalType":"bool","name":"proxied","type":"bool"}],"internalType":"struct FuturesMarketManager.MarketSummary[]","name":"","type":"tuple[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32[]","name":"marketKeys","type":"bytes32[]"}],"name":"marketSummariesForKeys","outputs":[{"components":[{"internalType":"address","name":"market","type":"address"},{"internalType":"bytes32","name":"asset","type":"bytes32"},{"internalType":"bytes32","name":"marketKey","type":"bytes32"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"marketSize","type":"uint256"},{"internalType":"int256","name":"marketSkew","type":"int256"},{"internalType":"uint256","name":"marketDebt","type":"uint256"},{"internalType":"int256","name":"currentFundingRate","type":"int256"},{"internalType":"int256","name":"currentFundingVelocity","type":"int256"},{"internalType":"bool","name":"priceInvalid","type":"bool"},{"internalType":"bool","name":"proxied","type":"bool"}],"internalType":"struct FuturesMarketManager.MarketSummary[]","name":"","type":"tuple[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"pageSize","type":"uint256"},{"internalType":"bool","name":"proxiedMarkets","type":"bool"}],"name":"markets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"pageSize","type":"uint256"}],"name":"markets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32[]","name":"marketKeys","type":"bytes32[]"}],"name":"marketsForKeys","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numMarkets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bool","name":"proxiedMarkets","type":"bool"}],"name":"numMarkets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"trackingCode","type":"bytes32"}],"name":"payFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"payFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"rebuildCache","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeEndorsedAddresses","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"marketsToRemove","type":"address[]"}],"name":"removeMarkets","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32[]","name":"marketKeysToRemove","type":"bytes32[]"}],"name":"removeMarketsByKey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"resolver","outputs":[{"internalType":"contract AddressResolver","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"resolverAddressesRequired","outputs":[{"internalType":"bytes32[]","name":"addresses","type":"bytes32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"debt","type":"uint256"},{"internalType":"bool","name":"isInvalid","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"marketsToUpdate","type":"address[]"}],"name":"updateMarketsImplementations","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162003090380380620030908339810160408190526200003491620000fa565b80826001600160a01b038116620000685760405162461bcd60e51b81526004016200005f90620001b6565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0383161781556040517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91620000b591849062000190565b60405180910390a150600280546001600160a01b0319166001600160a01b039290921691909117905550620002119050565b8051620000f481620001f7565b92915050565b600080604083850312156200010e57600080fd5b60006200011c8585620000e7565b92505060206200012f85828601620000e7565b9150509250929050565b6200014481620001e3565b82525050565b6200014481620001d1565b600062000164601983620001c8565b7f4f776e657220616464726573732063616e6e6f74206265203000000000000000815260200192915050565b60408101620001a0828562000139565b620001af60208301846200014a565b9392505050565b60208082528101620000f48162000155565b90815260200190565b60006001600160a01b038216620000f4565b6000620000f4826000620000f482620001d1565b6200020281620001d1565b81146200020e57600080fd5b50565b612e6f80620002216000396000f3fe608060405234801561001057600080fd5b50600436106102055760003560e01c80638da5cb5b1161011a578063ca079885116100ad578063f04cfcea1161007c578063f04cfcea14610413578063f607d90014610426578063fb77549c14610439578063fc7b9c181461044c578063fe11edc91461046257610205565b8063ca079885146103c7578063d289ade2146103da578063da40385d146103ed578063e63bfadb1461040057610205565b8063a9e0bef7116100e9578063a9e0bef71461037b578063bfef7bdf1461038e578063c03852fb146103a1578063c6bbdafb146103b457610205565b80638da5cb5b1461033a57806395fafa4a14610342578063a237e94d14610355578063a7b5833f1461036857610205565b80634dc253481161019d5780636f9a0ca61161016c5780636f9a0ca6146102ef578063741853601461030257806379ba50971461030a57806383ce902214610312578063899ffef41461032557610205565b80634dc25348146102b75780634ed03526146102bf57806353a47bb7146102d2578063614d08f8146102e757610205565b80632af64bd3116101d95780632af64bd314610272578063375a7cba146102875780633c88ee181461028f5780634b955c38146102a457610205565b80628d3aca1461020a57806304f3bcec146102335780631627540c1461024857806326e04f9d1461025d575b600080fd5b61021d610218366004612496565b610475565b60405161022a9190612be3565b60405180910390f35b61023b6104bc565b60405161022a9190612c60565b61025b610256366004612420565b6104cb565b005b610265610529565b60405161022a9190612c24565b61027a610530565b60405161022a9190612c16565b61021d610647565b610297610665565b60405161022a9190612c05565b61025b6102b2366004612496565b610677565b61021d61072d565b61025b6102cd366004612496565b610746565b6102da61078d565b60405161022a9190612b9f565b61026561079c565b6102656102fd36600461245c565b6107b7565b61025b610965565b61025b610abb565b610297610320366004612496565b610b57565b61032d610b98565b60405161022a9190612bf4565b6102da610c2d565b61021d6103503660046125f2565b610c3c565b61027a610363366004612420565b610c76565b61025b61037636600461245c565b610c91565b610297610389366004612496565b610d04565b61025b61039c366004612496565b610d42565b6102656103af36600461250d565b610d86565b61025b6103c23660046125d3565b610da0565b61025b6103d5366004612496565b610db2565b61025b6103e836600461252b565b610e5b565b61025b6103fb366004612496565b610e71565b6102da61040e36600461252b565b610eb8565b61025b610421366004612496565b610ed3565b61021d61043436600461250d565b610f1f565b61025b610447366004612496565b610f5c565b610454611038565b60405161022a929190612d0f565b61021d6104703660046125d3565b611125565b60606104b383838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061113992505050565b90505b92915050565b6002546001600160a01b031681565b6104d36111e9565b600180546001600160a01b0319166001600160a01b0383161790556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229061051e908390612b9f565b60405180910390a150565b6004545b90565b6000606061053c610b98565b905060005b815181101561063e57600082828151811061055857fe5b602090810291909101810151600081815260039092526040918290205460025492516321f8a72160e01b81529193506001600160a01b039081169216906321f8a721906105a9908590600401612c24565b60206040518083038186803b1580156105c157600080fd5b505afa1580156105d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105f9919081019061243e565b6001600160a01b031614158061062457506000818152600360205260409020546001600160a01b0316155b15610635576000935050505061052d565b50600101610541565b50600191505090565b600480546060916106609160009063ffffffff61121516565b905090565b6060610660610672610647565b6112e9565b61067f6111e9565b8060005b8181101561072757600084848381811061069957fe5b90506020020160206106ae9190810190612420565b90506001600160a01b0381166106df5760405162461bcd60e51b81526004016106d690612cbf565b60405180910390fd5b6106f060048263ffffffff6117b016565b61070c5760405162461bcd60e51b81526004016106d690612cff565b6107158161181e565b61071e8161191a565b50600101610683565b50505050565b600e80546060916106609160009063ffffffff61121516565b61074e6111e9565b8060005b818110156107275761078584848381811061076957fe5b905060200201602061077e9190810190612420565b60016119f8565b600101610752565b6001546001600160a01b031681565b73233aba3ab932b9a6b0b935b2ba26b0b730b3b2b960611b81565b60006107c1611bf5565b60006107cb611c39565b905060006107d7611c50565b6001600160a01b0316631b16802c86631cd554d160e21b6040518363ffffffff1660e01b815260040161080b929190612bc8565b606060405180830381600087803b15801561082557600080fd5b505af1158015610839573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061085d919081019061263f565b5090915084905081156108e9576040516370a0823160e01b81526001600160a01b038416906370a0823190610896908990600401612b9f565b60206040518083038186803b1580156108ae57600080fd5b505afa1580156108c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108e69190810190612549565b90505b8481106108f657846108f8565b805b604051632770a7eb60e21b81529095506001600160a01b03841690639dc29fac906109299089908990600401612bc8565b600060405180830381600087803b15801561094357600080fd5b505af1158015610957573d6000803e3d6000fd5b509698975050505050505050565b606061096f610b98565b905060005b8151811015610ab757600082828151811061098b57fe5b602002602001015190506000600260009054906101000a90046001600160a01b03166001600160a01b031663dacb2d0183846040516020016109cd9190612b94565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016109f9929190612c40565b60206040518083038186803b158015610a1157600080fd5b505afa158015610a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a49919081019061243e565b6000838152600360205260409081902080546001600160a01b0319166001600160a01b038416179055519091507f88a93678a3692f6789d9546fc621bf7234b101ddb7d4fe479455112831b8aa6890610aa59084908490612c32565b60405180910390a15050600101610974565b5050565b6001546001600160a01b03163314610ae55760405162461bcd60e51b81526004016106d690612c7f565b6000546001546040517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c92610b28926001600160a01b0391821692911690612bad565b60405180910390a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60606104b361067284848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061113992505050565b604080516003808252608082019092526060916020820183803883390190505090506814de5b9d1a1cd554d160ba1b81600081518110610bd457fe5b60200260200101818152505066119959541bdbdb60ca1b81600181518110610bf857fe5b6020026020010181815250506822bc31b430b733b2b960b91b81600281518110610c1e57fe5b60200260200101818152505090565b6000546001600160a01b031681565b60608115610c5d57610c566008858563ffffffff61121516565b9050610c6f565b610c566006858563ffffffff61121516565b9392505050565b6000610c89600e8363ffffffff6117b016565b90505b919050565b610c99611bf5565b610ca1611c39565b6001600160a01b031663867904b483836040518363ffffffff1660e01b8152600401610cce929190612bc8565b600060405180830381600087803b158015610ce857600080fd5b505af1158015610cfc573d6000803e3d6000fd5b505050505050565b60606104b38383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506112e992505050565b610d4a6111e9565b610ab7828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c6792505050565b60008115610d975750600854610c8c565b50600654610c8c565b610da8611bf5565b610ab78282611e95565b610dba6111e9565b60005b81811015610e5657610df7838383818110610dd457fe5b9050602002016020610de99190810190612420565b600e9063ffffffff611fdd16565b7f696384f01e94455c2445de779911f5b368f4eac3e16adf75bdc0d48ac54e8d19838383818110610e2457fe5b9050602002016020610e399190810190612420565b604051610e469190612b9f565b60405180910390a1600101610dbd565b505050565b610e63611bf5565b610e6e816000611e95565b50565b610e796111e9565b8060005b8181101561072757610eb0848483818110610e9457fe5b9050602002016020610ea99190810190612420565b60006119f8565b600101610e7d565b600a602052600090815260409020546001600160a01b031681565b610edb6111e9565b610ab7610f1a83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061113992505050565b611c67565b60608115610f455760088054610f3e919060009063ffffffff61121516565b9050610c8c565b60068054610f3e919060009063ffffffff61121516565b610f646111e9565b60005b81811015610e5657610fa1838383818110610f7e57fe5b9050602002016020610f939190810190612420565b600e9063ffffffff6117b016565b1561103057610fd8838383818110610fb557fe5b9050602002016020610fca9190810190612420565b600e9063ffffffff61202f16565b7f833f79c2defb42e058e0f2ee06ccf0ed0d316289148a5d3b28d1296d8a6e00f483838381811061100557fe5b905060200201602061101a9190810190612420565b6040516110279190612b9f565b60405180910390a15b600101610f67565b600454600090819081908190815b8181101561111a576000806004600001838154811061106157fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031663e8c634706040518163ffffffff1660e01b8152600401604080518083038186803b1580156110b657600080fd5b505afa1580156110ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110ee91908101906125a3565b9092509050611103868363ffffffff61214516565b9550848061110e5750805b94505050600101611046565b509193509150509091565b60606104b36004848463ffffffff61121516565b606060008251905060608160405190808252806020026020018201604052801561116d578160200160208202803883390190505b50905060005b828110156111e157600a600086838151811061118b57fe5b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b03168282815181106111c157fe5b6001600160a01b0390921660209283029190910190910152600101611173565b509392505050565b6000546001600160a01b031633146112135760405162461bcd60e51b81526004016106d690612ccf565b565b825460609083830190811115611229575083545b838111611246575050604080516000815260208101909152610c6f565b604080518583038082526020808202830101909252606090828015611275578160200160208202803883390190505b50905060005b828110156112de57876000018782018154811061129457fe5b9060005260206000200160009054906101000a90046001600160a01b03168282815181106112be57fe5b6001600160a01b039092166020928302919091019091015260010161127b565b509695505050505050565b606060008251905060608160405190808252806020026020018201604052801561132d57816020015b61131a6121e3565b8152602001906001900390816113125790505b50905060005b828110156111e157600085828151811061134957fe5b602002602001015190506000816001600160a01b031663d7103a466040518163ffffffff1660e01b815260040160206040518083038186803b15801561138e57600080fd5b505afa1580156113a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113c69190810190612549565b90506000826001600160a01b031663cdf456e16040518163ffffffff1660e01b815260040160206040518083038186803b15801561140357600080fd5b505afa158015611417573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061143b9190810190612549565b9050600080846001600160a01b031663d24378eb6040518163ffffffff1660e01b8152600401604080518083038186803b15801561147857600080fd5b505afa15801561148c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114b091908101906125a3565b915091506000856001600160a01b031663e8c634706040518163ffffffff1660e01b8152600401604080518083038186803b1580156114ee57600080fd5b505afa158015611502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061152691908101906125a3565b50905060006115528c898151811061153a57fe5b602002602001015160086117b090919063ffffffff16565b9050604051806101600160405280886001600160a01b03168152602001868152602001878152602001858152602001886001600160a01b031663eb56105d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115ba57600080fd5b505afa1580156115ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115f29190810190612585565b6001600160801b03168152602001886001600160a01b0316632b58ecef6040518163ffffffff1660e01b815260040160206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116719190810190612567565b600f0b8152602001838152602001886001600160a01b0316633aef4d0b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b857600080fd5b505afa1580156116cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f09190810190612549565b815260200182611701576000611772565b886001600160a01b031663b74e38066040518163ffffffff1660e01b815260040160206040518083038186803b15801561173a57600080fd5b505afa15801561174e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117729190810190612549565b8152602001841515815260200182151581525089898151811061179157fe5b6020026020010181905250505050505050508080600101915050611333565b81546000906117c1575060006104b6565b6001600160a01b0382166000908152600184016020526040902054801515806118165750826001600160a01b0316846000016000815481106117ff57fe5b6000918252602090912001546001600160a01b0316145b949350505050565b6001600160a01b0381166000908152600d602090815260409182902080548351818402810184019094528084526060939283018282801561188857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161186a575b50939450600093505050505b81518110156118f8576118c48282815181106118ac57fe5b6020026020010151600b6117b090919063ffffffff16565b156118f0576118f08282815181106118d857fe5b6020026020010151600b61202f90919063ffffffff16565b600101611894565b506001600160a01b0382166000908152600d60205260408120610ab79161223f565b6060816001600160a01b0316631d46021f6040518163ffffffff1660e01b815260040160006040518083038186803b15801561195557600080fd5b505afa158015611969573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261199191908101906124d8565b905060005b81518110156119ce576119c68282815181106119ae57fe5b6020026020010151600b611fdd90919063ffffffff16565b600101611996565b506001600160a01b0382166000908152600d602090815260409091208251610e569284019061225d565b611a006111e9565b611a1160048363ffffffff6117b016565b15611a2e5760405162461bcd60e51b81526004016106d690612caf565b6000826001600160a01b031663d7103a466040518163ffffffff1660e01b815260040160206040518083038186803b158015611a6957600080fd5b505afa158015611a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611aa19190810190612549565b90506000836001600160a01b031663cdf456e16040518163ffffffff1660e01b815260040160206040518083038186803b158015611ade57600080fd5b505afa158015611af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b169190810190612549565b6000838152600a60205260409020549091506001600160a01b031615611b4e5760405162461bcd60e51b81526004016106d690612cdf565b6000828152600a6020526040902080546001600160a01b0319166001600160a01b038616179055611b80600485611fdd565b8215611ba557611b9760088563ffffffff611fdd16565b611ba08461191a565b611bb6565b611bb660068563ffffffff611fdd16565b81817f96bfb0243b17c28e58d33656cd16adf56e92fc6bbeedab19c4a1c56f585274d686604051611be79190612b9f565b60405180910390a350505050565b611c0660063363ffffffff6117b016565b80611c1d5750611c1d600b3363ffffffff6117b016565b6112135760405162461bcd60e51b81526004016106d690612cef565b60006106606814de5b9d1a1cd554d160ba1b61216a565b60006106606822bc31b430b733b2b960b91b61216a565b805160005b81811015610e56576000838281518110611c8257fe5b6020026020010151905060006001600160a01b0316816001600160a01b03161415611cbf5760405162461bcd60e51b81526004016106d690612cff565b6000816001600160a01b031663d7103a466040518163ffffffff1660e01b815260040160206040518083038186803b158015611cfa57600080fd5b505afa158015611d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d329190810190612549565b90506000826001600160a01b031663cdf456e16040518163ffffffff1660e01b815260040160206040518083038186803b158015611d6f57600080fd5b505afa158015611d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611da79190810190612549565b6000838152600a60205260409020549091506001600160a01b0316611dde5760405162461bcd60e51b81526004016106d690612cff565b611def60088463ffffffff6117b016565b15611e1357611dfd8361181e565b611e0e60088463ffffffff61202f16565b611e24565b611e2460068463ffffffff61202f16565b6000828152600a6020526040902080546001600160a01b0319169055611e5160048463ffffffff61202f16565b81817fce64c0b68d87b6796835a03e01a9e3935b8ed965b01df87766b1e5e35ab44bfd85604051611e829190612b9f565b60405180910390a3505050600101611c6c565b50600080611ea16121ce565b9050611eab611c39565b6001600160a01b031663867904b4826001600160a01b031663eb1edd616040518163ffffffff1660e01b815260040160206040518083038186803b158015611ef257600080fd5b505afa158015611f06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f2a919081019061243e565b856040518363ffffffff1660e01b8152600401611f48929190612bc8565b600060405180830381600087803b158015611f6257600080fd5b505af1158015611f76573d6000803e3d6000fd5b50506040516322bf55ef60e01b81526001600160a01b03841692506322bf55ef9150611fa6908690600401612c24565b600060405180830381600087803b158015611fc057600080fd5b505af1158015611fd4573d6000803e3d6000fd5b50505050505050565b611fe782826117b0565b610ab75781546001600160a01b038216600081815260018086016020908152604083208590559084018655858252902090910180546001600160a01b03191690911790555050565b61203982826117b0565b6120555760405162461bcd60e51b81526004016106d690612c9f565b6001600160a01b03811660009081526001830160205260409020548254600019018082146120f457600084600001828154811061208e57fe5b60009182526020909120015485546001600160a01b03909116915081908690859081106120b757fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815260018601909152604090208290555b83548490806120ff57fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0394909416815260019490940190925250506040812055565b6000828201838110156104b35760405162461bcd60e51b81526004016106d690612c8f565b60008181526003602090815260408083205490516001600160a01b03909116918215159161219a91869101612b74565b604051602081830303815290604052906121c75760405162461bcd60e51b81526004016106d69190612c6e565b5092915050565b600061066066119959541bdbdb60ca1b61216a565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b5080546000825590600052602060002090810190610e6e91906122c2565b8280548282559060005260206000209081019282156122b2579160200282015b828111156122b257825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061227d565b506122be9291506122dc565b5090565b61052d91905b808211156122be57600081556001016122c8565b61052d91905b808211156122be5780546001600160a01b03191681556001016122e2565b80356104b681612df4565b80516104b681612df4565b60008083601f84011261232857600080fd5b50813567ffffffffffffffff81111561234057600080fd5b60208301915083602082028301111561235857600080fd5b9250929050565b600082601f83011261237057600080fd5b815161238361237e82612d51565b612d2a565b915081818352602084019350602081019050838560208402820111156123a857600080fd5b60005b838110156123d457816123be888261230b565b84525060209283019291909101906001016123ab565b5050505092915050565b80356104b681612e08565b80516104b681612e08565b80356104b681612e11565b80516104b681612e11565b80516104b681612e1a565b80516104b681612e23565b60006020828403121561243257600080fd5b60006118168484612300565b60006020828403121561245057600080fd5b6000611816848461230b565b6000806040838503121561246f57600080fd5b600061247b8585612300565b925050602061248c858286016123f4565b9150509250929050565b600080602083850312156124a957600080fd5b823567ffffffffffffffff8111156124c057600080fd5b6124cc85828601612316565b92509250509250929050565b6000602082840312156124ea57600080fd5b815167ffffffffffffffff81111561250157600080fd5b6118168482850161235f565b60006020828403121561251f57600080fd5b600061181684846123de565b60006020828403121561253d57600080fd5b600061181684846123f4565b60006020828403121561255b57600080fd5b600061181684846123ff565b60006020828403121561257957600080fd5b6000611816848461240a565b60006020828403121561259757600080fd5b60006118168484612415565b600080604083850312156125b657600080fd5b60006125c285856123ff565b925050602061248c858286016123e9565b600080604083850312156125e657600080fd5b600061247b85856123f4565b60008060006060848603121561260757600080fd5b600061261386866123f4565b9350506020612624868287016123f4565b9250506040612635868287016123de565b9150509250925092565b60008060006060848603121561265457600080fd5b600061266086866123ff565b9350506020612671868287016123ff565b9250506040612635868287016123ff565b600061268e83836126b7565b505060200190565b600061268e83836127c4565b60006126ae8383612a9e565b50506101600190565b6126c081612d85565b82525050565b60006126d182612d78565b6126db8185612d7c565b93506126e683612d72565b8060005b838110156127145781516126fe8882612682565b975061270983612d72565b9250506001016126ea565b509495945050505050565b600061272a82612d78565b6127348185612d7c565b935061273f83612d72565b8060005b838110156127145781516127578882612696565b975061276283612d72565b925050600101612743565b600061277882612d78565b6127828185612d7c565b935061278d83612d72565b8060005b838110156127145781516127a588826126a2565b97506127b083612d72565b925050600101612791565b6126c081612d90565b6126c08161052d565b6126c06127d98261052d565b61052d565b6126c081612db3565b60006127f282612d78565b6127fc8185612d7c565b935061280c818560208601612dbe565b61281581612dea565b9093019392505050565b600061282c603583612d7c565b7f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7581527402063616e20616363657074206f776e65727368697605c1b602082015260400192915050565b6000612883601b83612d7c565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006128bc601383612d7c565b7222b632b6b2b73a103737ba1034b71039b2ba1760691b815260200192915050565b60006128eb601583612d7c565b744d61726b657420616c72656164792065786973747360581b815260200192915050565b600061291c601183610c8c565b70026b4b9b9b4b7339030b2323932b9b99d1607d1b815260110192915050565b6000612949600e83612d7c565b6d125b9d985b1a59081b585c9ad95d60921b815260200192915050565b6000612973602f83612d7c565b7f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726681526e37b936903a3434b99030b1ba34b7b760891b602082015260400192915050565b60006129c4601d83612d7c565b7f4d61726b657420616c72656164792065786973747320666f72206b6579000000815260200192915050565b60006129fd601983610c8c565b7f5265736f6c766572206d697373696e67207461726765743a2000000000000000815260190192915050565b6000612a36602983612d7c565b7f5065726d6974746564206f6e6c7920666f72206d61726b657420696d706c656d815268656e746174696f6e7360b81b602082015260400192915050565b6000612a81600e83612d7c565b6d155b9adb9bdddb881b585c9ad95d60921b815260200192915050565b8051610160830190612ab084826126b7565b506020820151612ac360208501826127c4565b506040820151612ad660408501826127c4565b506060820151612ae960608501826127c4565b506080820151612afc60808501826127c4565b5060a0820151612b0f60a08501826127c4565b5060c0820151612b2260c08501826127c4565b5060e0820151612b3560e08501826127c4565b50610100820151612b4a6101008501826127c4565b50610120820151612b5f6101208501826127bb565b506101408201516107276101408501826127bb565b6000612b7f8261290f565b9150612b8b82846127cd565b50602001919050565b6000612b7f826129f0565b602081016104b682846126b7565b60408101612bbb82856126b7565b610c6f60208301846126b7565b60408101612bd682856126b7565b610c6f60208301846127c4565b602080825281016104b381846126c6565b602080825281016104b3818461271f565b602080825281016104b3818461276d565b602081016104b682846127bb565b602081016104b682846127c4565b60408101612bbb82856127c4565b60408101612c4e82856127c4565b818103602083015261181681846127e7565b602081016104b682846127de565b602080825281016104b381846127e7565b60208082528101610c898161281f565b60208082528101610c8981612876565b60208082528101610c89816128af565b60208082528101610c89816128de565b60208082528101610c898161293c565b60208082528101610c8981612966565b60208082528101610c89816129b7565b60208082528101610c8981612a29565b60208082528101610c8981612a74565b60408101612d1d82856127c4565b610c6f60208301846127bb565b60405181810167ffffffffffffffff81118282101715612d4957600080fd5b604052919050565b600067ffffffffffffffff821115612d6857600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b6000610c8982612da7565b151590565b600f0b90565b6001600160801b031690565b6001600160a01b031690565b6000610c8982612d85565b60005b83811015612dd9578181015183820152602001612dc1565b838111156107275750506000910152565b601f01601f191690565b612dfd81612d85565b8114610e6e57600080fd5b612dfd81612d90565b612dfd8161052d565b612dfd81612d95565b612dfd81612d9b56fea365627a7a72315820c0ae651725b0f979fcc310164cc514a21aa3159fe8976b317e8f41d095beea1e6c6578706572696d656e74616cf564736f6c6343000510004000000000000000000000000048914229dedd5a9922f44441ffccfc2cb7856ee9000000000000000000000000529c553ef2d0370279dc8abf19702b98b166d252

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102055760003560e01c80638da5cb5b1161011a578063ca079885116100ad578063f04cfcea1161007c578063f04cfcea14610413578063f607d90014610426578063fb77549c14610439578063fc7b9c181461044c578063fe11edc91461046257610205565b8063ca079885146103c7578063d289ade2146103da578063da40385d146103ed578063e63bfadb1461040057610205565b8063a9e0bef7116100e9578063a9e0bef71461037b578063bfef7bdf1461038e578063c03852fb146103a1578063c6bbdafb146103b457610205565b80638da5cb5b1461033a57806395fafa4a14610342578063a237e94d14610355578063a7b5833f1461036857610205565b80634dc253481161019d5780636f9a0ca61161016c5780636f9a0ca6146102ef578063741853601461030257806379ba50971461030a57806383ce902214610312578063899ffef41461032557610205565b80634dc25348146102b75780634ed03526146102bf57806353a47bb7146102d2578063614d08f8146102e757610205565b80632af64bd3116101d95780632af64bd314610272578063375a7cba146102875780633c88ee181461028f5780634b955c38146102a457610205565b80628d3aca1461020a57806304f3bcec146102335780631627540c1461024857806326e04f9d1461025d575b600080fd5b61021d610218366004612496565b610475565b60405161022a9190612be3565b60405180910390f35b61023b6104bc565b60405161022a9190612c60565b61025b610256366004612420565b6104cb565b005b610265610529565b60405161022a9190612c24565b61027a610530565b60405161022a9190612c16565b61021d610647565b610297610665565b60405161022a9190612c05565b61025b6102b2366004612496565b610677565b61021d61072d565b61025b6102cd366004612496565b610746565b6102da61078d565b60405161022a9190612b9f565b61026561079c565b6102656102fd36600461245c565b6107b7565b61025b610965565b61025b610abb565b610297610320366004612496565b610b57565b61032d610b98565b60405161022a9190612bf4565b6102da610c2d565b61021d6103503660046125f2565b610c3c565b61027a610363366004612420565b610c76565b61025b61037636600461245c565b610c91565b610297610389366004612496565b610d04565b61025b61039c366004612496565b610d42565b6102656103af36600461250d565b610d86565b61025b6103c23660046125d3565b610da0565b61025b6103d5366004612496565b610db2565b61025b6103e836600461252b565b610e5b565b61025b6103fb366004612496565b610e71565b6102da61040e36600461252b565b610eb8565b61025b610421366004612496565b610ed3565b61021d61043436600461250d565b610f1f565b61025b610447366004612496565b610f5c565b610454611038565b60405161022a929190612d0f565b61021d6104703660046125d3565b611125565b60606104b383838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061113992505050565b90505b92915050565b6002546001600160a01b031681565b6104d36111e9565b600180546001600160a01b0319166001600160a01b0383161790556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229061051e908390612b9f565b60405180910390a150565b6004545b90565b6000606061053c610b98565b905060005b815181101561063e57600082828151811061055857fe5b602090810291909101810151600081815260039092526040918290205460025492516321f8a72160e01b81529193506001600160a01b039081169216906321f8a721906105a9908590600401612c24565b60206040518083038186803b1580156105c157600080fd5b505afa1580156105d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105f9919081019061243e565b6001600160a01b031614158061062457506000818152600360205260409020546001600160a01b0316155b15610635576000935050505061052d565b50600101610541565b50600191505090565b600480546060916106609160009063ffffffff61121516565b905090565b6060610660610672610647565b6112e9565b61067f6111e9565b8060005b8181101561072757600084848381811061069957fe5b90506020020160206106ae9190810190612420565b90506001600160a01b0381166106df5760405162461bcd60e51b81526004016106d690612cbf565b60405180910390fd5b6106f060048263ffffffff6117b016565b61070c5760405162461bcd60e51b81526004016106d690612cff565b6107158161181e565b61071e8161191a565b50600101610683565b50505050565b600e80546060916106609160009063ffffffff61121516565b61074e6111e9565b8060005b818110156107275761078584848381811061076957fe5b905060200201602061077e9190810190612420565b60016119f8565b600101610752565b6001546001600160a01b031681565b73233aba3ab932b9a6b0b935b2ba26b0b730b3b2b960611b81565b60006107c1611bf5565b60006107cb611c39565b905060006107d7611c50565b6001600160a01b0316631b16802c86631cd554d160e21b6040518363ffffffff1660e01b815260040161080b929190612bc8565b606060405180830381600087803b15801561082557600080fd5b505af1158015610839573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061085d919081019061263f565b5090915084905081156108e9576040516370a0823160e01b81526001600160a01b038416906370a0823190610896908990600401612b9f565b60206040518083038186803b1580156108ae57600080fd5b505afa1580156108c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108e69190810190612549565b90505b8481106108f657846108f8565b805b604051632770a7eb60e21b81529095506001600160a01b03841690639dc29fac906109299089908990600401612bc8565b600060405180830381600087803b15801561094357600080fd5b505af1158015610957573d6000803e3d6000fd5b509698975050505050505050565b606061096f610b98565b905060005b8151811015610ab757600082828151811061098b57fe5b602002602001015190506000600260009054906101000a90046001600160a01b03166001600160a01b031663dacb2d0183846040516020016109cd9190612b94565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016109f9929190612c40565b60206040518083038186803b158015610a1157600080fd5b505afa158015610a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a49919081019061243e565b6000838152600360205260409081902080546001600160a01b0319166001600160a01b038416179055519091507f88a93678a3692f6789d9546fc621bf7234b101ddb7d4fe479455112831b8aa6890610aa59084908490612c32565b60405180910390a15050600101610974565b5050565b6001546001600160a01b03163314610ae55760405162461bcd60e51b81526004016106d690612c7f565b6000546001546040517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c92610b28926001600160a01b0391821692911690612bad565b60405180910390a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60606104b361067284848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061113992505050565b604080516003808252608082019092526060916020820183803883390190505090506814de5b9d1a1cd554d160ba1b81600081518110610bd457fe5b60200260200101818152505066119959541bdbdb60ca1b81600181518110610bf857fe5b6020026020010181815250506822bc31b430b733b2b960b91b81600281518110610c1e57fe5b60200260200101818152505090565b6000546001600160a01b031681565b60608115610c5d57610c566008858563ffffffff61121516565b9050610c6f565b610c566006858563ffffffff61121516565b9392505050565b6000610c89600e8363ffffffff6117b016565b90505b919050565b610c99611bf5565b610ca1611c39565b6001600160a01b031663867904b483836040518363ffffffff1660e01b8152600401610cce929190612bc8565b600060405180830381600087803b158015610ce857600080fd5b505af1158015610cfc573d6000803e3d6000fd5b505050505050565b60606104b38383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506112e992505050565b610d4a6111e9565b610ab7828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c6792505050565b60008115610d975750600854610c8c565b50600654610c8c565b610da8611bf5565b610ab78282611e95565b610dba6111e9565b60005b81811015610e5657610df7838383818110610dd457fe5b9050602002016020610de99190810190612420565b600e9063ffffffff611fdd16565b7f696384f01e94455c2445de779911f5b368f4eac3e16adf75bdc0d48ac54e8d19838383818110610e2457fe5b9050602002016020610e399190810190612420565b604051610e469190612b9f565b60405180910390a1600101610dbd565b505050565b610e63611bf5565b610e6e816000611e95565b50565b610e796111e9565b8060005b8181101561072757610eb0848483818110610e9457fe5b9050602002016020610ea99190810190612420565b60006119f8565b600101610e7d565b600a602052600090815260409020546001600160a01b031681565b610edb6111e9565b610ab7610f1a83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061113992505050565b611c67565b60608115610f455760088054610f3e919060009063ffffffff61121516565b9050610c8c565b60068054610f3e919060009063ffffffff61121516565b610f646111e9565b60005b81811015610e5657610fa1838383818110610f7e57fe5b9050602002016020610f939190810190612420565b600e9063ffffffff6117b016565b1561103057610fd8838383818110610fb557fe5b9050602002016020610fca9190810190612420565b600e9063ffffffff61202f16565b7f833f79c2defb42e058e0f2ee06ccf0ed0d316289148a5d3b28d1296d8a6e00f483838381811061100557fe5b905060200201602061101a9190810190612420565b6040516110279190612b9f565b60405180910390a15b600101610f67565b600454600090819081908190815b8181101561111a576000806004600001838154811061106157fe5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031663e8c634706040518163ffffffff1660e01b8152600401604080518083038186803b1580156110b657600080fd5b505afa1580156110ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110ee91908101906125a3565b9092509050611103868363ffffffff61214516565b9550848061110e5750805b94505050600101611046565b509193509150509091565b60606104b36004848463ffffffff61121516565b606060008251905060608160405190808252806020026020018201604052801561116d578160200160208202803883390190505b50905060005b828110156111e157600a600086838151811061118b57fe5b6020026020010151815260200190815260200160002060009054906101000a90046001600160a01b03168282815181106111c157fe5b6001600160a01b0390921660209283029190910190910152600101611173565b509392505050565b6000546001600160a01b031633146112135760405162461bcd60e51b81526004016106d690612ccf565b565b825460609083830190811115611229575083545b838111611246575050604080516000815260208101909152610c6f565b604080518583038082526020808202830101909252606090828015611275578160200160208202803883390190505b50905060005b828110156112de57876000018782018154811061129457fe5b9060005260206000200160009054906101000a90046001600160a01b03168282815181106112be57fe5b6001600160a01b039092166020928302919091019091015260010161127b565b509695505050505050565b606060008251905060608160405190808252806020026020018201604052801561132d57816020015b61131a6121e3565b8152602001906001900390816113125790505b50905060005b828110156111e157600085828151811061134957fe5b602002602001015190506000816001600160a01b031663d7103a466040518163ffffffff1660e01b815260040160206040518083038186803b15801561138e57600080fd5b505afa1580156113a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113c69190810190612549565b90506000826001600160a01b031663cdf456e16040518163ffffffff1660e01b815260040160206040518083038186803b15801561140357600080fd5b505afa158015611417573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061143b9190810190612549565b9050600080846001600160a01b031663d24378eb6040518163ffffffff1660e01b8152600401604080518083038186803b15801561147857600080fd5b505afa15801561148c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114b091908101906125a3565b915091506000856001600160a01b031663e8c634706040518163ffffffff1660e01b8152600401604080518083038186803b1580156114ee57600080fd5b505afa158015611502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061152691908101906125a3565b50905060006115528c898151811061153a57fe5b602002602001015160086117b090919063ffffffff16565b9050604051806101600160405280886001600160a01b03168152602001868152602001878152602001858152602001886001600160a01b031663eb56105d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115ba57600080fd5b505afa1580156115ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115f29190810190612585565b6001600160801b03168152602001886001600160a01b0316632b58ecef6040518163ffffffff1660e01b815260040160206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116719190810190612567565b600f0b8152602001838152602001886001600160a01b0316633aef4d0b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b857600080fd5b505afa1580156116cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f09190810190612549565b815260200182611701576000611772565b886001600160a01b031663b74e38066040518163ffffffff1660e01b815260040160206040518083038186803b15801561173a57600080fd5b505afa15801561174e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117729190810190612549565b8152602001841515815260200182151581525089898151811061179157fe5b6020026020010181905250505050505050508080600101915050611333565b81546000906117c1575060006104b6565b6001600160a01b0382166000908152600184016020526040902054801515806118165750826001600160a01b0316846000016000815481106117ff57fe5b6000918252602090912001546001600160a01b0316145b949350505050565b6001600160a01b0381166000908152600d602090815260409182902080548351818402810184019094528084526060939283018282801561188857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161186a575b50939450600093505050505b81518110156118f8576118c48282815181106118ac57fe5b6020026020010151600b6117b090919063ffffffff16565b156118f0576118f08282815181106118d857fe5b6020026020010151600b61202f90919063ffffffff16565b600101611894565b506001600160a01b0382166000908152600d60205260408120610ab79161223f565b6060816001600160a01b0316631d46021f6040518163ffffffff1660e01b815260040160006040518083038186803b15801561195557600080fd5b505afa158015611969573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261199191908101906124d8565b905060005b81518110156119ce576119c68282815181106119ae57fe5b6020026020010151600b611fdd90919063ffffffff16565b600101611996565b506001600160a01b0382166000908152600d602090815260409091208251610e569284019061225d565b611a006111e9565b611a1160048363ffffffff6117b016565b15611a2e5760405162461bcd60e51b81526004016106d690612caf565b6000826001600160a01b031663d7103a466040518163ffffffff1660e01b815260040160206040518083038186803b158015611a6957600080fd5b505afa158015611a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611aa19190810190612549565b90506000836001600160a01b031663cdf456e16040518163ffffffff1660e01b815260040160206040518083038186803b158015611ade57600080fd5b505afa158015611af2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b169190810190612549565b6000838152600a60205260409020549091506001600160a01b031615611b4e5760405162461bcd60e51b81526004016106d690612cdf565b6000828152600a6020526040902080546001600160a01b0319166001600160a01b038616179055611b80600485611fdd565b8215611ba557611b9760088563ffffffff611fdd16565b611ba08461191a565b611bb6565b611bb660068563ffffffff611fdd16565b81817f96bfb0243b17c28e58d33656cd16adf56e92fc6bbeedab19c4a1c56f585274d686604051611be79190612b9f565b60405180910390a350505050565b611c0660063363ffffffff6117b016565b80611c1d5750611c1d600b3363ffffffff6117b016565b6112135760405162461bcd60e51b81526004016106d690612cef565b60006106606814de5b9d1a1cd554d160ba1b61216a565b60006106606822bc31b430b733b2b960b91b61216a565b805160005b81811015610e56576000838281518110611c8257fe5b6020026020010151905060006001600160a01b0316816001600160a01b03161415611cbf5760405162461bcd60e51b81526004016106d690612cff565b6000816001600160a01b031663d7103a466040518163ffffffff1660e01b815260040160206040518083038186803b158015611cfa57600080fd5b505afa158015611d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d329190810190612549565b90506000826001600160a01b031663cdf456e16040518163ffffffff1660e01b815260040160206040518083038186803b158015611d6f57600080fd5b505afa158015611d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611da79190810190612549565b6000838152600a60205260409020549091506001600160a01b0316611dde5760405162461bcd60e51b81526004016106d690612cff565b611def60088463ffffffff6117b016565b15611e1357611dfd8361181e565b611e0e60088463ffffffff61202f16565b611e24565b611e2460068463ffffffff61202f16565b6000828152600a6020526040902080546001600160a01b0319169055611e5160048463ffffffff61202f16565b81817fce64c0b68d87b6796835a03e01a9e3935b8ed965b01df87766b1e5e35ab44bfd85604051611e829190612b9f565b60405180910390a3505050600101611c6c565b50600080611ea16121ce565b9050611eab611c39565b6001600160a01b031663867904b4826001600160a01b031663eb1edd616040518163ffffffff1660e01b815260040160206040518083038186803b158015611ef257600080fd5b505afa158015611f06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f2a919081019061243e565b856040518363ffffffff1660e01b8152600401611f48929190612bc8565b600060405180830381600087803b158015611f6257600080fd5b505af1158015611f76573d6000803e3d6000fd5b50506040516322bf55ef60e01b81526001600160a01b03841692506322bf55ef9150611fa6908690600401612c24565b600060405180830381600087803b158015611fc057600080fd5b505af1158015611fd4573d6000803e3d6000fd5b50505050505050565b611fe782826117b0565b610ab75781546001600160a01b038216600081815260018086016020908152604083208590559084018655858252902090910180546001600160a01b03191690911790555050565b61203982826117b0565b6120555760405162461bcd60e51b81526004016106d690612c9f565b6001600160a01b03811660009081526001830160205260409020548254600019018082146120f457600084600001828154811061208e57fe5b60009182526020909120015485546001600160a01b03909116915081908690859081106120b757fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905592909116815260018601909152604090208290555b83548490806120ff57fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0394909416815260019490940190925250506040812055565b6000828201838110156104b35760405162461bcd60e51b81526004016106d690612c8f565b60008181526003602090815260408083205490516001600160a01b03909116918215159161219a91869101612b74565b604051602081830303815290604052906121c75760405162461bcd60e51b81526004016106d69190612c6e565b5092915050565b600061066066119959541bdbdb60ca1b61216a565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b5080546000825590600052602060002090810190610e6e91906122c2565b8280548282559060005260206000209081019282156122b2579160200282015b828111156122b257825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061227d565b506122be9291506122dc565b5090565b61052d91905b808211156122be57600081556001016122c8565b61052d91905b808211156122be5780546001600160a01b03191681556001016122e2565b80356104b681612df4565b80516104b681612df4565b60008083601f84011261232857600080fd5b50813567ffffffffffffffff81111561234057600080fd5b60208301915083602082028301111561235857600080fd5b9250929050565b600082601f83011261237057600080fd5b815161238361237e82612d51565b612d2a565b915081818352602084019350602081019050838560208402820111156123a857600080fd5b60005b838110156123d457816123be888261230b565b84525060209283019291909101906001016123ab565b5050505092915050565b80356104b681612e08565b80516104b681612e08565b80356104b681612e11565b80516104b681612e11565b80516104b681612e1a565b80516104b681612e23565b60006020828403121561243257600080fd5b60006118168484612300565b60006020828403121561245057600080fd5b6000611816848461230b565b6000806040838503121561246f57600080fd5b600061247b8585612300565b925050602061248c858286016123f4565b9150509250929050565b600080602083850312156124a957600080fd5b823567ffffffffffffffff8111156124c057600080fd5b6124cc85828601612316565b92509250509250929050565b6000602082840312156124ea57600080fd5b815167ffffffffffffffff81111561250157600080fd5b6118168482850161235f565b60006020828403121561251f57600080fd5b600061181684846123de565b60006020828403121561253d57600080fd5b600061181684846123f4565b60006020828403121561255b57600080fd5b600061181684846123ff565b60006020828403121561257957600080fd5b6000611816848461240a565b60006020828403121561259757600080fd5b60006118168484612415565b600080604083850312156125b657600080fd5b60006125c285856123ff565b925050602061248c858286016123e9565b600080604083850312156125e657600080fd5b600061247b85856123f4565b60008060006060848603121561260757600080fd5b600061261386866123f4565b9350506020612624868287016123f4565b9250506040612635868287016123de565b9150509250925092565b60008060006060848603121561265457600080fd5b600061266086866123ff565b9350506020612671868287016123ff565b9250506040612635868287016123ff565b600061268e83836126b7565b505060200190565b600061268e83836127c4565b60006126ae8383612a9e565b50506101600190565b6126c081612d85565b82525050565b60006126d182612d78565b6126db8185612d7c565b93506126e683612d72565b8060005b838110156127145781516126fe8882612682565b975061270983612d72565b9250506001016126ea565b509495945050505050565b600061272a82612d78565b6127348185612d7c565b935061273f83612d72565b8060005b838110156127145781516127578882612696565b975061276283612d72565b925050600101612743565b600061277882612d78565b6127828185612d7c565b935061278d83612d72565b8060005b838110156127145781516127a588826126a2565b97506127b083612d72565b925050600101612791565b6126c081612d90565b6126c08161052d565b6126c06127d98261052d565b61052d565b6126c081612db3565b60006127f282612d78565b6127fc8185612d7c565b935061280c818560208601612dbe565b61281581612dea565b9093019392505050565b600061282c603583612d7c565b7f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7581527402063616e20616363657074206f776e65727368697605c1b602082015260400192915050565b6000612883601b83612d7c565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b60006128bc601383612d7c565b7222b632b6b2b73a103737ba1034b71039b2ba1760691b815260200192915050565b60006128eb601583612d7c565b744d61726b657420616c72656164792065786973747360581b815260200192915050565b600061291c601183610c8c565b70026b4b9b9b4b7339030b2323932b9b99d1607d1b815260110192915050565b6000612949600e83612d7c565b6d125b9d985b1a59081b585c9ad95d60921b815260200192915050565b6000612973602f83612d7c565b7f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726681526e37b936903a3434b99030b1ba34b7b760891b602082015260400192915050565b60006129c4601d83612d7c565b7f4d61726b657420616c72656164792065786973747320666f72206b6579000000815260200192915050565b60006129fd601983610c8c565b7f5265736f6c766572206d697373696e67207461726765743a2000000000000000815260190192915050565b6000612a36602983612d7c565b7f5065726d6974746564206f6e6c7920666f72206d61726b657420696d706c656d815268656e746174696f6e7360b81b602082015260400192915050565b6000612a81600e83612d7c565b6d155b9adb9bdddb881b585c9ad95d60921b815260200192915050565b8051610160830190612ab084826126b7565b506020820151612ac360208501826127c4565b506040820151612ad660408501826127c4565b506060820151612ae960608501826127c4565b506080820151612afc60808501826127c4565b5060a0820151612b0f60a08501826127c4565b5060c0820151612b2260c08501826127c4565b5060e0820151612b3560e08501826127c4565b50610100820151612b4a6101008501826127c4565b50610120820151612b5f6101208501826127bb565b506101408201516107276101408501826127bb565b6000612b7f8261290f565b9150612b8b82846127cd565b50602001919050565b6000612b7f826129f0565b602081016104b682846126b7565b60408101612bbb82856126b7565b610c6f60208301846126b7565b60408101612bd682856126b7565b610c6f60208301846127c4565b602080825281016104b381846126c6565b602080825281016104b3818461271f565b602080825281016104b3818461276d565b602081016104b682846127bb565b602081016104b682846127c4565b60408101612bbb82856127c4565b60408101612c4e82856127c4565b818103602083015261181681846127e7565b602081016104b682846127de565b602080825281016104b381846127e7565b60208082528101610c898161281f565b60208082528101610c8981612876565b60208082528101610c89816128af565b60208082528101610c89816128de565b60208082528101610c898161293c565b60208082528101610c8981612966565b60208082528101610c89816129b7565b60208082528101610c8981612a29565b60208082528101610c8981612a74565b60408101612d1d82856127c4565b610c6f60208301846127bb565b60405181810167ffffffffffffffff81118282101715612d4957600080fd5b604052919050565b600067ffffffffffffffff821115612d6857600080fd5b5060209081020190565b60200190565b5190565b90815260200190565b6000610c8982612da7565b151590565b600f0b90565b6001600160801b031690565b6001600160a01b031690565b6000610c8982612d85565b60005b83811015612dd9578181015183820152602001612dc1565b838111156107275750506000910152565b601f01601f191690565b612dfd81612d85565b8114610e6e57600080fd5b612dfd81612d90565b612dfd8161052d565b612dfd81612d95565b612dfd81612d9b56fea365627a7a72315820c0ae651725b0f979fcc310164cc514a21aa3159fe8976b317e8f41d095beea1e6c6578706572696d656e74616cf564736f6c63430005100040

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

00000000000000000000000048914229dedd5a9922f44441ffccfc2cb7856ee9000000000000000000000000529c553ef2d0370279dc8abf19702b98b166d252

-----Decoded View---------------
Arg [0] : _owner (address): 0x48914229deDd5A9922f44441ffCCfC2Cb7856Ee9
Arg [1] : _resolver (address): 0x529C553eF2d0370279DC8AbF19702B98b166D252

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000048914229dedd5a9922f44441ffccfc2cb7856ee9
Arg [1] : 000000000000000000000000529c553ef2d0370279dc8abf19702b98b166d252


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.