Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MarketUtility
Compiler Version
v0.5.7+commit.6da8b019
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-29 */ // File: contracts/external/uniswap/solidity-interface.sol pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function createPair(address tokenA, address tokenB) external returns (address pair); } interface IUniswapV2Router02 { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2ERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; } interface IUniswapV2Callee { function uniswapV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external; } // File: contracts/external/uniswap/FixedPoint.sol // SPDX-License-Identifier: GPL-3.0-or-later // computes square roots using the babylonian method // https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method pragma solidity >=0.5.0; library Babylonian { function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } // else z = 0 } } library UQ112x112 { uint224 constant Q112 = 2**112; // encode a uint112 as a UQ112x112 function encode(uint112 y) internal pure returns (uint224 z) { z = uint224(y) * Q112; // never overflows } // divide a UQ112x112 by a uint112, returning a UQ112x112 function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) { z = x / uint224(y); } } // a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format)) library FixedPoint { // range: [0, 2**112 - 1] // resolution: 1 / 2**112 struct uq112x112 { uint224 _x; } // range: [0, 2**144 - 1] // resolution: 1 / 2**112 struct uq144x112 { uint _x; } uint8 private constant RESOLUTION = 112; uint private constant Q112 = uint(1) << RESOLUTION; uint private constant Q224 = Q112 << RESOLUTION; // encode a uint112 as a UQ112x112 function encode(uint112 x) internal pure returns (uq112x112 memory) { return uq112x112(uint224(x) << RESOLUTION); } // encodes a uint144 as a UQ144x112 function encode144(uint144 x) internal pure returns (uq144x112 memory) { return uq144x112(uint256(x) << RESOLUTION); } // divide a UQ112x112 by a uint112, returning a UQ112x112 function div(uq112x112 memory self, uint112 x) internal pure returns (uq112x112 memory) { require(x != 0, 'FixedPoint: DIV_BY_ZERO'); return uq112x112(self._x / uint224(x)); } // multiply a UQ112x112 by a uint, returning a UQ144x112 // reverts on overflow function mul(uq112x112 memory self, uint y) internal pure returns (uq144x112 memory) { uint z; require(y == 0 || (z = uint(self._x) * y) / y == uint(self._x), "FixedPoint: MULTIPLICATION_OVERFLOW"); return uq144x112(z); } // returns a UQ112x112 which represents the ratio of the numerator to the denominator // equivalent to encode(numerator).div(denominator) function fraction(uint112 numerator, uint112 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, "FixedPoint: DIV_BY_ZERO"); return uq112x112((uint224(numerator) << RESOLUTION) / denominator); } // decode a UQ112x112 into a uint112 by truncating after the radix point function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } // decode a UQ144x112 into a uint144 by truncating after the radix point function decode144(uq144x112 memory self) internal pure returns (uint144) { return uint144(self._x >> RESOLUTION); } // take the reciprocal of a UQ112x112 function reciprocal(uq112x112 memory self) internal pure returns (uq112x112 memory) { require(self._x != 0, 'FixedPoint: ZERO_RECIPROCAL'); return uq112x112(uint224(Q224 / self._x)); } // square root of a UQ112x112 function sqrt(uq112x112 memory self) internal pure returns (uq112x112 memory) { return uq112x112(uint224(Babylonian.sqrt(uint256(self._x)) << 56)); } } // File: contracts/external/uniswap/oracleLibrary.sol pragma solidity >=0.5.0; // library with helper methods for oracles that are concerned with computing average prices library UniswapV2OracleLibrary { using FixedPoint for *; // helper function that returns the current block timestamp within the range of uint32, i.e. [0, 2**32 - 1] function currentBlockTimestamp() internal view returns (uint32) { return uint32(block.timestamp % 2 ** 32); } // produces the cumulative price using counterfactuals to save gas and avoid a call to sync. function currentCumulativePrices( address pair ) internal view returns (uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp) { blockTimestamp = currentBlockTimestamp(); price0Cumulative = IUniswapV2Pair(pair).price0CumulativeLast(); price1Cumulative = IUniswapV2Pair(pair).price1CumulativeLast(); // if time has elapsed since the last update on the pair, mock the accumulated price values (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) = IUniswapV2Pair(pair).getReserves(); if (blockTimestampLast != blockTimestamp) { // subtraction overflow is desired uint32 timeElapsed = blockTimestamp - blockTimestampLast; // addition overflow is desired // counterfactual price0Cumulative += uint(FixedPoint.fraction(reserve1, reserve0)._x) * timeElapsed; // counterfactual price1Cumulative += uint(FixedPoint.fraction(reserve0, reserve1)._x) * timeElapsed; } } } // File: contracts/external/openzeppelin-solidity/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // 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; } } library SafeMath64 { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint64 a, uint64 b) internal pure returns (uint64) { uint64 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(uint64 a, uint64 b) internal pure returns (uint64) { require(b <= a, "SafeMath: subtraction overflow"); uint64 c = a - b; return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint64 a, uint64 b, string memory errorMessage) internal pure returns (uint64) { require(b <= a, errorMessage); uint64 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(uint64 a, uint64 b) internal pure returns (uint64) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint64 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(uint64 a, uint64 b) internal pure returns (uint64) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint64 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(uint64 a, uint64 b) internal pure returns (uint64) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } // File: contracts/external/proxy/Proxy.sol pragma solidity 0.5.7; /** * @title Proxy * @dev Gives the possibility to delegate any call to a foreign implementation. */ contract Proxy { /** * @dev Fallback function allowing to perform a delegatecall to the given implementation. * This function will return whatever the implementation call returns */ function () external payable { address _impl = implementation(); require(_impl != address(0)); assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize) let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0) let size := returndatasize returndatacopy(ptr, 0, size) switch result case 0 { revert(ptr, size) } default { return(ptr, size) } } } /** * @dev Tells the address of the implementation where every call will be delegated. * @return address of the implementation to which it will be delegated */ function implementation() public view returns (address); } // File: contracts/external/proxy/UpgradeabilityProxy.sol pragma solidity 0.5.7; /** * @title UpgradeabilityProxy * @dev This contract represents a proxy where the implementation address to which it will delegate can be upgraded */ contract UpgradeabilityProxy is Proxy { /** * @dev This event will be emitted every time the implementation gets upgraded * @param implementation representing the address of the upgraded implementation */ event Upgraded(address indexed implementation); // Storage position of the address of the current implementation bytes32 private constant IMPLEMENTATION_POSITION = keccak256("org.govblocks.proxy.implementation"); /** * @dev Constructor function */ constructor() public {} /** * @dev Tells the address of the current implementation * @return address of the current implementation */ function implementation() public view returns (address impl) { bytes32 position = IMPLEMENTATION_POSITION; assembly { impl := sload(position) } } /** * @dev Sets the address of the current implementation * @param _newImplementation address representing the new implementation to be set */ function _setImplementation(address _newImplementation) internal { bytes32 position = IMPLEMENTATION_POSITION; assembly { sstore(position, _newImplementation) } } /** * @dev Upgrades the implementation address * @param _newImplementation representing the address of the new implementation to be set */ function _upgradeTo(address _newImplementation) internal { address currentImplementation = implementation(); require(currentImplementation != _newImplementation); _setImplementation(_newImplementation); emit Upgraded(_newImplementation); } } // File: contracts/external/proxy/OwnedUpgradeabilityProxy.sol pragma solidity 0.5.7; /** * @title OwnedUpgradeabilityProxy * @dev This contract combines an upgradeability proxy with basic authorization control functionalities */ contract OwnedUpgradeabilityProxy is UpgradeabilityProxy { /** * @dev Event to show ownership has been transferred * @param previousOwner representing the address of the previous owner * @param newOwner representing the address of the new owner */ event ProxyOwnershipTransferred(address previousOwner, address newOwner); // Storage position of the owner of the contract bytes32 private constant PROXY_OWNER_POSITION = keccak256("org.govblocks.proxy.owner"); /** * @dev the constructor sets the original owner of the contract to the sender account. */ constructor(address _implementation) public { _setUpgradeabilityOwner(msg.sender); _upgradeTo(_implementation); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyProxyOwner() { require(msg.sender == proxyOwner()); _; } /** * @dev Tells the address of the owner * @return the address of the owner */ function proxyOwner() public view returns (address owner) { bytes32 position = PROXY_OWNER_POSITION; assembly { owner := sload(position) } } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferProxyOwnership(address _newOwner) public onlyProxyOwner { require(_newOwner != address(0)); _setUpgradeabilityOwner(_newOwner); emit ProxyOwnershipTransferred(proxyOwner(), _newOwner); } /** * @dev Allows the proxy owner to upgrade the current version of the proxy. * @param _implementation representing the address of the new implementation to be set. */ function upgradeTo(address _implementation) public onlyProxyOwner { _upgradeTo(_implementation); } /** * @dev Sets the address of the owner */ function _setUpgradeabilityOwner(address _newProxyOwner) internal { bytes32 position = PROXY_OWNER_POSITION; assembly { sstore(position, _newProxyOwner) } } } // File: contracts/interfaces/ITokenController.sol pragma solidity 0.5.7; contract ITokenController { address public token; address public bLOTToken; /** * @dev Swap BLOT token. * account. * @param amount The amount that will be swapped. */ function swapBLOT(address _of, address _to, uint256 amount) public; function totalBalanceOf(address _of) public view returns (uint256 amount); function transferFrom(address _token, address _of, address _to, uint256 amount) public; /** * @dev Returns tokens locked for a specified address for a * specified reason at a specific time * @param _of The address whose tokens are locked * @param _reason The reason to query the lock tokens for * @param _time The timestamp to query the lock tokens for */ function tokensLockedAtTime(address _of, bytes32 _reason, uint256 _time) public view returns (uint256 amount); /** * @dev burns an amount of the tokens of the message sender * account. * @param amount The amount that will be burnt. */ function burnCommissionTokens(uint256 amount) external returns(bool); function initiateVesting(address _vesting) external; function lockForGovernanceVote(address _of, uint _days) public; function totalSupply() public view returns (uint256); function mint(address _member, uint _amount) public; } // File: contracts/interfaces/IMarketRegistry.sol pragma solidity 0.5.7; contract IMarketRegistry { enum MarketType { HourlyMarket, DailyMarket, WeeklyMarket } address public owner; address public tokenController; address public marketUtility; bool public marketCreationPaused; mapping(address => bool) public isMarket; function() external payable{} function marketDisputeStatus(address _marketAddress) public view returns(uint _status); function burnDisputedProposalTokens(uint _proposaId) external; function isWhitelistedSponsor(address _address) public view returns(bool); function transferAssets(address _asset, address _to, uint _amount) external; /** * @dev Initialize the PlotX. * @param _marketConfig The address of market config. * @param _plotToken The address of PLOT token. */ function initiate(address _defaultAddress, address _marketConfig, address _plotToken, address payable[] memory _configParams) public; /** * @dev Create proposal if user wants to raise the dispute. * @param proposalTitle The title of proposal created by user. * @param description The description of dispute. * @param solutionHash The ipfs solution hash. * @param actionHash The action hash for solution. * @param stakeForDispute The token staked to raise the diospute. * @param user The address who raises the dispute. */ function createGovernanceProposal(string memory proposalTitle, string memory description, string memory solutionHash, bytes memory actionHash, uint256 stakeForDispute, address user, uint256 ethSentToPool, uint256 tokenSentToPool, uint256 proposedValue) public { } /** * @dev Emits the PlacePrediction event and sets user data. * @param _user The address who placed prediction. * @param _value The amount of ether user staked. * @param _predictionPoints The positions user will get. * @param _predictionAsset The prediction assets user will get. * @param _prediction The option range on which user placed prediction. * @param _leverage The leverage selected by user at the time of place prediction. */ function setUserGlobalPredictionData(address _user,uint _value, uint _predictionPoints, address _predictionAsset, uint _prediction,uint _leverage) public{ } /** * @dev Emits the claimed event. * @param _user The address who claim their reward. * @param _reward The reward which is claimed by user. * @param incentives The incentives of user. * @param incentiveToken The incentive tokens of user. */ function callClaimedEvent(address _user , uint[] memory _reward, address[] memory predictionAssets, uint incentives, address incentiveToken) public { } /** * @dev Emits the MarketResult event. * @param _totalReward The amount of reward to be distribute. * @param _winningOption The winning option of the market. * @param _closeValue The closing value of the market currency. */ function callMarketResultEvent(uint[] memory _totalReward, uint _winningOption, uint _closeValue, uint roundId) public { } } // File: contracts/interfaces/IChainLinkOracle.sol pragma solidity 0.5.7; interface IChainLinkOracle { /** * @dev Gets the latest answer of chainLink oracle. * @return int256 representing the latest answer of chainLink oracle. */ function latestAnswer() external view returns (int256); function decimals() external view returns (uint8); function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } // File: contracts/interfaces/IToken.sol pragma solidity 0.5.7; contract IToken { function decimals() external view returns(uint8); /** * @dev Total number of tokens in existence */ function totalSupply() external view returns (uint256); /** * @dev Gets the balance of the specified address. * @param account The address to query the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address account) external view returns (uint256); /** * @dev Transfer token for a specified address * @param recipient The address to transfer to. * @param amount The amount to be transferred. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev function that mints an amount of the token and assigns it to * an account. * @param account The account that will receive the created tokens. * @param amount The amount that will be created. */ function mint(address account, uint256 amount) external returns (bool); /** * @dev burns an amount of the tokens of the message sender * account. * @param amount The amount that will be burnt. */ function burn(uint256 amount) external; /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * Returns a boolean value indicating whether the operation succeeded. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Transfer tokens from one address to another * @param sender address The address which you want to send tokens from * @param recipient address The address which you want to transfer to * @param amount uint256 the amount of tokens to be transferred */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); } // File: contracts/MarketUtility.sol /* Copyright (C) 2020 PlotX.io This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ */ pragma solidity 0.5.7; contract MarketUtility { using SafeMath for uint256; using FixedPoint for *; address constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; uint256 constant updatePeriod = 1 hours; uint256 internal STAKE_WEIGHTAGE; uint256 internal STAKE_WEIGHTAGE_MIN_AMOUNT; uint256 internal minTimeElapsedDivisor; uint256 internal minPredictionAmount; uint256 internal maxPredictionAmount; uint256 internal positionDecimals; uint256 internal minStakeForMultiplier; uint256 internal riskPercentage; uint256 internal tokenStakeForDispute; address internal plotToken; address internal plotETHpair; address internal weth; address internal initiater; address public authorizedAddress; bool public initialized; struct UniswapPriceData { FixedPoint.uq112x112 price0Average; uint256 price0CumulativeLast; FixedPoint.uq112x112 price1Average; uint256 price1CumulativeLast; uint32 blockTimestampLast; bool initialized; } mapping(address => UniswapPriceData) internal uniswapPairData; IUniswapV2Factory uniswapFactory; ITokenController internal tokenController; modifier onlyAuthorized() { require(msg.sender == authorizedAddress, "Not authorized"); _; } /** * @dev Initiates the config contact with initial values **/ function initialize(address payable[] memory _addressParams, address _initiater) public { OwnedUpgradeabilityProxy proxy = OwnedUpgradeabilityProxy( address(uint160(address(this))) ); require(msg.sender == proxy.proxyOwner(), "Sender is not proxy owner."); require(!initialized, "Already initialized"); initialized = true; _setInitialParameters(); authorizedAddress = msg.sender; tokenController = ITokenController(IMarketRegistry(msg.sender).tokenController()); plotToken = _addressParams[1]; initiater = _initiater; weth = IUniswapV2Router02(_addressParams[0]).WETH(); uniswapFactory = IUniswapV2Factory(_addressParams[2]); } /** * @dev Internal function to set initial value **/ function _setInitialParameters() internal { STAKE_WEIGHTAGE = 40; // STAKE_WEIGHTAGE_MIN_AMOUNT = 20 ether; minTimeElapsedDivisor = 6; minPredictionAmount = 1e15; maxPredictionAmount = 28 ether; positionDecimals = 1e2; minStakeForMultiplier = 5e17; riskPercentage = 20; tokenStakeForDispute = 500 ether; } /** * @dev Check if user gets any multiplier on his positions * @param _asset The assets uses by user during prediction. * @param _predictionStake The amount staked by user at the time of prediction. * @param predictionPoints The actual positions user got during prediction. * @param _stakeValue The stake value of asset. * @return uint256 representing multiplied positions */ function checkMultiplier(address _asset, address _user, uint _predictionStake, uint predictionPoints, uint _stakeValue) public view returns(uint, bool) { bool multiplierApplied; uint _stakedBalance = tokenController.tokensLockedAtTime(_user, "SM", now); uint _predictionValueInToken; (, _predictionValueInToken) = getValueAndMultiplierParameters(_asset, _predictionStake); if(_stakeValue < minStakeForMultiplier) { return (predictionPoints,multiplierApplied); } uint _muliplier = 100; if(_stakedBalance.div(_predictionValueInToken) > 0) { _muliplier = _muliplier + _stakedBalance.mul(100).div(_predictionValueInToken.mul(10)); multiplierApplied = true; } return (predictionPoints.mul(_muliplier).div(100),multiplierApplied); } /** * @dev Updates integer parameters of config **/ function updateUintParameters(bytes8 code, uint256 value) external onlyAuthorized { if (code == "SW") { // Stake weightage require(value <= 100, "Value must be less or equal to 100"); STAKE_WEIGHTAGE = value; } else if (code == "SWMA") { // Minimum amount required for stake weightage STAKE_WEIGHTAGE_MIN_AMOUNT = value; } else if (code == "MTED") { // Minimum time elapsed divisor minTimeElapsedDivisor = value; } else if (code == "MINPRD") { // Minimum predictionamount minPredictionAmount = value; } else if (code == "MAXPRD") { // Minimum predictionamount maxPredictionAmount = value; } else if (code == "PDEC") { // Position's Decimals positionDecimals = value; } else if (code == "MINSTM") { // Min stake required for applying multiplier minStakeForMultiplier = value; } else if (code == "RPERC") { // Risk percentage riskPercentage = value; } else if (code == "TSDISP") { // Amount of tokens to be staked for raising a dispute tokenStakeForDispute = value; } else { revert("Invalid code"); } } /** * @dev Updates address parameters of config **/ function updateAddressParameters(bytes8 code, address payable value) external onlyAuthorized { require(value != address(0), "Value cannot be address(0)"); if (code == "UNIFAC") { // Uniswap factory address uniswapFactory = IUniswapV2Factory(value); plotETHpair = uniswapFactory.getPair(plotToken, weth); } else { revert("Invalid code"); } } /** * @dev Update cumulative price of token in uniswap **/ function update() external onlyAuthorized { require(plotETHpair != address(0), "Uniswap pair not set"); UniswapPriceData storage _priceData = uniswapPairData[plotETHpair]; ( uint256 price0Cumulative, uint256 price1Cumulative, uint32 blockTimestamp ) = UniswapV2OracleLibrary.currentCumulativePrices(plotETHpair); uint32 timeElapsed = blockTimestamp - _priceData.blockTimestampLast; // overflow is desired if (timeElapsed >= updatePeriod || !_priceData.initialized) { // overflow is desired, casting never truncates // cumulative price is in (uq112x112 price * seconds) units so we simply wrap it after division by time elapsed _priceData.price0Average = FixedPoint.uq112x112( uint224( (price0Cumulative - _priceData.price0CumulativeLast) / timeElapsed ) ); _priceData.price1Average = FixedPoint.uq112x112( uint224( (price1Cumulative - _priceData.price1CumulativeLast) / timeElapsed ) ); _priceData.price0CumulativeLast = price0Cumulative; _priceData.price1CumulativeLast = price1Cumulative; _priceData.blockTimestampLast = blockTimestamp; if(!_priceData.initialized) { _priceData.initialized = true; } } } /** * @dev Set initial PLOT/ETH pair cummulative price **/ function setInitialCummulativePrice() public { require(msg.sender == initiater); require(plotETHpair == address(0),"Already initialised"); plotETHpair = uniswapFactory.getPair(plotToken, weth); UniswapPriceData storage _priceData = uniswapPairData[plotETHpair]; ( uint256 price0Cumulative, uint256 price1Cumulative, uint32 blockTimestamp ) = UniswapV2OracleLibrary.currentCumulativePrices(plotETHpair); _priceData.price0CumulativeLast = price0Cumulative; _priceData.price1CumulativeLast = price1Cumulative; _priceData.blockTimestampLast = blockTimestamp; } /** * @dev Get decimals of given price feed address */ function getPriceFeedDecimals(address _priceFeed) public view returns(uint8) { return IChainLinkOracle(_priceFeed).decimals(); } /** * @dev Get basic market details * @return Minimum amount required to predict in market * @return Percentage of users leveraged amount to deduct when placed in wrong prediction * @return Decimal points for prediction positions * @return Maximum prediction amount **/ function getBasicMarketDetails() public view returns ( uint256, uint256, uint256, uint256 ) { return (minPredictionAmount, riskPercentage, positionDecimals, maxPredictionAmount); } /** * @dev Get Parameter required for option price calculation * @param _marketFeedAddress Feed Address of currency on which market options are based on * @return Stake weightage percentage for calculation option price * @return minimum amount of stake required to consider stake weightage * @return Current price of the market currency * @return Divisor to calculate minimum time elapsed for a market type **/ function getPriceCalculationParams( address _marketFeedAddress ) public view returns ( uint256, uint256, uint256, uint256 ) { uint256 _currencyPrice = getAssetPriceUSD( _marketFeedAddress ); return ( STAKE_WEIGHTAGE, STAKE_WEIGHTAGE_MIN_AMOUNT, _currencyPrice, minTimeElapsedDivisor ); } /** * @dev Get price of provided feed address * @param _currencyFeedAddress Feed Address of currency on which market options are based on * @return Current price of the market currency **/ function getAssetPriceUSD( address _currencyFeedAddress ) public view returns (uint256 latestAnswer) { return uint256(IChainLinkOracle(_currencyFeedAddress).latestAnswer()); } /** * @dev Get price of provided feed address * @param _currencyFeedAddress Feed Address of currency on which market options are based on * @return Current price of the market currency **/ function getSettlemetPrice( address _currencyFeedAddress, uint256 _settleTime ) public view returns (uint256 latestAnswer, uint256 roundId) { uint80 currentRoundId; uint256 currentRoundTime; int256 currentRoundAnswer; (currentRoundId, currentRoundAnswer, , currentRoundTime, )= IChainLinkOracle(_currencyFeedAddress).latestRoundData(); while(currentRoundTime > _settleTime) { currentRoundId--; (currentRoundId, currentRoundAnswer, , currentRoundTime, )= IChainLinkOracle(_currencyFeedAddress).getRoundData(currentRoundId); if(currentRoundTime <= _settleTime) { break; } } return (uint256(currentRoundAnswer), currentRoundId); } /** * @dev Get value of provided currency address in ETH * @param _currencyAddress Address of currency * @param _amount Amount of provided currency * @return Value of provided amount in ETH **/ function getAssetValueETH(address _currencyAddress, uint256 _amount) public view returns (uint256 tokenEthValue) { tokenEthValue = _amount; if (_currencyAddress != ETH_ADDRESS) { tokenEthValue = getPrice(plotETHpair, _amount); } } /** * @dev Get price of provided currency address in ETH * @param _currencyAddress Address of currency * @return Price of provided currency in ETH * @return Decimals of the currency **/ function getAssetPriceInETH(address _currencyAddress) public view returns (uint256 tokenEthValue, uint256 decimals) { tokenEthValue = 1; if (_currencyAddress != ETH_ADDRESS) { decimals = IToken(_currencyAddress).decimals(); tokenEthValue = getPrice(plotETHpair, 10**decimals); } } /** * @dev Get amount of stake required to raise a dispute **/ function getDisputeResolutionParams() public view returns (uint256) { return tokenStakeForDispute; } /** * @dev Get value of _asset in PLOT token and multiplier parameters * @param _asset Address of asset for which value is requested * @param _amount Amount of _asset * @return min prediction amount required for multiplier * @return value of given asset in PLOT tokens **/ function getValueAndMultiplierParameters(address _asset, uint256 _amount) public view returns (uint256, uint256) { uint256 _value = _amount; if (_asset == ETH_ADDRESS) { _value = (uniswapPairData[plotETHpair].price1Average) .mul(_amount) .decode144(); } return (minStakeForMultiplier, _value); } /** * @dev Get Market feed address * @return Uniswap factory address **/ function getFeedAddresses() public view returns (address) { return (address(uniswapFactory)); } /** * @dev Get value of token in pair **/ function getPrice(address pair, uint256 amountIn) public view returns (uint256 amountOut) { amountOut = (uniswapPairData[pair].price0Average) .mul(amountIn) .decode144(); } /** * @dev function to calculate square root of a number */ function sqrt(uint x) internal pure returns (uint y) { uint z = (x + 1) / 2; y = x; while (z < y) { y = z; z = (x / z + z) / 2; } } /** * @dev Calculate the prediction value, passing all the required params * params index * 0 _prediction * 1 neutralMinValue * 2 neutralMaxValue * 3 startTime * 4 expireTime * 5 totalStakedETH * 6 totalStakedToken * 7 ethStakedOnOption * 8 plotStakedOnOption * 9 _stake * 10 _leverage */ function calculatePredictionValue(uint[] memory params, address asset, address user, address marketFeedAddress, bool _checkMultiplier) public view returns(uint _predictionValue, bool _multiplierApplied) { uint _stakeValue = getAssetValueETH(asset, params[9]); if(_stakeValue < minPredictionAmount || _stakeValue > maxPredictionAmount) { return (_predictionValue, _multiplierApplied); } uint optionPrice; optionPrice = calculateOptionPrice(params, marketFeedAddress); _predictionValue = _calculatePredictionPoints(_stakeValue.mul(positionDecimals), optionPrice, params[10]); if(_checkMultiplier) { return checkMultiplier(asset, user, params[9], _predictionValue, _stakeValue); } return (_predictionValue, _multiplierApplied); } function _calculatePredictionPoints(uint value, uint optionPrice, uint _leverage) internal pure returns(uint) { //leverageMultiplier = levergage + (leverage -1)*0.05; Raised by 3 decimals i.e 1000 uint leverageMultiplier = 1000 + (_leverage-1)*50; value = value.mul(2500).div(1e18); // (amount*sqrt(amount*100)*leverage*100/(price*10*125000/1000)); return value.mul(sqrt(value.mul(10000))).mul(_leverage*100*leverageMultiplier).div(optionPrice.mul(1250000000)); } /** * @dev Calculate the option price for given params * params * 0 _option * 1 neutralMinValue * 2 neutralMaxValue * 3 startTime * 4 expireTime * 5 totalStakedETH * 6 totalStakedToken * 7 ethStakedOnOption * 8 plotStakedOnOption */ function calculateOptionPrice(uint[] memory params, address marketFeedAddress) public view returns(uint _optionPrice) { uint _totalStaked = params[5].add(getAssetValueETH(plotToken, params[6])); uint _assetStakedOnOption = params[7] .add( (getAssetValueETH(plotToken, params[8]))); _optionPrice = 0; uint currentPriceOption = 0; uint256 currentPrice = getAssetPriceUSD( marketFeedAddress ); uint stakeWeightage = STAKE_WEIGHTAGE; uint predictionWeightage = 100 - stakeWeightage; uint predictionTime = params[4].sub(params[3]); uint minTimeElapsed = (predictionTime).div(minTimeElapsedDivisor); if(now > params[4]) { return 0; } if(_totalStaked > STAKE_WEIGHTAGE_MIN_AMOUNT) { _optionPrice = (_assetStakedOnOption).mul(1000000).div(_totalStaked.mul(stakeWeightage)); } uint maxDistance; if(currentPrice < params[1]) { currentPriceOption = 1; maxDistance = 2; } else if(currentPrice > params[2]) { currentPriceOption = 3; maxDistance = 2; } else { currentPriceOption = 2; maxDistance = 1; } uint distance = _getAbsoluteDifference(currentPriceOption, params[0]); uint timeElapsed = now > params[3] ? now.sub(params[3]) : 0; timeElapsed = timeElapsed > minTimeElapsed ? timeElapsed: minTimeElapsed; _optionPrice = _optionPrice.add((((maxDistance+1).sub(distance)).mul(1000000).mul(timeElapsed)).div((maxDistance+1).mul(predictionWeightage).mul(predictionTime))); _optionPrice = _optionPrice.div(100); } /** * @dev Internal function to get the absolute difference of two values */ function _getAbsoluteDifference(uint value1, uint value2) internal pure returns(uint) { return value1 > value2 ? value1.sub(value2) : value2.sub(value1); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"_marketFeedAddress","type":"address"}],"name":"getPriceCalculationParams","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDisputeResolutionParams","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_asset","type":"address"},{"name":"_user","type":"address"},{"name":"_predictionStake","type":"uint256"},{"name":"predictionPoints","type":"uint256"},{"name":"_stakeValue","type":"uint256"}],"name":"checkMultiplier","outputs":[{"name":"","type":"uint256"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"pair","type":"address"},{"name":"amountIn","type":"uint256"}],"name":"getPrice","outputs":[{"name":"amountOut","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addressParams","type":"address[]"},{"name":"_initiater","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_currencyAddress","type":"address"},{"name":"_amount","type":"uint256"}],"name":"getAssetValueETH","outputs":[{"name":"tokenEthValue","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"params","type":"uint256[]"},{"name":"marketFeedAddress","type":"address"}],"name":"calculateOptionPrice","outputs":[{"name":"_optionPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"authorizedAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFeedAddresses","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_priceFeed","type":"address"}],"name":"getPriceFeedDecimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"params","type":"uint256[]"},{"name":"asset","type":"address"},{"name":"user","type":"address"},{"name":"marketFeedAddress","type":"address"},{"name":"_checkMultiplier","type":"bool"}],"name":"calculatePredictionValue","outputs":[{"name":"_predictionValue","type":"uint256"},{"name":"_multiplierApplied","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"code","type":"bytes8"},{"name":"value","type":"uint256"}],"name":"updateUintParameters","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setInitialCummulativePrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_currencyFeedAddress","type":"address"}],"name":"getAssetPriceUSD","outputs":[{"name":"latestAnswer","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_asset","type":"address"},{"name":"_amount","type":"uint256"}],"name":"getValueAndMultiplierParameters","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"code","type":"bytes8"},{"name":"value","type":"address"}],"name":"updateAddressParameters","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getBasicMarketDetails","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_currencyAddress","type":"address"}],"name":"getAssetPriceInETH","outputs":[{"name":"tokenEthValue","type":"uint256"},{"name":"decimals","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_currencyFeedAddress","type":"address"},{"name":"_settleTime","type":"uint256"}],"name":"getSettlemetPrice","outputs":[{"name":"latestAnswer","type":"uint256"},{"name":"roundId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612007806100206000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80638c8557d9116100b8578063a7343f401161007c578063a7343f4014610534578063ad2cd2661461055a578063ad4cc43e1461059f578063bfed95b8146105d5578063ecb22803146105dd578063f0a5702f1461060357610137565b80638c8557d9146103f757806398d57d21146104335780639dd86e0f146104f7578063a1dc272614610524578063a2e620451461052c57610137565b8063462d0b2e116100ff578063462d0b2e146102455780634a5f1d70146102f3578063504e87511461031f5780635539d400146103cb578063797c7480146103ef57610137565b806305a7daf71461013c578063094f81f814610188578063158ef93e146101a2578063296644b9146101be578063449e815d14610219575b600080fd5b6101626004803603602081101561015257600080fd5b50356001600160a01b031661062f565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610190610659565b60408051918252519081900360200190f35b6101aa61065f565b604080519115158252519081900360200190f35b610200600480360360a08110156101d457600080fd5b506001600160a01b0381358116916020810135909116906040810135906060810135906080013561066f565b6040805192835290151560208301528051918290030190f35b6101906004803603604081101561022f57600080fd5b506001600160a01b0381351690602001356107ac565b6102f16004803603604081101561025b57600080fd5b810190602081018135600160201b81111561027557600080fd5b82018360208201111561028757600080fd5b803590602001918460208302840111600160201b831117156102a857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505090356001600160a01b031691506108049050565b005b6101906004803603604081101561030957600080fd5b506001600160a01b038135169060200135610b17565b6101906004803603604081101561033557600080fd5b810190602081018135600160201b81111561034f57600080fd5b82018360208201111561036157600080fd5b803590602001918460208302840111600160201b8311171561038257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505090356001600160a01b03169150610b5b9050565b6103d3610e1b565b604080516001600160a01b039092168252519081900360200190f35b6103d3610e2a565b61041d6004803603602081101561040d57600080fd5b50356001600160a01b0316610e39565b6040805160ff9092168252519081900360200190f35b610200600480360360a081101561044957600080fd5b810190602081018135600160201b81111561046357600080fd5b82018360208201111561047557600080fd5b803590602001918460208302840111600160201b8311171561049657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550506001600160a01b038335811694506020840135811693604081013590911692506060013515159050610ea6565b6102f16004803603604081101561050d57600080fd5b506001600160c01b03198135169060200135610f5b565b6102f16111a5565b6102f1611310565b6101906004803603602081101561054a57600080fd5b50356001600160a01b031661150a565b6105866004803603604081101561057057600080fd5b506001600160a01b038135169060200135611545565b6040805192835260208301919091528051918290030190f35b6102f1600480360360408110156105b557600080fd5b5080356001600160c01b03191690602001356001600160a01b03166115d2565b610162611768565b610586600480360360208110156105f357600080fd5b50356001600160a01b031661177a565b6105866004803603604081101561061957600080fd5b506001600160a01b038135169060200135611830565b60008060008060006106408661150a565b6000546001546002549199909850919650945092505050565b60085490565b600d54600160a01b900460ff1681565b60105460408051600160e01b63179e91f10281526001600160a01b038781166004830152600160f01b61534d0260248301524260448301529151600093849384938493919092169163179e91f1916064808301926020929190829003018186803b1580156106dc57600080fd5b505afa1580156106f0573d6000803e3d6000fd5b505050506040513d602081101561070657600080fd5b5051905060006107168a89611545565b6006549092508710159050610733578683945094505050506107a2565b60646000610747848463ffffffff61197d16565b11156107845761077e61076183600a63ffffffff6119ea16565b61077285606463ffffffff6119ea16565b9063ffffffff61197d16565b60019450015b61079960646107728a8463ffffffff6119ea16565b95509293505050505b9550959350505050565b6001600160a01b0382166000908152600e602090815260408083208151928301909152546001600160e01b031681526107f4906107ef908463ffffffff611a4616565b611ac7565b6001600160901b03169392505050565b6000309050806001600160a01b031663025313a26040518163ffffffff1660e01b815260040160206040518083038186803b15801561084257600080fd5b505afa158015610856573d6000803e3d6000fd5b505050506040513d602081101561086c57600080fd5b50516001600160a01b031633146108cd5760408051600160e51b62461bcd02815260206004820152601a60248201527f53656e646572206973206e6f742070726f7879206f776e65722e000000000000604482015290519081900360640190fd5b600d54600160a01b900460ff161561092f5760408051600160e51b62461bcd02815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b600d805474ff00000000000000000000000000000000000000001916600160a01b17905561095b611ace565b600d80546001600160a01b0319163390811790915560408051600160e11b6376eecec1028152905163eddd9d8291600480820192602092909190829003018186803b1580156109a957600080fd5b505afa1580156109bd573d6000803e3d6000fd5b505050506040513d60208110156109d357600080fd5b5051601080546001600160a01b0319166001600160a01b03909216919091179055825183906001908110610a0357fe5b6020908102919091010151600980546001600160a01b03199081166001600160a01b0393841617909155600c805490911691841691909117905582518390600090610a4a57fe5b60200260200101516001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8a57600080fd5b505afa158015610a9e573d6000803e3d6000fd5b505050506040513d6020811015610ab457600080fd5b5051600b80546001600160a01b0319166001600160a01b03909216919091179055825183906002908110610ae457fe5b6020026020010151600f60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b806001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610b5557600a54610b52906001600160a01b0316836107ac565b90505b92915050565b600080610bb7610b94600960009054906101000a90046001600160a01b031686600681518110610b8757fe5b6020026020010151610b17565b85600581518110610ba157fe5b6020026020010151611b2390919063ffffffff16565b90506000610bf1610be4600960009054906101000a90046001600160a01b031687600881518110610b8757fe5b86600781518110610ba157fe5b6000935090508280610c028661150a565b905060008054905060008160640390506000610c4f8a600381518110610c2457fe5b60200260200101518b600481518110610c3957fe5b6020026020010151611b8090919063ffffffff16565b90506000610c686002548361197d90919063ffffffff16565b90508a600481518110610c7757fe5b6020026020010151421115610c9757600098505050505050505050610b55565b600154881115610cca57610cc7610cb4898663ffffffff6119ea16565b61077289620f424063ffffffff6119ea16565b98505b60008b600181518110610cd957fe5b6020026020010151861015610cf45750600195506002610d24565b8b600281518110610d0157fe5b6020026020010151861115610d1c5750600395506002610d24565b506002955060015b6000610d44888e600081518110610d3757fe5b6020026020010151611be0565b905060008d600381518110610d5557fe5b60200260200101514211610d6a576000610d91565b610d918e600381518110610d7a57fe5b602002602001015142611b8090919063ffffffff16565b9050838111610da05783610da2565b805b9050610df6610de9610dcd87610dc1600188018b63ffffffff6119ea16565b9063ffffffff6119ea16565b61077284610dc1620f42408160018b018a63ffffffff611b8016565b8d9063ffffffff611b2316565b9b50610e098c606463ffffffff61197d16565b9e9d5050505050505050505050505050565b600d546001600160a01b031681565b600f546001600160a01b031690565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7457600080fd5b505afa158015610e88573d6000803e3d6000fd5b505050506040513d6020811015610e9e57600080fd5b505192915050565b6000806000610ebc8789600981518110610b8757fe5b9050600354811080610ecf575060045481115b15610eda57506107a2565b6000610ee68987610b5b565b9050610f1b610f00600554846119ea90919063ffffffff16565b828b600a81518110610f0e57fe5b6020026020010151611c0e565b93508415610f4f57610f4488888b600981518110610f3557fe5b6020026020010151878661066f565b9350935050506107a2565b50509550959350505050565b600d546001600160a01b03163314610fb15760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b600160f01b615357026001600160c01b03198316141561101857606481111561100e57604051600160e51b62461bcd028152600401808060200182810382526022815260200180611fba6022913960400191505060405180910390fd5b60008190556111a1565b600160e01b6353574d41026001600160c01b03198316141561103e5760018190556111a1565b600160e21b6313551151026001600160c01b0319831614156110645760028190556111a1565b600160d21b65135253941491026001600160c01b03198316141561108c5760038190556111a1565b600160d21b65135056141491026001600160c01b0319831614156110b45760048190556111a1565b600160e01b6350444543026001600160c01b0319831614156110da5760058190556111a1565b600160d01b654d494e53544d026001600160c01b0319831614156111025760068190556111a1565b600160d81b645250455243026001600160c01b0319831614156111295760078190556111a1565b600160d41b65054534449535026001600160c01b0319831614156111515760088190556111a1565b60408051600160e51b62461bcd02815260206004820152600c60248201527f496e76616c696420636f64650000000000000000000000000000000000000000604482015290519081900360640190fd5b5050565b600c546001600160a01b031633146111bc57600080fd5b600a546001600160a01b03161561121d5760408051600160e51b62461bcd02815260206004820152601360248201527f416c726561647920696e697469616c6973656400000000000000000000000000604482015290519081900360640190fd5b600f54600954600b5460408051600160e01b63e6a439050281526001600160a01b039384166004820152918316602483015251919092169163e6a43905916044808301926020929190829003018186803b15801561127a57600080fd5b505afa15801561128e573d6000803e3d6000fd5b505050506040513d60208110156112a457600080fd5b5051600a80546001600160a01b0319166001600160a01b039283161790819055166000818152600e6020526040812091819081906112e190611c8f565b600187019290925560038601556004909401805463ffffffff191663ffffffff90951694909417909355505050565b600d546001600160a01b031633146113665760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b600a546001600160a01b03166113c65760408051600160e51b62461bcd02815260206004820152601460248201527f556e69737761702070616972206e6f7420736574000000000000000000000000604482015290519081900360640190fd5b600a546001600160a01b03166000818152600e6020526040812091819081906113ee90611c8f565b6004870154929550909350915063ffffffff908116820390610e1090821610158061142557506004850154600160201b900460ff16155b156115035760405180602001604052808263ffffffff16876001015487038161144a57fe5b046001600160e01b03908116909152905186546001600160e01b031916911617855560408051602081019091526003860154819063ffffffff84169086038161148f57fe5b046001600160e01b0390811690915290516002870180546001600160e01b03191691909216179055600185018490556003850183905560048501805463ffffffff191663ffffffff84161790819055600160201b900460ff166115035760048501805464ff000000001916600160201b1790555b5050505050565b6000816001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7457600080fd5b600080826001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156115c557600a546001600160a01b03166000908152600e602090815260409182902082519182019092526002909101546001600160e01b031681526115b9906107ef908663ffffffff611a4616565b6001600160901b031690505b6006549590945092505050565b600d546001600160a01b031633146116285760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b6001600160a01b0381166116865760408051600160e51b62461bcd02815260206004820152601a60248201527f56616c75652063616e6e6f742062652061646472657373283029000000000000604482015290519081900360640190fd5b600160d01b65554e49464143026001600160c01b03198316141561115157600f80546001600160a01b0319166001600160a01b038381169190911791829055600954600b5460408051600160e01b63e6a439050281529284166004840152908316602483015251929091169163e6a4390591604480820192602092909190829003018186803b15801561171857600080fd5b505afa15801561172c573d6000803e3d6000fd5b505050506040513d602081101561174257600080fd5b5051600a80546001600160a01b0319166001600160a01b039092169190911790556111a1565b60035460075460055460045490919293565b600160006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461182b57826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156117db57600080fd5b505afa1580156117ef573d6000803e3d6000fd5b505050506040513d602081101561180557600080fd5b5051600a805460ff9092169250611828916001600160a01b03169083900a6107ac565b91505b915091565b6000806000806000866001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561187157600080fd5b505afa158015611885573d6000803e3d6000fd5b505050506040513d60a081101561189b57600080fd5b5080516020820151606090920151909450925090505b858211156119655760408051600160e01b639a6fc8f502815269ffffffffffffffffffff600019909501948516600482015290516001600160a01b03891691639a6fc8f59160248083019260a0929190829003018186803b15801561191557600080fd5b505afa158015611929573d6000803e3d6000fd5b505050506040513d60a081101561193f57600080fd5b50805160208201516060909201519094509250905085821161196057611965565b6118b1565b93505069ffffffffffffffffffff1690509250929050565b60008082116119d65760408051600160e51b62461bcd02815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816119e157fe5b04949350505050565b6000826119f957506000610b55565b82820282848281611a0657fe5b0414610b5257604051600160e51b62461bcd028152600401808060200182810382526021815260200180611f766021913960400191505060405180910390fd5b611a4e611f50565b6000821580611a7457505082516001600160e01b031682810290838281611a7157fe5b04145b611ab257604051600160e51b62461bcd028152600401808060200182810382526023815260200180611f976023913960400191505060405180910390fd5b60408051602081019091529081529392505050565b5160701c90565b60286000556801158e460913d000006001556006600281905566038d7ea4c6800060035568018493fba64ef0000060045560646005556706f05b59d3b2000090556014600755681b1ae4d6e2ef500000600855565b600082820183811015610b525760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082821115611bda5760408051600160e51b62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000818311611bfe57611bf9828463ffffffff611b8016565b610b52565b610b52838363ffffffff611b8016565b60006103e8603260001984010201611c3a670de0b6b3a7640000610772876109c463ffffffff6119ea16565b9450611c86611c5385634a817c8063ffffffff6119ea16565b610772858402606402610dc1611c79611c748b61271063ffffffff6119ea16565b611e64565b8a9063ffffffff6119ea16565b95945050505050565b6000806000611c9c611e9b565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd757600080fd5b505afa158015611ceb573d6000803e3d6000fd5b505050506040513d6020811015611d0157600080fd5b505160408051600160e01b635a3d549302815290519194506001600160a01b03861691635a3d549391600480820192602092909190829003018186803b158015611d4a57600080fd5b505afa158015611d5e573d6000803e3d6000fd5b505050506040513d6020811015611d7457600080fd5b505160408051600160e21b630240bc6b0281529051919350600091829182916001600160a01b03891691630902f1ac916004808301926060929190829003018186803b158015611dc357600080fd5b505afa158015611dd7573d6000803e3d6000fd5b505050506040513d6060811015611ded57600080fd5b5080516020820151604090920151909450909250905063ffffffff80821690851614611e5a5780840363ffffffff8116611e278486611ea5565b516001600160e01b031602969096019563ffffffff8116611e488585611ea5565b516001600160e01b0316029590950194505b5050509193909250565b80600260018201045b81811015611e9557809150600281828581611e8457fe5b040181611e8d57fe5b049050611e6d565b50919050565b63ffffffff421690565b611ead611f63565b6000826001600160701b031611611f0e5760408051600160e51b62461bcd02815260206004820152601760248201527f4669786564506f696e743a204449565f42595f5a45524f000000000000000000604482015290519081900360640190fd5b6040805160208101909152806001600160701b0380851690861660701b6001600160e01b031681611f3b57fe5b046001600160e01b0316815250905092915050565b6040518060200160405280600081525090565b6040805160208101909152600081529056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774669786564506f696e743a204d554c5449504c49434154494f4e5f4f564552464c4f5756616c7565206d757374206265206c657373206f7220657175616c20746f20313030a165627a7a723058202c9a63c6bce24180f46218d241cf22d0fec2239ec78eb35e1c5c15768d50c1630029
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c80638c8557d9116100b8578063a7343f401161007c578063a7343f4014610534578063ad2cd2661461055a578063ad4cc43e1461059f578063bfed95b8146105d5578063ecb22803146105dd578063f0a5702f1461060357610137565b80638c8557d9146103f757806398d57d21146104335780639dd86e0f146104f7578063a1dc272614610524578063a2e620451461052c57610137565b8063462d0b2e116100ff578063462d0b2e146102455780634a5f1d70146102f3578063504e87511461031f5780635539d400146103cb578063797c7480146103ef57610137565b806305a7daf71461013c578063094f81f814610188578063158ef93e146101a2578063296644b9146101be578063449e815d14610219575b600080fd5b6101626004803603602081101561015257600080fd5b50356001600160a01b031661062f565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610190610659565b60408051918252519081900360200190f35b6101aa61065f565b604080519115158252519081900360200190f35b610200600480360360a08110156101d457600080fd5b506001600160a01b0381358116916020810135909116906040810135906060810135906080013561066f565b6040805192835290151560208301528051918290030190f35b6101906004803603604081101561022f57600080fd5b506001600160a01b0381351690602001356107ac565b6102f16004803603604081101561025b57600080fd5b810190602081018135600160201b81111561027557600080fd5b82018360208201111561028757600080fd5b803590602001918460208302840111600160201b831117156102a857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505090356001600160a01b031691506108049050565b005b6101906004803603604081101561030957600080fd5b506001600160a01b038135169060200135610b17565b6101906004803603604081101561033557600080fd5b810190602081018135600160201b81111561034f57600080fd5b82018360208201111561036157600080fd5b803590602001918460208302840111600160201b8311171561038257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505090356001600160a01b03169150610b5b9050565b6103d3610e1b565b604080516001600160a01b039092168252519081900360200190f35b6103d3610e2a565b61041d6004803603602081101561040d57600080fd5b50356001600160a01b0316610e39565b6040805160ff9092168252519081900360200190f35b610200600480360360a081101561044957600080fd5b810190602081018135600160201b81111561046357600080fd5b82018360208201111561047557600080fd5b803590602001918460208302840111600160201b8311171561049657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550506001600160a01b038335811694506020840135811693604081013590911692506060013515159050610ea6565b6102f16004803603604081101561050d57600080fd5b506001600160c01b03198135169060200135610f5b565b6102f16111a5565b6102f1611310565b6101906004803603602081101561054a57600080fd5b50356001600160a01b031661150a565b6105866004803603604081101561057057600080fd5b506001600160a01b038135169060200135611545565b6040805192835260208301919091528051918290030190f35b6102f1600480360360408110156105b557600080fd5b5080356001600160c01b03191690602001356001600160a01b03166115d2565b610162611768565b610586600480360360208110156105f357600080fd5b50356001600160a01b031661177a565b6105866004803603604081101561061957600080fd5b506001600160a01b038135169060200135611830565b60008060008060006106408661150a565b6000546001546002549199909850919650945092505050565b60085490565b600d54600160a01b900460ff1681565b60105460408051600160e01b63179e91f10281526001600160a01b038781166004830152600160f01b61534d0260248301524260448301529151600093849384938493919092169163179e91f1916064808301926020929190829003018186803b1580156106dc57600080fd5b505afa1580156106f0573d6000803e3d6000fd5b505050506040513d602081101561070657600080fd5b5051905060006107168a89611545565b6006549092508710159050610733578683945094505050506107a2565b60646000610747848463ffffffff61197d16565b11156107845761077e61076183600a63ffffffff6119ea16565b61077285606463ffffffff6119ea16565b9063ffffffff61197d16565b60019450015b61079960646107728a8463ffffffff6119ea16565b95509293505050505b9550959350505050565b6001600160a01b0382166000908152600e602090815260408083208151928301909152546001600160e01b031681526107f4906107ef908463ffffffff611a4616565b611ac7565b6001600160901b03169392505050565b6000309050806001600160a01b031663025313a26040518163ffffffff1660e01b815260040160206040518083038186803b15801561084257600080fd5b505afa158015610856573d6000803e3d6000fd5b505050506040513d602081101561086c57600080fd5b50516001600160a01b031633146108cd5760408051600160e51b62461bcd02815260206004820152601a60248201527f53656e646572206973206e6f742070726f7879206f776e65722e000000000000604482015290519081900360640190fd5b600d54600160a01b900460ff161561092f5760408051600160e51b62461bcd02815260206004820152601360248201527f416c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b600d805474ff00000000000000000000000000000000000000001916600160a01b17905561095b611ace565b600d80546001600160a01b0319163390811790915560408051600160e11b6376eecec1028152905163eddd9d8291600480820192602092909190829003018186803b1580156109a957600080fd5b505afa1580156109bd573d6000803e3d6000fd5b505050506040513d60208110156109d357600080fd5b5051601080546001600160a01b0319166001600160a01b03909216919091179055825183906001908110610a0357fe5b6020908102919091010151600980546001600160a01b03199081166001600160a01b0393841617909155600c805490911691841691909117905582518390600090610a4a57fe5b60200260200101516001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8a57600080fd5b505afa158015610a9e573d6000803e3d6000fd5b505050506040513d6020811015610ab457600080fd5b5051600b80546001600160a01b0319166001600160a01b03909216919091179055825183906002908110610ae457fe5b6020026020010151600f60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b806001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610b5557600a54610b52906001600160a01b0316836107ac565b90505b92915050565b600080610bb7610b94600960009054906101000a90046001600160a01b031686600681518110610b8757fe5b6020026020010151610b17565b85600581518110610ba157fe5b6020026020010151611b2390919063ffffffff16565b90506000610bf1610be4600960009054906101000a90046001600160a01b031687600881518110610b8757fe5b86600781518110610ba157fe5b6000935090508280610c028661150a565b905060008054905060008160640390506000610c4f8a600381518110610c2457fe5b60200260200101518b600481518110610c3957fe5b6020026020010151611b8090919063ffffffff16565b90506000610c686002548361197d90919063ffffffff16565b90508a600481518110610c7757fe5b6020026020010151421115610c9757600098505050505050505050610b55565b600154881115610cca57610cc7610cb4898663ffffffff6119ea16565b61077289620f424063ffffffff6119ea16565b98505b60008b600181518110610cd957fe5b6020026020010151861015610cf45750600195506002610d24565b8b600281518110610d0157fe5b6020026020010151861115610d1c5750600395506002610d24565b506002955060015b6000610d44888e600081518110610d3757fe5b6020026020010151611be0565b905060008d600381518110610d5557fe5b60200260200101514211610d6a576000610d91565b610d918e600381518110610d7a57fe5b602002602001015142611b8090919063ffffffff16565b9050838111610da05783610da2565b805b9050610df6610de9610dcd87610dc1600188018b63ffffffff6119ea16565b9063ffffffff6119ea16565b61077284610dc1620f42408160018b018a63ffffffff611b8016565b8d9063ffffffff611b2316565b9b50610e098c606463ffffffff61197d16565b9e9d5050505050505050505050505050565b600d546001600160a01b031681565b600f546001600160a01b031690565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7457600080fd5b505afa158015610e88573d6000803e3d6000fd5b505050506040513d6020811015610e9e57600080fd5b505192915050565b6000806000610ebc8789600981518110610b8757fe5b9050600354811080610ecf575060045481115b15610eda57506107a2565b6000610ee68987610b5b565b9050610f1b610f00600554846119ea90919063ffffffff16565b828b600a81518110610f0e57fe5b6020026020010151611c0e565b93508415610f4f57610f4488888b600981518110610f3557fe5b6020026020010151878661066f565b9350935050506107a2565b50509550959350505050565b600d546001600160a01b03163314610fb15760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b600160f01b615357026001600160c01b03198316141561101857606481111561100e57604051600160e51b62461bcd028152600401808060200182810382526022815260200180611fba6022913960400191505060405180910390fd5b60008190556111a1565b600160e01b6353574d41026001600160c01b03198316141561103e5760018190556111a1565b600160e21b6313551151026001600160c01b0319831614156110645760028190556111a1565b600160d21b65135253941491026001600160c01b03198316141561108c5760038190556111a1565b600160d21b65135056141491026001600160c01b0319831614156110b45760048190556111a1565b600160e01b6350444543026001600160c01b0319831614156110da5760058190556111a1565b600160d01b654d494e53544d026001600160c01b0319831614156111025760068190556111a1565b600160d81b645250455243026001600160c01b0319831614156111295760078190556111a1565b600160d41b65054534449535026001600160c01b0319831614156111515760088190556111a1565b60408051600160e51b62461bcd02815260206004820152600c60248201527f496e76616c696420636f64650000000000000000000000000000000000000000604482015290519081900360640190fd5b5050565b600c546001600160a01b031633146111bc57600080fd5b600a546001600160a01b03161561121d5760408051600160e51b62461bcd02815260206004820152601360248201527f416c726561647920696e697469616c6973656400000000000000000000000000604482015290519081900360640190fd5b600f54600954600b5460408051600160e01b63e6a439050281526001600160a01b039384166004820152918316602483015251919092169163e6a43905916044808301926020929190829003018186803b15801561127a57600080fd5b505afa15801561128e573d6000803e3d6000fd5b505050506040513d60208110156112a457600080fd5b5051600a80546001600160a01b0319166001600160a01b039283161790819055166000818152600e6020526040812091819081906112e190611c8f565b600187019290925560038601556004909401805463ffffffff191663ffffffff90951694909417909355505050565b600d546001600160a01b031633146113665760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b600a546001600160a01b03166113c65760408051600160e51b62461bcd02815260206004820152601460248201527f556e69737761702070616972206e6f7420736574000000000000000000000000604482015290519081900360640190fd5b600a546001600160a01b03166000818152600e6020526040812091819081906113ee90611c8f565b6004870154929550909350915063ffffffff908116820390610e1090821610158061142557506004850154600160201b900460ff16155b156115035760405180602001604052808263ffffffff16876001015487038161144a57fe5b046001600160e01b03908116909152905186546001600160e01b031916911617855560408051602081019091526003860154819063ffffffff84169086038161148f57fe5b046001600160e01b0390811690915290516002870180546001600160e01b03191691909216179055600185018490556003850183905560048501805463ffffffff191663ffffffff84161790819055600160201b900460ff166115035760048501805464ff000000001916600160201b1790555b5050505050565b6000816001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7457600080fd5b600080826001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156115c557600a546001600160a01b03166000908152600e602090815260409182902082519182019092526002909101546001600160e01b031681526115b9906107ef908663ffffffff611a4616565b6001600160901b031690505b6006549590945092505050565b600d546001600160a01b031633146116285760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d139bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b6001600160a01b0381166116865760408051600160e51b62461bcd02815260206004820152601a60248201527f56616c75652063616e6e6f742062652061646472657373283029000000000000604482015290519081900360640190fd5b600160d01b65554e49464143026001600160c01b03198316141561115157600f80546001600160a01b0319166001600160a01b038381169190911791829055600954600b5460408051600160e01b63e6a439050281529284166004840152908316602483015251929091169163e6a4390591604480820192602092909190829003018186803b15801561171857600080fd5b505afa15801561172c573d6000803e3d6000fd5b505050506040513d602081101561174257600080fd5b5051600a80546001600160a01b0319166001600160a01b039092169190911790556111a1565b60035460075460055460045490919293565b600160006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461182b57826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156117db57600080fd5b505afa1580156117ef573d6000803e3d6000fd5b505050506040513d602081101561180557600080fd5b5051600a805460ff9092169250611828916001600160a01b03169083900a6107ac565b91505b915091565b6000806000806000866001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561187157600080fd5b505afa158015611885573d6000803e3d6000fd5b505050506040513d60a081101561189b57600080fd5b5080516020820151606090920151909450925090505b858211156119655760408051600160e01b639a6fc8f502815269ffffffffffffffffffff600019909501948516600482015290516001600160a01b03891691639a6fc8f59160248083019260a0929190829003018186803b15801561191557600080fd5b505afa158015611929573d6000803e3d6000fd5b505050506040513d60a081101561193f57600080fd5b50805160208201516060909201519094509250905085821161196057611965565b6118b1565b93505069ffffffffffffffffffff1690509250929050565b60008082116119d65760408051600160e51b62461bcd02815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816119e157fe5b04949350505050565b6000826119f957506000610b55565b82820282848281611a0657fe5b0414610b5257604051600160e51b62461bcd028152600401808060200182810382526021815260200180611f766021913960400191505060405180910390fd5b611a4e611f50565b6000821580611a7457505082516001600160e01b031682810290838281611a7157fe5b04145b611ab257604051600160e51b62461bcd028152600401808060200182810382526023815260200180611f976023913960400191505060405180910390fd5b60408051602081019091529081529392505050565b5160701c90565b60286000556801158e460913d000006001556006600281905566038d7ea4c6800060035568018493fba64ef0000060045560646005556706f05b59d3b2000090556014600755681b1ae4d6e2ef500000600855565b600082820183811015610b525760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082821115611bda5760408051600160e51b62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000818311611bfe57611bf9828463ffffffff611b8016565b610b52565b610b52838363ffffffff611b8016565b60006103e8603260001984010201611c3a670de0b6b3a7640000610772876109c463ffffffff6119ea16565b9450611c86611c5385634a817c8063ffffffff6119ea16565b610772858402606402610dc1611c79611c748b61271063ffffffff6119ea16565b611e64565b8a9063ffffffff6119ea16565b95945050505050565b6000806000611c9c611e9b565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd757600080fd5b505afa158015611ceb573d6000803e3d6000fd5b505050506040513d6020811015611d0157600080fd5b505160408051600160e01b635a3d549302815290519194506001600160a01b03861691635a3d549391600480820192602092909190829003018186803b158015611d4a57600080fd5b505afa158015611d5e573d6000803e3d6000fd5b505050506040513d6020811015611d7457600080fd5b505160408051600160e21b630240bc6b0281529051919350600091829182916001600160a01b03891691630902f1ac916004808301926060929190829003018186803b158015611dc357600080fd5b505afa158015611dd7573d6000803e3d6000fd5b505050506040513d6060811015611ded57600080fd5b5080516020820151604090920151909450909250905063ffffffff80821690851614611e5a5780840363ffffffff8116611e278486611ea5565b516001600160e01b031602969096019563ffffffff8116611e488585611ea5565b516001600160e01b0316029590950194505b5050509193909250565b80600260018201045b81811015611e9557809150600281828581611e8457fe5b040181611e8d57fe5b049050611e6d565b50919050565b63ffffffff421690565b611ead611f63565b6000826001600160701b031611611f0e5760408051600160e51b62461bcd02815260206004820152601760248201527f4669786564506f696e743a204449565f42595f5a45524f000000000000000000604482015290519081900360640190fd5b6040805160208101909152806001600160701b0380851690861660701b6001600160e01b031681611f3b57fe5b046001600160e01b0316815250905092915050565b6040518060200160405280600081525090565b6040805160208101909152600081529056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774669786564506f696e743a204d554c5449504c49434154494f4e5f4f564552464c4f5756616c7565206d757374206265206c657373206f7220657175616c20746f20313030a165627a7a723058202c9a63c6bce24180f46218d241cf22d0fec2239ec78eb35e1c5c15768d50c1630029
Deployed Bytecode Sourcemap
32345:18273:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32345:18273:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41782:500;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41782:500:0;-1:-1:-1;;;;;41782:500:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44970:114;;;:::i;:::-;;;;;;;;;;;;;;;;33122:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;35436:828;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;35436:828:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;46101:244;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46101:244:0;;;;;;;;:::i;33788:753::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33788:753:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;33788:753:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;33788:753:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33788:753:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33788:753:0;;-1:-1:-1;;;33788:753:0;;-1:-1:-1;;;;;33788:753:0;;-1:-1:-1;33788:753:0;;-1:-1:-1;33788:753:0:i;:::-;;43976:307;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;43976:307:0;;;;;;;;:::i;48624:1724::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48624:1724:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;48624:1724:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;48624:1724:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;48624:1724:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;48624:1724:0;;-1:-1:-1;;;48624:1724:0;;-1:-1:-1;;;;;48624:1724:0;;-1:-1:-1;48624:1724:0;;-1:-1:-1;48624:1724:0:i;33083:32::-;;;:::i;:::-;;;;-1:-1:-1;;;;;33083:32:0;;;;;;;;;;;;;;45925:109;;;:::i;40569:140::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40569:140:0;-1:-1:-1;;;;;40569:140:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;46986:821;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;46986:821:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;46986:821:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46986:821:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;46986:821:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46986:821:0;;-1:-1:-1;;;;;;;46986:821:0;;;;;-1:-1:-1;46986:821:0;;;;;;;;;;;;;;;-1:-1:-1;46986:821:0;;;;;;-1:-1:-1;46986:821:0;:::i;36341:1270::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;;36341:1270:0;;;;;;;;:::i;39833:657::-;;;:::i;38215:1534::-;;;:::i;42509:203::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42509:203:0;-1:-1:-1;;;;;42509:203:0;;:::i;45406:415::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45406:415:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37688:443;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37688:443:0;;-1:-1:-1;;;;;;37688:443:0;;;;;-1:-1:-1;;;;;37688:443:0;;:::i;41028:287::-;;;:::i;44512:370::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44512:370:0;-1:-1:-1;;;;;44512:370:0;;:::i;42939:800::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42939:800:0;;;;;;;;:::i;41782:500::-;41923:7;41945;41967;41989;42024:22;42049:60;42080:18;42049:16;:60::i;:::-;42142:15;;42172:26;;42242:21;;42142:15;;42172:26;;-1:-1:-1;42024:85:0;;-1:-1:-1;42242:21:0;-1:-1:-1;41782:500:0;-1:-1:-1;;;41782:500:0:o;44970:114::-;45056:20;;44970:114;:::o;33122:23::-;;;-1:-1:-1;;;33122:23:0;;;;;:::o;35436:828::-;35650:15;;:52;;;-1:-1:-1;;;;;35650:52:0;;-1:-1:-1;;;;;35650:52:0;;;;;;;-1:-1:-1;;;;;35650:52:0;;;;35698:3;35650:52;;;;;;35576:4;;;;;;;;35650:15;;;;;:34;;:52;;;;;;;;;;;;;;:15;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;35650:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35650:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35650:52:0;;-1:-1:-1;35711:28:0;35778:57;35810:6;35818:16;35778:31;:57::i;:::-;35861:21;;35748:87;;-1:-1:-1;35847:35:0;;35844:104;;-1:-1:-1;35844:104:0;;35903:16;35920:17;35895:43;;;;;;;;;35844:104;35974:3;35956:15;35989:43;:14;36008:23;35989:43;:18;:43;:::i;:::-;:47;35986:194;;;36075:60;36103:31;:23;36131:2;36103:31;:27;:31;:::i;:::-;36075:23;:14;36094:3;36075:23;:18;:23;:::i;:::-;:27;:60;:27;:60;:::i;:::-;36166:4;;-1:-1:-1;36062:73:0;35986:194;36196:41;36233:3;36196:32;:16;36217:10;36196:32;:20;:32;:::i;:41::-;36188:68;-1:-1:-1;36238:17:0;;-1:-1:-1;;;;35436:828:0;;;;;;;;;:::o;46101:244::-;-1:-1:-1;;;;;46247:21:0;;46199:17;46247:21;;;:15;:21;;;;;;;;46246:55;;;;;;;;;-1:-1:-1;;;;;46246:55:0;;;:91;;:65;;46302:8;46246:65;:55;:65;:::i;:::-;:89;:91::i;:::-;-1:-1:-1;;;;;46234:103:0;;46101:244;-1:-1:-1;;;46101:244:0:o;33788:753::-;33887:30;33983:4;33887:114;;34034:5;-1:-1:-1;;;;;34034:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34034:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34034:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34034:18:0;-1:-1:-1;;;;;34020:32:0;:10;:32;34012:71;;;;;-1:-1:-1;;;;;34012:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34103:11;;-1:-1:-1;;;34103:11:0;;;;34102:12;34094:44;;;;;-1:-1:-1;;;;;34094:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34149:11;:18;;-1:-1:-1;;34149:18:0;-1:-1:-1;;;34149:18:0;;;34178:23;:21;:23::i;:::-;34212:17;:30;;-1:-1:-1;;;;;;34212:30:0;34232:10;34212:30;;;;;;34288:45;;;-1:-1:-1;;;;;34288:45:0;;;;:43;;:45;;;;;;;;;;;;;;;34232:10;34288:45;;;5:2:-1;;;;30:1;27;20:12;5:2;34288:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34288:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34288:45:0;34253:15;:81;;-1:-1:-1;;;;;;34253:81:0;-1:-1:-1;;;;;34253:81:0;;;;;;;;;34357:17;;;;-1:-1:-1;;34357:17:0;;;;;;;;;;;;;;;;34345:9;:29;;-1:-1:-1;;;;;;34345:29:0;;;-1:-1:-1;;;;;34345:29:0;;;;;;;34385:9;:22;;;;;;;;;;;;;;34444:17;;;;-1:-1:-1;;34444:17:0;;;;;;;;;;-1:-1:-1;;;;;34425:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34425:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34425:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34425:44:0;34418:4;:51;;-1:-1:-1;;;;;;34418:51:0;-1:-1:-1;;;;;34418:51:0;;;;;;;;;34515:17;;;;34530:1;;34515:17;;;;;;;;;;;;34480:14;;:53;;;;;-1:-1:-1;;;;;34480:53:0;;;;;-1:-1:-1;;;;;34480:53:0;;;;;;33788:753;;;:::o;43976:307::-;44148:7;-1:-1:-1;;;;;44170:31:0;;32470:42;44170:31;44166:110;;44243:11;;44234:30;;-1:-1:-1;;;;;44243:11:0;44256:7;44234:8;:30::i;:::-;44218:46;;44166:110;43976:307;;;;:::o;48624:1724::-;48723:17;48751;48771:53;48785:38;48802:9;;;;;;;;;-1:-1:-1;;;;;48802:9:0;48813:6;48820:1;48813:9;;;;;;;;;;;;;;48785:16;:38::i;:::-;48771:6;48778:1;48771:9;;;;;;;;;;;;;;:13;;:53;;;;:::i;:::-;48751:73;;48833:25;48861:125;48946:38;48963:9;;;;;;;;;-1:-1:-1;;;;;48963:9:0;48974:6;48981:1;48974:9;;;;;;;48946:38;48861:6;48868:1;48861:9;;;;;;;:125;49010:1;;-1:-1:-1;48833:153:0;-1:-1:-1;49010:1:0;;49079:55;49108:17;49079:16;:55::i;:::-;49056:78;;49143:19;49165:15;;49143:37;;49189:24;49222:14;49216:3;:20;49189:47;;49245:19;49267:24;49281:6;49288:1;49281:9;;;;;;;;;;;;;;49267:6;49274:1;49267:9;;;;;;;;;;;;;;:13;;:24;;;;:::i;:::-;49245:46;;49300:19;49322:43;49343:21;;49323:14;49322:20;;:43;;;;:::i;:::-;49300:65;;49383:6;49390:1;49383:9;;;;;;;;;;;;;;49377:3;:15;49374:49;;;49412:1;49405:8;;;;;;;;;;;;49374:49;49449:26;;49434:12;:41;49431:155;;;49503:73;49543:32;:12;49560:14;49543:32;:16;:32;:::i;:::-;49503:35;49504:20;49530:7;49503:35;:26;:35;:::i;:73::-;49488:88;;49431:155;49596:16;49639:6;49646:1;49639:9;;;;;;;;;;;;;;49624:12;:24;49621:277;;;-1:-1:-1;49682:1:0;;-1:-1:-1;49708:1:0;49621:277;;;49743:6;49750:1;49743:9;;;;;;;;;;;;;;49728:12;:24;49725:173;;;-1:-1:-1;49786:1:0;;-1:-1:-1;49812:1:0;49725:173;;;-1:-1:-1;49861:1:0;;-1:-1:-1;49887:1:0;49725:173;49906:13;49922:53;49945:18;49965:6;49972:1;49965:9;;;;;;;;;;;;;;49922:22;:53::i;:::-;49906:69;;49984:16;50009:6;50016:1;50009:9;;;;;;;;;;;;;;50003:3;:15;:40;;50042:1;50003:40;;;50021:18;50029:6;50036:1;50029:9;;;;;;;;;;;;;;50021:3;:7;;:18;;;;:::i;:::-;49984:59;;50080:14;50066:11;:28;:58;;50110:14;50066:58;;;50097:11;50066:58;50052:72;-1:-1:-1;50148:147:0;50165:129;50233:60;50278:14;50233:40;50246:1;50234:13;;50253:19;50233:40;:19;:40;:::i;:::-;:44;:60;:44;:60;:::i;:::-;50166:61;50215:11;50166:44;50202:7;50166:44;50180:1;50168:13;;50187:8;50167:29;:19;:29;:::i;50165:129::-;50148:12;;:147;:16;:147;:::i;:::-;50133:162;-1:-1:-1;50319:21:0;50133:162;50336:3;50319:21;:16;:21;:::i;:::-;50304:36;48624:1724;-1:-1:-1;;;;;;;;;;;;;;48624:1724:0:o;33083:32::-;;;-1:-1:-1;;;;;33083:32:0;;:::o;45925:109::-;46010:14;;-1:-1:-1;;;;;46010:14:0;45925:109;:::o;40569:140::-;40639:5;40679:10;-1:-1:-1;;;;;40662:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40662:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40662:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40662:39:0;;40569:140;-1:-1:-1;;40569:140:0:o;46986:821::-;47141:21;47164:23;47198:16;47217:34;47234:5;47241:6;47248:1;47241:9;;;;;;;47217:34;47198:53;;47277:19;;47263:11;:33;:70;;;;47314:19;;47300:11;:33;47263:70;47260:141;;;-1:-1:-1;47346:45:0;;47260:141;47409:16;47456:47;47477:6;47485:17;47456:20;:47::i;:::-;47442:61;;47531:86;47558:33;47574:16;;47558:11;:15;;:33;;;;:::i;:::-;47593:11;47606:6;47613:2;47606:10;;;;;;;;;;;;;;47531:26;:86::i;:::-;47512:105;;47629:16;47626:120;;;47665:71;47681:5;47688:4;47694:6;47701:1;47694:9;;;;;;;;;;;;;;47706:16;47724:11;47665:15;:71::i;:::-;47658:78;;;;;;;;47626:120;-1:-1:-1;;46986:821:0;;;;;;;;:::o;36341:1270::-;33643:17;;-1:-1:-1;;;;;33643:17:0;33629:10;:31;33621:58;;;;;-1:-1:-1;;;;;33621:58:0;;;;;;;;;;;;-1:-1:-1;;;;;33621:58:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36461:12:0;;;36457:1147;;;36526:3;36517:5;:12;;36509:59;;;;-1:-1:-1;;;;;36509:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36583:15;:23;;;36457:1147;;;-1:-1:-1;;;;;;;;;;;36628:14:0;;;36624:980;;;36706:26;:34;;;36624:980;;;-1:-1:-1;;;;;;;;;;;36762:14:0;;;36758:846;;;36825:21;:29;;;36758:846;;;-1:-1:-1;;;;;;;;;;;36876:16:0;;;36872:732;;;36937:19;:27;;;36872:732;;;-1:-1:-1;;;;;;;;;;;36986:16:0;;;36982:622;;;37047:19;:27;;;36982:622;;;-1:-1:-1;;;;;;;;;;;37096:14:0;;;37092:512;;;37150:16;:24;;;37092:512;;;-1:-1:-1;;;;;;;;;;;37196:16:0;;;37192:412;;;37275:21;:29;;;37192:412;;;-1:-1:-1;;;;;;;;;;;37326:15:0;;;37322:282;;;37377:14;:22;;;37322:282;;;-1:-1:-1;;;;;;;;;;;37421:16:0;;;37417:187;;;37509:20;:28;;;37417:187;;;37570:22;;;-1:-1:-1;;;;;37570:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37417:187;36341:1270;;:::o;39833:657::-;39909:9;;-1:-1:-1;;;;;39909:9:0;39895:10;:23;39887:32;;;;;;39936:11;;-1:-1:-1;;;;;39936:11:0;:25;39928:56;;;;;-1:-1:-1;;;;;39928:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40007:14;;40030:9;;40041:4;;40007:39;;;-1:-1:-1;;;;;40007:39:0;;-1:-1:-1;;;;;40030:9:0;;;40007:39;;;;40041:4;;;40007:39;;;;;:14;;;;;:22;;:39;;;;;;;;;;;;;;:14;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;40007:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40007:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40007:39:0;39993:11;:53;;-1:-1:-1;;;;;;39993:53:0;-1:-1:-1;;;;;39993:53:0;;;;;;;;40109:11;-1:-1:-1;40093:28:0;;;:15;40007:39;40093:28;;;;;-1:-1:-1;;;;40250:59:0;;:46;:59::i;:::-;40318:31;;;:50;;;;40377:31;;;:50;40436:29;;;;:46;;-1:-1:-1;;40436:46:0;;;;;;;;;;;;-1:-1:-1;;;39833:657:0:o;38215:1534::-;33643:17;;-1:-1:-1;;;;;33643:17:0;33629:10;:31;33621:58;;;;;-1:-1:-1;;;;;33621:58:0;;;;;;;;;;;;-1:-1:-1;;;;;33621:58:0;;;;;;;;;;;;;;;38276:11;;-1:-1:-1;;;;;38276:11:0;38268:58;;;;;-1:-1:-1;;;;;38268:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38391:11;;-1:-1:-1;;;;;38391:11:0;38337:35;38375:28;;;:15;:28;;;;;;38337:35;;;;38542:59;;:46;:59::i;:::-;38650:29;;;;38414:187;;-1:-1:-1;38414:187:0;;-1:-1:-1;38414:187:0;-1:-1:-1;38650:29:0;;;;38633:46;;;32551:7;38719:27;;;;;;:54;;-1:-1:-1;38751:22:0;;;;-1:-1:-1;;;38751:22:0;;;;38750:23;38719:54;38715:1027;;;39003:194;;;;;;;;39152:11;39072:91;;39092:10;:31;;;39073:16;:50;39072:91;;;;;;-1:-1:-1;;;;;39003:194:0;;;;;;38976:221;;;;-1:-1:-1;;;;;;38976:221:0;;;;;;39239:194;;;;;;;;;39328:31;;;;39239:194;;39308:91;;;;39309:50;;39308:91;;;;;;-1:-1:-1;;;;;39239:194:0;;;;;;39212:221;;:24;;;:221;;-1:-1:-1;;;;;;39212:221:0;;;;;;;;-1:-1:-1;39450:31:0;;:50;;;39515:31;;;:50;;;39580:29;;;:46;;-1:-1:-1;;39580:46:0;;;;;;;;;-1:-1:-1;;;39645:22:0;;;;39641:90;;39686:22;;;:29;;-1:-1:-1;;39686:29:0;-1:-1:-1;;;39686:29:0;;;39641:90;33690:1;;;;;38215:1534::o;42509:203::-;42602:20;42667;-1:-1:-1;;;;;42650:51:0;;:53;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;45406:415:0;45528:7;;45579;-1:-1:-1;;;;;45601:21:0;;32470:42;45601:21;45597:168;;;45665:11;;-1:-1:-1;;;;;45665:11:0;45649:28;;;;:15;:28;;;;;;;;;45648:66;;;;;;;;45649:42;;;;45648:66;-1:-1:-1;;;;;45648:66:0;;;:105;;:75;;45715:7;45648:75;:66;:75;:::i;:105::-;-1:-1:-1;;;;;45639:114:0;;;45597:168;45783:21;;;45806:6;;-1:-1:-1;45406:415:0;-1:-1:-1;;;45406:415:0:o;37688:443::-;33643:17;;-1:-1:-1;;;;;33643:17:0;33629:10;:31;33621:58;;;;;-1:-1:-1;;;;;33621:58:0;;;;;;;;;;;;-1:-1:-1;;;;;33621:58:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37823:19:0;;37815:58;;;;;-1:-1:-1;;;;;37815:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37888:16:0;;;37884:240;;;37948:14;:41;;-1:-1:-1;;;;;;37948:41:0;-1:-1:-1;;;;;37948:41:0;;;;;;;;;;;38041:9;;38052:4;;38018:39;;;-1:-1:-1;;;;;38018:39:0;;38041:9;;;38018:39;;;;38052:4;;;38018:39;;;;;:14;;;;;:22;;:39;;;;;;;;;;;;;;;:14;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;38018:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38018:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38018:39:0;38004:11;:53;;-1:-1:-1;;;;;;38004:53:0;-1:-1:-1;;;;;38004:53:0;;;;;;;;;37884:240;;41028:287;41232:19;;41253:14;;41269:16;;41287:19;;41028:287;;;;:::o;44512:370::-;44687:1;44614:21;-1:-1:-1;;;;;44703:31:0;;32470:42;44703:31;44699:176;;44769:16;-1:-1:-1;;;;;44762:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44762:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44762:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44762:35:0;44837:11;;;44751:46;;;;;-1:-1:-1;44828:35:0;;-1:-1:-1;;;;;44837:11:0;;44850:12;;;44828:8;:35::i;:::-;44812:51;;44699:176;44512:370;;;:::o;42939:800::-;43063:20;43085:15;43113:21;43145:24;43180:25;43293:20;-1:-1:-1;;;;;43276:54:0;;:56;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43276:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43276:56:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;43276:56:0;;;;;;;;;;;;;-1:-1:-1;43276:56:0;-1:-1:-1;43276:56:0;-1:-1:-1;43343:313:0;43368:11;43349:16;:30;43343:313;;;43487:67;;;-1:-1:-1;;;;;43487:67:0;;;-1:-1:-1;;43396:16:0;;;43487:67;;;;;;;;;-1:-1:-1;;;;;43487:51:0;;;;;:67;;;;;;;;;;;;;;:51;:67;;;5:2:-1;;;;30:1;27;20:12;5:2;43487:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43487:67:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;43487:67:0;;;;;;;;;;;;;-1:-1:-1;43487:67:0;-1:-1:-1;43487:67:0;-1:-1:-1;43572:31:0;;;43569:76;;43624:5;;43569:76;43343:313;;;43695:18;-1:-1:-1;;43666:65:0;;;-1:-1:-1;42939:800:0;;;;;:::o;13598:333::-;13656:7;13755:1;13751;:5;13743:44;;;;;-1:-1:-1;;;;;13743:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13798:9;13814:1;13810;:5;;;;;;;13598:333;-1:-1:-1;;;;13598:333:0:o;12659:471::-;12717:7;12962:6;12958:47;;-1:-1:-1;12992:1:0;12985:8;;12958:47;13029:5;;;13033:1;13029;:5;:1;13053:5;;;;;:10;13045:56;;;;-1:-1:-1;;;;;13045:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7096:253;7163:16;;:::i;:::-;7192:6;7217;;;:54;;-1:-1:-1;;7263:7:0;;-1:-1:-1;;;;;7258:13:0;7232:17;;;;7253:1;7232:17;7253:1;7227:27;;;;;:44;7217:54;7209:102;;;;-1:-1:-1;;;;;7209:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7329:12;;;;;;;;;;;;;7096:253;-1:-1:-1;;;7096:253:0:o;8050:130::-;8150:7;6256:3;8150:21;;8050:130::o;34620:391::-;34691:2;34673:15;:20;34736:8;34707:26;:37;34779:1;34755:21;:25;;;34813:4;34791:19;:26;34850:8;34828:19;:30;34888:3;34869:16;:22;34926:4;34902:28;;34958:2;34941:14;:19;34994:9;34971:20;:32;34620:391::o;11239:181::-;11297:7;11329:5;;;11353:6;;;;11345:46;;;;;-1:-1:-1;;;;;11345:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;11695:184;11753:7;11786:1;11781;:6;;11773:49;;;;;-1:-1:-1;;;;;11773:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11845:5:0;;;11695:184::o;50448:167::-;50528:4;50559:6;50550;:15;:57;;50589:18;:6;50600;50589:18;:10;:18;:::i;:::-;50550:57;;;50568:18;:6;50579;50568:18;:10;:18;:::i;47815:503::-;47919:4;48052;48073:2;-1:-1:-1;;48060:11:0;;48059:16;48052:23;48092:25;48112:4;48092:15;:5;48102:4;48092:15;:9;:15;:::i;:25::-;48084:33;-1:-1:-1;48206:104:0;48282:27;:11;48298:10;48282:27;:15;:27;:::i;:::-;48206:71;48244:32;;;48254:3;48244:32;48206:33;48216:22;48221:16;:5;48231;48221:16;:9;:16;:::i;:::-;48216:4;:22::i;:::-;48206:5;;:33;:9;:33;:::i;:104::-;48199:111;47815:503;-1:-1:-1;;;;;47815:503:0:o;9244:1058::-;9330:21;9353;9376;9427:23;:21;:23::i;:::-;9410:40;;9495:4;-1:-1:-1;;;;;9480:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9480:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9480:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9480:43:0;9553;;;-1:-1:-1;;;;;9553:43:0;;;;9480;;-1:-1:-1;;;;;;9553:41:0;;;;;:43;;;;;9480;;9553;;;;;;;;:41;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;9553:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9553:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9553:43:0;9776:34;;;-1:-1:-1;;;;;9776:34:0;;;;9553:43;;-1:-1:-1;9711:16:0;;;;;;-1:-1:-1;;;;;9776:32:0;;;;;:34;;;;;;;;;;;;;;:32;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;9776:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9776:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9776:34:0;;;;;;;;;;;;;-1:-1:-1;9776:34:0;;-1:-1:-1;9776:34:0;-1:-1:-1;9825:36:0;;;;;;;;9821:474;;9947:35;;;10093:62;;;10098:39;10118:8;10128;10098:19;:39::i;:::-;:42;-1:-1:-1;;;;;10093:48:0;:62;10073:82;;;;;10221:62;;;10226:39;10246:8;10256;10226:19;:39::i;:::-;:42;-1:-1:-1;;;;;10221:48:0;:62;10201:82;;;;;-1:-1:-1;9821:474:0;9244:1058;;;;;;;;:::o;46428:186::-;46500:5;46509:1;46504;46500:5;;46499:11;46533:74;46544:1;46540;:5;46533:74;;;46564:1;46560:5;;46596:1;46591;46587;46583;:5;;;;;;:9;46582:15;;;;;;46578:19;;46533:74;;;46428:186;;;;:::o;9015:123::-;9104:25;:15;:25;;9015:123::o;7505:246::-;7586:16;;:::i;:::-;7637:1;7623:11;-1:-1:-1;;;;;7623:15:0;;7615:51;;;;;-1:-1:-1;;;;;7615:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7684:59;;;;;;;;;;-1:-1:-1;;;;;7694:48:0;;;;7695:18;;6256:3;7695:32;-1:-1:-1;;;;;7694:48:0;;;;;;;-1:-1:-1;;;;;7684:59:0;;;;7677:66;;7505:246;;;;:::o;32345:18273::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;32345:18273:0;;;:::o
Swarm Source
bzzr://2c9a63c6bce24180f46218d241cf22d0fec2239ec78eb35e1c5c15768d50c163
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.