Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 93 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Markets B... | 17078114 | 161 days ago | IN | 0 ETH | 0.000040429027 | ||||
Remove Markets B... | 14766507 | 214 days ago | IN | 0 ETH | 0.000389559529 | ||||
Remove Markets | 11978528 | 279 days ago | IN | 0 ETH | 0.000335488912 | ||||
Add Proxied Mark... | 8466447 | 360 days ago | IN | 0 ETH | 0.000002680136 | ||||
Add Proxied Mark... | 8466019 | 360 days ago | IN | 0 ETH | 0.00000312549 | ||||
Add Proxied Mark... | 8465551 | 360 days ago | IN | 0 ETH | 0.00000350805 | ||||
Add Proxied Mark... | 8465103 | 360 days ago | IN | 0 ETH | 0.000004236052 | ||||
Add Proxied Mark... | 7319867 | 387 days ago | IN | 0 ETH | 0.000004930532 | ||||
Add Proxied Mark... | 7319353 | 387 days ago | IN | 0 ETH | 0.000004989459 | ||||
Add Proxied Mark... | 7318803 | 387 days ago | IN | 0 ETH | 0.000004556362 | ||||
Add Proxied Mark... | 7318289 | 387 days ago | IN | 0 ETH | 0.000004512925 | ||||
Add Proxied Mark... | 7317764 | 387 days ago | IN | 0 ETH | 0.000005452764 | ||||
Add Proxied Mark... | 7317248 | 387 days ago | IN | 0 ETH | 0.000005676414 | ||||
Add Proxied Mark... | 7316719 | 387 days ago | IN | 0 ETH | 0.000004728262 | ||||
Add Proxied Mark... | 7316195 | 387 days ago | IN | 0 ETH | 0.000004954552 | ||||
Add Proxied Mark... | 7315678 | 387 days ago | IN | 0 ETH | 0.000004960635 | ||||
Add Proxied Mark... | 7315169 | 387 days ago | IN | 0 ETH | 0.000004946669 | ||||
Add Proxied Mark... | 7314656 | 387 days ago | IN | 0 ETH | 0.00000501113 | ||||
Add Proxied Mark... | 7314169 | 387 days ago | IN | 0 ETH | 0.000004779025 | ||||
Add Proxied Mark... | 7313633 | 387 days ago | IN | 0 ETH | 0.000004912373 | ||||
Add Proxied Mark... | 7313119 | 387 days ago | IN | 0 ETH | 0.000004554769 | ||||
Add Proxied Mark... | 7312623 | 387 days ago | IN | 0 ETH | 0.000004848347 | ||||
Add Proxied Mark... | 7312127 | 387 days ago | IN | 0 ETH | 0.000004670797 | ||||
Add Proxied Mark... | 7311642 | 387 days ago | IN | 0 ETH | 0.000005019705 | ||||
Add Proxied Mark... | 7311150 | 387 days ago | IN | 0 ETH | 0.000004752371 |
Loading...
Loading
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); }
[{"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"}]
Contract Creation Code
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
Library Used
SafeDecimalMath : 0x2ad7ccaac0eeb396c3a5fc2b73a885435688c0d5SystemSettingsLib : 0x343b5efcbf331957d3f4236eb16c338d7256f62dSignedSafeDecimalMath : 0xc7dcc0929881530d3386de51d9ffdd35b8009c6eExchangeSettlementLib : 0x3f60ffaef1ebd84e3c2d0c9c0e12388365d5df12
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.