Overview
ETH Balance
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts-4.4.1/utils/math/SafeMath.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-4.4.1/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import "../utils/proxy/solidity-0.8.0/ProxyReentrancyGuard.sol"; import "../utils/proxy/solidity-0.8.0/ProxyOwned.sol"; import "../interfaces/IExoticPositionalMarket.sol"; import "../interfaces/IExoticPositionalMarketManager.sol"; import "../interfaces/IThalesBonds.sol"; contract ThalesOracleCouncil is Initializable, ProxyOwned, PausableUpgradeable, ProxyReentrancyGuard { using SafeMath for uint; uint private constant COUNCIL_MAX_MEMBERS = 5; uint private constant VOTING_OPTIONS = 7; uint private constant ACCEPT_SLASH = 1; uint private constant ACCEPT_NO_SLASH = 2; uint private constant REFUSE_ON_POSITIONING = 3; uint private constant ACCEPT_RESULT = 4; uint private constant ACCEPT_RESET = 5; uint private constant REFUSE_MATURE = 6; uint private constant CREATOR_BOND = 101; uint private constant RESOLVER_BOND = 102; uint private constant DISPUTOR_BOND = 103; uint private constant CREATOR_AND_DISPUTOR = 104; uint private constant RESOLVER_AND_DISPUTOR = 105; uint private constant TEN_SUSD = 10 * 1e18; struct Dispute { address disputorAddress; string disputeString; uint disputeCode; uint disputeTimestamp; bool disputeInPositioningPhase; } IExoticPositionalMarketManager public marketManager; uint public councilMemberCount; mapping(uint => address) public councilMemberAddress; mapping(address => uint) public councilMemberIndex; mapping(address => uint) public marketTotalDisputes; mapping(address => uint) public marketLastClosedDispute; mapping(address => uint) public allOpenDisputesCancelledToIndexForMarket; mapping(address => uint) public marketOpenDisputesCount; mapping(address => bool) public marketClosedForDisputes; mapping(address => address) public firstMemberThatChoseWinningPosition; mapping(address => mapping(uint => Dispute)) public dispute; mapping(address => mapping(uint => uint[])) public disputeVote; mapping(address => mapping(uint => uint[VOTING_OPTIONS])) public disputeVotesCount; mapping(address => mapping(uint => uint)) public disputeWinningPositionChoosen; mapping(address => mapping(uint => mapping(address => uint))) public disputeWinningPositionChoosenByMember; mapping(address => mapping(uint => mapping(uint => uint))) public disputeWinningPositionVotes; function initialize(address _owner, address _marketManager) public initializer { setOwner(_owner); initNonReentrant(); marketManager = IExoticPositionalMarketManager(_marketManager); } /* ========== VIEWS ========== */ function canMarketBeDisputed(address _market) public view returns (bool) { return !marketClosedForDisputes[_market] && IExoticPositionalMarket(_market).isMarketCreated(); } function getMarketOpenDisputes(address _market) external view returns (uint) { return marketOpenDisputesCount[_market]; } function getMarketLastClosedDispute(address _market) external view returns (uint) { return marketLastClosedDispute[_market]; } function getNumberOfCouncilMembersForMarketDispute(address _market, uint _index) external view returns (uint) { return disputeVote[_market][_index].length.sub(1); } function getVotesCountForMarketDispute(address _market, uint _index) public view returns (uint) { uint count = 0; for (uint i = 1; i < disputeVote[_market][_index].length; i++) { count += disputeVote[_market][_index][i] > 0 ? 1 : 0; } return count; } function getVotesMissingForMarketDispute(address _market, uint _index) external view returns (uint) { return disputeVote[_market][_index].length.sub(1).sub(getVotesCountForMarketDispute(_market, _index)); } function getDispute(address _market, uint _index) external view returns (Dispute memory) { return dispute[_market][_index]; } function getDisputeTimestamp(address _market, uint _index) external view returns (uint) { return dispute[_market][_index].disputeTimestamp; } function getDisputeAddressOfDisputor(address _market, uint _index) external view returns (address) { return dispute[_market][_index].disputorAddress; } function getDisputeString(address _market, uint _index) external view returns (string memory) { return dispute[_market][_index].disputeString; } function getDisputeCode(address _market, uint _index) external view returns (uint) { return dispute[_market][_index].disputeCode; } function getDisputeVotes(address _market, uint _index) external view returns (uint[] memory) { return disputeVote[_market][_index]; } function getDisputeVoteOfCouncilMember( address _market, uint _index, address _councilMember ) external view returns (uint) { if (isOracleCouncilMember(_councilMember)) { return disputeVote[_market][_index][councilMemberIndex[_councilMember]]; } else { require(isOracleCouncilMember(_councilMember), "Not OC"); return 1e18; } } function isDisputeOpen(address _market, uint _index) external view returns (bool) { return dispute[_market][_index].disputeCode == 0; } function isDisputeCancelled(address _market, uint _index) external view returns (bool) { return dispute[_market][_index].disputeCode == REFUSE_ON_POSITIONING || dispute[_market][_index].disputeCode == REFUSE_MATURE; } function isOpenDisputeCancelled(address _market, uint _disputeIndex) external view returns (bool) { return (marketClosedForDisputes[_market] || _disputeIndex <= allOpenDisputesCancelledToIndexForMarket[_market]) && dispute[_market][_disputeIndex].disputeCode == 0 && marketLastClosedDispute[_market] != _disputeIndex; } function canDisputorClaimbackBondFromUnclosedDispute( address _market, uint _disputeIndex, address _disputorAddress ) public view returns (bool) { if ( marketManager.isActiveMarket(_market) && _disputeIndex <= marketTotalDisputes[_market] && (marketClosedForDisputes[_market] || _disputeIndex <= allOpenDisputesCancelledToIndexForMarket[_market] || marketManager.cancelledByCreator(_market)) && dispute[_market][_disputeIndex].disputorAddress == _disputorAddress && dispute[_market][_disputeIndex].disputeCode == 0 && marketLastClosedDispute[_market] != _disputeIndex && IThalesBonds(marketManager.thalesBonds()).getDisputorBondForMarket(_market, _disputorAddress) > 0 ) { return true; } else { return false; } } function isOracleCouncilMember(address _councilMember) public view returns (bool) { return (councilMemberIndex[_councilMember] > 0); } function isMarketClosedForDisputes(address _market) public view returns (bool) { return marketClosedForDisputes[_market] || IExoticPositionalMarket(_market).canUsersClaim(); } function setMarketManager(address _marketManager) external onlyOwner { require(_marketManager != address(0), "Invalid address"); marketManager = IExoticPositionalMarketManager(_marketManager); emit NewMarketManager(_marketManager); } function addOracleCouncilMember(address _councilMember) external onlyOwner { require(_councilMember != address(0), "Invalid address."); require(councilMemberCount <= marketManager.maxOracleCouncilMembers(), "OC members exceeded"); require(!isOracleCouncilMember(_councilMember), "Already OC"); councilMemberCount = councilMemberCount.add(1); councilMemberAddress[councilMemberCount] = _councilMember; councilMemberIndex[_councilMember] = councilMemberCount; // marketManager.addPauserAddress(_councilMember); emit NewOracleCouncilMember(_councilMember, councilMemberCount); } function removeOracleCouncilMember(address _councilMember) external onlyOwner { require(isOracleCouncilMember(_councilMember), "Not OC"); councilMemberAddress[councilMemberIndex[_councilMember]] = councilMemberAddress[councilMemberCount]; councilMemberIndex[councilMemberAddress[councilMemberCount]] = councilMemberIndex[_councilMember]; councilMemberCount = councilMemberCount.sub(1); councilMemberIndex[_councilMember] = 0; marketManager.removePauserAddress(_councilMember); emit OracleCouncilMemberRemoved(_councilMember, councilMemberCount); } function openDispute(address _market, string memory _disputeString) external whenNotPaused { require(marketManager.isActiveMarket(_market), "Not Active"); require(!isMarketClosedForDisputes(_market), "Closed for disputes"); require(marketManager.creatorAddress(_market) != msg.sender, "Creator can not dispute"); require(!isOracleCouncilMember(msg.sender), "OC can not dispute."); require( IERC20(marketManager.paymentToken()).balanceOf(msg.sender) >= IExoticPositionalMarket(_market).disputePrice(), "Low amount for dispute" ); require( IERC20(marketManager.paymentToken()).allowance(msg.sender, marketManager.thalesBonds()) >= IExoticPositionalMarket(_market).disputePrice(), "No allowance." ); require(keccak256(abi.encode(_disputeString)) != keccak256(abi.encode("")), "Invalid dispute string"); require( bytes(_disputeString).length < marketManager.disputeStringLengthLimit() || bytes(_disputeString).length < 110, "String exceeds length" ); marketTotalDisputes[_market] = marketTotalDisputes[_market].add(1); marketOpenDisputesCount[_market] = marketOpenDisputesCount[_market].add(1); dispute[_market][marketTotalDisputes[_market]].disputorAddress = msg.sender; dispute[_market][marketTotalDisputes[_market]].disputeString = _disputeString; dispute[_market][marketTotalDisputes[_market]].disputeTimestamp = block.timestamp; disputeVote[_market][marketTotalDisputes[_market]] = new uint[](councilMemberCount + 1); if (!IExoticPositionalMarket(_market).resolved()) { dispute[_market][marketTotalDisputes[_market]].disputeInPositioningPhase = true; } marketManager.disputeMarket(_market, msg.sender); emit NewDispute( _market, _disputeString, dispute[_market][marketTotalDisputes[_market]].disputeInPositioningPhase, msg.sender ); } function voteForDispute( address _market, uint _disputeIndex, uint _disputeCodeVote, uint _winningPosition ) external onlyCouncilMembers { require(marketManager.isActiveMarket(_market), "Not active market."); require(!isMarketClosedForDisputes(_market), "Closed for disputes."); require(_disputeIndex > 0, "Dispute non existent"); require(dispute[_market][_disputeIndex].disputeCode == 0, "Dispute closed."); require(_disputeCodeVote <= VOTING_OPTIONS && _disputeCodeVote > 0, "Invalid dispute code."); if (dispute[_market][_disputeIndex].disputeInPositioningPhase) { require(_disputeCodeVote < ACCEPT_RESULT, "Invalid code."); } else { require(_disputeCodeVote >= ACCEPT_RESULT, "Invalid code in maturity"); require(_disputeIndex > allOpenDisputesCancelledToIndexForMarket[_market], "Already cancelled"); } if (_winningPosition > 0 && _disputeCodeVote == ACCEPT_RESULT) { require( _winningPosition != IExoticPositionalMarket(_market).winningPosition(), "OC can not vote for the resolved position" ); require( disputeWinningPositionChoosenByMember[_market][_disputeIndex][msg.sender] != _winningPosition, "Same winning position" ); if (disputeWinningPositionChoosenByMember[_market][_disputeIndex][msg.sender] == 0) { disputeWinningPositionChoosenByMember[_market][_disputeIndex][msg.sender] = _winningPosition; disputeWinningPositionVotes[_market][_disputeIndex][_winningPosition] = disputeWinningPositionVotes[_market][ _disputeIndex ][_winningPosition].add(1); } else { disputeWinningPositionVotes[_market][_disputeIndex][ disputeWinningPositionChoosenByMember[_market][_disputeIndex][msg.sender] ] = disputeWinningPositionVotes[_market][_disputeIndex][ disputeWinningPositionChoosenByMember[_market][_disputeIndex][msg.sender] ].sub(1); disputeWinningPositionChoosenByMember[_market][_disputeIndex][msg.sender] = _winningPosition; disputeWinningPositionVotes[_market][_disputeIndex][_winningPosition] = disputeWinningPositionVotes[_market][ _disputeIndex ][_winningPosition].add(1); } } // check if already has voted for another option, and revert the vote if (disputeVote[_market][_disputeIndex][councilMemberIndex[msg.sender]] > 0) { disputeVotesCount[_market][_disputeIndex][ disputeVote[_market][_disputeIndex][councilMemberIndex[msg.sender]] ] = disputeVotesCount[_market][_disputeIndex][ disputeVote[_market][_disputeIndex][councilMemberIndex[msg.sender]] ].sub(1); } // record the voting option disputeVote[_market][_disputeIndex][councilMemberIndex[msg.sender]] = _disputeCodeVote; disputeVotesCount[_market][_disputeIndex][_disputeCodeVote] = disputeVotesCount[_market][_disputeIndex][ _disputeCodeVote ].add(1); emit VotedAddedForDispute(_market, _disputeIndex, _disputeCodeVote, _winningPosition, msg.sender); if (disputeVotesCount[_market][_disputeIndex][_disputeCodeVote] > (councilMemberCount.div(2))) { if (_disputeCodeVote == ACCEPT_RESULT) { (uint maxVotesForPosition, uint chosenPosition) = calculateWinningPositionBasedOnVotes( _market, _disputeIndex ); if (maxVotesForPosition > (councilMemberCount.div(2))) { disputeWinningPositionChoosen[_market][_disputeIndex] = chosenPosition; closeDispute(_market, _disputeIndex, _disputeCodeVote); } } else { closeDispute(_market, _disputeIndex, _disputeCodeVote); } } } function closeDispute( address _market, uint _disputeIndex, uint _decidedOption ) internal nonReentrant { require(dispute[_market][_disputeIndex].disputeCode == 0, "Already closed"); require(_decidedOption > 0, "Invalid option"); dispute[_market][_disputeIndex].disputeCode = _decidedOption; marketOpenDisputesCount[_market] = marketOpenDisputesCount[_market] > 0 ? marketOpenDisputesCount[_market].sub(1) : 0; if (_decidedOption == REFUSE_ON_POSITIONING || _decidedOption == REFUSE_MATURE) { // set dispute to false // send disputor BOND to SafeBox // marketManager.getMarketBondAmount(_market); IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser( _market, marketManager.safeBoxAddress(), IExoticPositionalMarket(_market).disputePrice(), DISPUTOR_BOND, dispute[_market][_disputeIndex].disputorAddress ); marketLastClosedDispute[_market] = _disputeIndex; //if it is the last dispute if (_decidedOption == REFUSE_MATURE) { marketManager.setBackstopTimeout(_market); } if (marketOpenDisputesCount[_market] == 0) { marketManager.closeDispute(_market); } emit DisputeClosed(_market, _disputeIndex, _decidedOption); } else if (_decidedOption == ACCEPT_SLASH) { // 4 hours marketManager.setBackstopTimeout(_market); // close dispute flag marketManager.closeDispute(_market); // cancel market marketManager.cancelMarket(_market); marketClosedForDisputes[_market] = true; // send bond to disputor and safeBox IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser( _market, marketManager.safeBoxAddress(), IExoticPositionalMarket(_market).safeBoxLowAmount(), CREATOR_BOND, dispute[_market][_disputeIndex].disputorAddress ); IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser( _market, dispute[_market][_disputeIndex].disputorAddress, (IExoticPositionalMarket(_market).fixedBondAmount().add(IExoticPositionalMarket(_market).disputePrice())) .sub(IExoticPositionalMarket(_market).safeBoxLowAmount()), CREATOR_AND_DISPUTOR, dispute[_market][_disputeIndex].disputorAddress ); marketLastClosedDispute[_market] = _disputeIndex; emit MarketClosedForDisputes(_market, _decidedOption); emit DisputeClosed(_market, _disputeIndex, _decidedOption); } else if (_decidedOption == ACCEPT_NO_SLASH) { marketManager.setBackstopTimeout(_market); marketManager.closeDispute(_market); marketManager.cancelMarket(_market); marketClosedForDisputes[_market] = true; IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser( _market, marketManager.creatorAddress(_market), IExoticPositionalMarket(_market).fixedBondAmount(), CREATOR_BOND, dispute[_market][_disputeIndex].disputorAddress ); IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser( _market, dispute[_market][_disputeIndex].disputorAddress, IExoticPositionalMarket(_market).disputePrice(), DISPUTOR_BOND, dispute[_market][_disputeIndex].disputorAddress ); marketManager.sendRewardToDisputor( _market, dispute[_market][_disputeIndex].disputorAddress, IExoticPositionalMarket(_market).arbitraryRewardForDisputor() ); marketLastClosedDispute[_market] = _disputeIndex; emit MarketClosedForDisputes(_market, _decidedOption); emit DisputeClosed(_market, _disputeIndex, _decidedOption); } else if (_decidedOption == ACCEPT_RESULT) { marketManager.setBackstopTimeout(_market); marketManager.closeDispute(_market); marketManager.resolveMarket(_market, disputeWinningPositionChoosen[_market][_disputeIndex]); IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser( _market, marketManager.safeBoxAddress(), IExoticPositionalMarket(_market).fixedBondAmount(), RESOLVER_BOND, dispute[_market][_disputeIndex].disputorAddress ); IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser( _market, dispute[_market][_disputeIndex].disputorAddress, IExoticPositionalMarket(_market).disputePrice(), DISPUTOR_BOND, dispute[_market][_disputeIndex].disputorAddress ); marketClosedForDisputes[_market] = true; marketLastClosedDispute[_market] = _disputeIndex; emit MarketClosedForDisputes(_market, _decidedOption); emit DisputeClosed(_market, _disputeIndex, _decidedOption); } else if (_decidedOption == ACCEPT_RESET) { marketManager.closeDispute(_market); marketManager.resetMarket(_market); IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser( _market, marketManager.safeBoxAddress(), IExoticPositionalMarket(_market).safeBoxLowAmount(), RESOLVER_BOND, dispute[_market][_disputeIndex].disputorAddress ); IThalesBonds(marketManager.thalesBonds()).sendBondFromMarketToUser( _market, dispute[_market][_disputeIndex].disputorAddress, IExoticPositionalMarket(_market).fixedBondAmount().add(IExoticPositionalMarket(_market).disputePrice()).sub( IExoticPositionalMarket(_market).safeBoxLowAmount() ), RESOLVER_AND_DISPUTOR, dispute[_market][_disputeIndex].disputorAddress ); allOpenDisputesCancelledToIndexForMarket[_market] = marketTotalDisputes[_market]; marketOpenDisputesCount[_market] = 0; marketLastClosedDispute[_market] = _disputeIndex; emit DisputeClosed(_market, _disputeIndex, _decidedOption); } else { // (CANCEL) } } function claimUnclosedDisputeBonds(address _market, uint _disputeIndex) external whenNotPaused { require(canDisputorClaimbackBondFromUnclosedDispute(_market, _disputeIndex, msg.sender), "Unable to claim."); if (marketManager.cancelledByCreator(_market)) { marketOpenDisputesCount[_market] = 0; marketLastClosedDispute[_market] = _disputeIndex; emit DisputeClosed(_market, _disputeIndex, REFUSE_MATURE); } IThalesBonds(marketManager.thalesBonds()).sendOpenDisputeBondFromMarketToDisputor( _market, msg.sender, IThalesBonds(marketManager.thalesBonds()).getDisputorBondForMarket(_market, msg.sender) ); } function calculateWinningPositionBasedOnVotes(address _market, uint _disputeIndex) internal view returns (uint, uint) { uint maxVotes; uint position; for (uint i = 0; i <= IExoticPositionalMarket(_market).positionCount(); i++) { if (disputeWinningPositionVotes[_market][_disputeIndex][i] > maxVotes) { maxVotes = disputeWinningPositionVotes[_market][_disputeIndex][i]; position = i; } } return (maxVotes, position); } function closeMarketForDisputes(address _market) external { require(msg.sender == owner || msg.sender == address(marketManager), "Only manager/owner"); require(!marketClosedForDisputes[_market], "Closed already"); marketClosedForDisputes[_market] = true; emit MarketClosedForDisputes(_market, 0); } function reopenMarketForDisputes(address _market) external onlyOwner { require(marketClosedForDisputes[_market], "Open already"); marketClosedForDisputes[_market] = false; emit MarketReopenedForDisputes(_market); } modifier onlyCouncilMembers() { require(isOracleCouncilMember(msg.sender), "Not OC"); _; } event NewOracleCouncilMember(address councilMember, uint councilMemberCount); event OracleCouncilMemberRemoved(address councilMember, uint councilMemberCount); event NewMarketManager(address marketManager); event NewDispute(address market, string disputeString, bool disputeInPositioningPhase, address disputorAccount); event VotedAddedForDispute(address market, uint disputeIndex, uint disputeCodeVote, uint winningPosition, address voter); event MarketClosedForDisputes(address market, uint disputeFinalCode); event MarketReopenedForDisputes(address market); event DisputeClosed(address market, uint disputeIndex, uint decidedOption); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @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. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier * available, which can be aplied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. */ contract ProxyReentrancyGuard { /// @dev counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter; bool private _initialized; function initNonReentrant() public { require(!_initialized, "Already initialized"); _initialized = true; _guardCounter = 1; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // Clone of syntetix contract without constructor contract ProxyOwned { address public owner; address public nominatedOwner; bool private _initialized; bool private _transferredAtInit; function setOwner(address _owner) public { require(_owner != address(0), "Owner address cannot be 0"); require(!_initialized, "Already initialized, use nominateNewOwner"); _initialized = true; owner = _owner; emit OwnerChanged(address(0), _owner); } function nominateNewOwner(address _owner) external onlyOwner { nominatedOwner = _owner; emit OwnerNominated(_owner); } function acceptOwnership() external { require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership"); emit OwnerChanged(owner, nominatedOwner); owner = nominatedOwner; nominatedOwner = address(0); } function transferOwnershipAtInit(address proxyAddress) external onlyOwner { require(proxyAddress != address(0), "Invalid address"); require(!_transferredAtInit, "Already transferred"); owner = proxyAddress; _transferredAtInit = true; emit OwnerChanged(owner, proxyAddress); } modifier onlyOwner { _onlyOwner(); _; } function _onlyOwner() private view { require(msg.sender == owner, "Only the contract owner may perform this action"); } event OwnerNominated(address newOwner); event OwnerChanged(address oldOwner, address newOwner); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IExoticPositionalMarket { /* ========== VIEWS / VARIABLES ========== */ function isMarketCreated() external view returns (bool); function creatorAddress() external view returns (address); function resolverAddress() external view returns (address); function totalBondAmount() external view returns (uint); function marketQuestion() external view returns (string memory); function marketSource() external view returns (string memory); function positionPhrase(uint index) external view returns (string memory); function getTicketType() external view returns (uint); function positionCount() external view returns (uint); function endOfPositioning() external view returns (uint); function resolvedTime() external view returns (uint); function fixedTicketPrice() external view returns (uint); function creationTime() external view returns (uint); function winningPosition() external view returns (uint); function getTags() external view returns (uint[] memory); function getTotalPlacedAmount() external view returns (uint); function getTotalClaimableAmount() external view returns (uint); function getPlacedAmountPerPosition(uint index) external view returns (uint); function fixedBondAmount() external view returns (uint); function disputePrice() external view returns (uint); function safeBoxLowAmount() external view returns (uint); function arbitraryRewardForDisputor() external view returns (uint); function backstopTimeout() external view returns (uint); function disputeClosedTime() external view returns (uint); function totalUsersTakenPositions() external view returns (uint); function withdrawalAllowed() external view returns (bool); function disputed() external view returns (bool); function resolved() external view returns (bool); function canUsersPlacePosition() external view returns (bool); function canMarketBeResolvedByPDAO() external view returns (bool); function canMarketBeResolved() external view returns (bool); function canUsersClaim() external view returns (bool); function isMarketCancelled() external view returns (bool); function paused() external view returns (bool); function canCreatorCancelMarket() external view returns (bool); function getAllFees() external view returns ( uint, uint, uint, uint ); function canIssueFees() external view returns (bool); function noWinners() external view returns (bool); function transferBondToMarket(address _sender, uint _amount) external; function resolveMarket(uint _outcomePosition, address _resolverAddress) external; function cancelMarket() external; function resetMarket() external; function claimWinningTicketOnBehalf(address _user) external; function openDispute() external; function closeDispute() external; function setBackstopTimeout(uint _timeoutPeriod) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IExoticPositionalMarketManager { /* ========== VIEWS / VARIABLES ========== */ function paused() external view returns (bool); function getActiveMarketAddress(uint _index) external view returns (address); function getActiveMarketIndex(address _marketAddress) external view returns (uint); function isActiveMarket(address _marketAddress) external view returns (bool); function numberOfActiveMarkets() external view returns (uint); function getMarketBondAmount(address _market) external view returns (uint); function maximumPositionsAllowed() external view returns (uint); function paymentToken() external view returns (address); function owner() external view returns (address); function thalesBonds() external view returns (address); function oracleCouncilAddress() external view returns (address); function safeBoxAddress() external view returns (address); function creatorAddress(address _market) external view returns (address); function resolverAddress(address _market) external view returns (address); function isPauserAddress(address _pauserAddress) external view returns (bool); function safeBoxPercentage() external view returns (uint); function creatorPercentage() external view returns (uint); function resolverPercentage() external view returns (uint); function withdrawalPercentage() external view returns (uint); function pDAOResolveTimePeriod() external view returns (uint); function claimTimeoutDefaultPeriod() external view returns (uint); function maxOracleCouncilMembers() external view returns (uint); function fixedBondAmount() external view returns (uint); function disputePrice() external view returns (uint); function safeBoxLowAmount() external view returns (uint); function arbitraryRewardForDisputor() external view returns (uint); function disputeStringLengthLimit() external view returns (uint); function cancelledByCreator(address _market) external view returns (bool); function withdrawalTimePeriod() external view returns (uint); function maxAmountForOpenBidPosition() external view returns (uint); function maxFinalWithdrawPercentage() external view returns (uint); function minFixedTicketPrice() external view returns (uint); function createExoticMarket( string memory _marketQuestion, string memory _marketSource, uint _endOfPositioning, uint _fixedTicketPrice, bool _withdrawalAllowed, uint[] memory _tags, uint _positionCount, string[] memory _positionPhrases ) external; function createCLMarket( string memory _marketQuestion, string memory _marketSource, uint _endOfPositioning, uint _fixedTicketPrice, bool _withdrawalAllowed, uint[] memory _tags, uint _positionCount, uint[] memory _positionsOfCreator, string[] memory _positionPhrases ) external; function disputeMarket(address _marketAddress, address disputor) external; function resolveMarket(address _marketAddress, uint _outcomePosition) external; function resetMarket(address _marketAddress) external; function cancelMarket(address _market) external; function closeDispute(address _market) external; function setBackstopTimeout(address _market) external; function sendMarketBondAmountTo( address _market, address _recepient, uint _amount ) external; function addPauserAddress(address _pauserAddress) external; function removePauserAddress(address _pauserAddress) external; function sendRewardToDisputor( address _market, address _disputorAddress, uint amount ) external; function issueBondsBackToCreatorAndResolver(address _marketAddress) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IThalesBonds { /* ========== VIEWS / VARIABLES ========== */ function getTotalDepositedBondAmountForMarket(address _market) external view returns (uint); function getClaimedBondAmountForMarket(address _market) external view returns (uint); function getClaimableBondAmountForMarket(address _market) external view returns (uint); function getDisputorBondForMarket(address _market, address _disputorAddress) external view returns (uint); function getCreatorBondForMarket(address _market) external view returns (uint); function getResolverBondForMarket(address _market) external view returns (uint); function getCurveQuoteForDifferentCollateral( uint amount, address collateral, bool toSUSD ) external view returns (uint); function sendCreatorBondToMarket( address _market, address _creatorAddress, uint _amount ) external; function sendResolverBondToMarket( address _market, address _resolverAddress, uint _amount ) external; function sendDisputorBondToMarket( address _market, address _disputorAddress, uint _amount ) external; function sendBondFromMarketToUser( address _market, address _account, uint _amount, uint _bondToReduce, address _disputorAddress ) external; function sendOpenDisputeBondFromMarketToDisputor( address _market, address _account, uint _amount ) external; function setOracleCouncilAddress(address _oracleCouncilAddress) external; function setManagerAddress(address _managerAddress) external; function setCurveSUSD( address _curveSUSD, address _dai, address _usdc, address _usdt, bool _curveOnrampEnabled ) external; function issueBondsBackToCreatorAndResolver(address _market) external; function transferToMarket(address _account, uint _amount) external; function transferToMarket( address _account, uint _amount, address collateral, uint expectedPayout, uint additionalSlippage ) external; function transferFromMarket(address _account, uint _amount) external; function transferCreatorToResolverBonds(address _market) external; // function decreaseCreatorVolume(address _market) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { __Context_init_unchained(); } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"disputeIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decidedOption","type":"uint256"}],"name":"DisputeClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"disputeFinalCode","type":"uint256"}],"name":"MarketClosedForDisputes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"}],"name":"MarketReopenedForDisputes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"string","name":"disputeString","type":"string"},{"indexed":false,"internalType":"bool","name":"disputeInPositioningPhase","type":"bool"},{"indexed":false,"internalType":"address","name":"disputorAccount","type":"address"}],"name":"NewDispute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketManager","type":"address"}],"name":"NewMarketManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"councilMember","type":"address"},{"indexed":false,"internalType":"uint256","name":"councilMemberCount","type":"uint256"}],"name":"NewOracleCouncilMember","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"councilMember","type":"address"},{"indexed":false,"internalType":"uint256","name":"councilMemberCount","type":"uint256"}],"name":"OracleCouncilMemberRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"disputeIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"disputeCodeVote","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winningPosition","type":"uint256"},{"indexed":false,"internalType":"address","name":"voter","type":"address"}],"name":"VotedAddedForDispute","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_councilMember","type":"address"}],"name":"addOracleCouncilMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allOpenDisputesCancelledToIndexForMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_disputeIndex","type":"uint256"},{"internalType":"address","name":"_disputorAddress","type":"address"}],"name":"canDisputorClaimbackBondFromUnclosedDispute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"canMarketBeDisputed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_disputeIndex","type":"uint256"}],"name":"claimUnclosedDisputeBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"closeMarketForDisputes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"councilMemberAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"councilMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"councilMemberIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"dispute","outputs":[{"internalType":"address","name":"disputorAddress","type":"address"},{"internalType":"string","name":"disputeString","type":"string"},{"internalType":"uint256","name":"disputeCode","type":"uint256"},{"internalType":"uint256","name":"disputeTimestamp","type":"uint256"},{"internalType":"bool","name":"disputeInPositioningPhase","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"disputeVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"disputeVotesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"disputeWinningPositionChoosen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"disputeWinningPositionChoosenByMember","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"disputeWinningPositionVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"firstMemberThatChoseWinningPosition","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getDispute","outputs":[{"components":[{"internalType":"address","name":"disputorAddress","type":"address"},{"internalType":"string","name":"disputeString","type":"string"},{"internalType":"uint256","name":"disputeCode","type":"uint256"},{"internalType":"uint256","name":"disputeTimestamp","type":"uint256"},{"internalType":"bool","name":"disputeInPositioningPhase","type":"bool"}],"internalType":"struct ThalesOracleCouncil.Dispute","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getDisputeAddressOfDisputor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getDisputeCode","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getDisputeString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getDisputeTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"address","name":"_councilMember","type":"address"}],"name":"getDisputeVoteOfCouncilMember","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getDisputeVotes","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"getMarketLastClosedDispute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"getMarketOpenDisputes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getNumberOfCouncilMembersForMarketDispute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getVotesCountForMarketDispute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getVotesMissingForMarketDispute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initNonReentrant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_marketManager","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"isDisputeCancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"isDisputeOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"isMarketClosedForDisputes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_disputeIndex","type":"uint256"}],"name":"isOpenDisputeCancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_councilMember","type":"address"}],"name":"isOracleCouncilMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketClosedForDisputes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketLastClosedDispute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketManager","outputs":[{"internalType":"contract IExoticPositionalMarketManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketOpenDisputesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketTotalDisputes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"string","name":"_disputeString","type":"string"}],"name":"openDispute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_councilMember","type":"address"}],"name":"removeOracleCouncilMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"}],"name":"reopenMarketForDisputes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketManager","type":"address"}],"name":"setMarketManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"transferOwnershipAtInit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"uint256","name":"_disputeIndex","type":"uint256"},{"internalType":"uint256","name":"_disputeCodeVote","type":"uint256"},{"internalType":"uint256","name":"_winningPosition","type":"uint256"}],"name":"voteForDispute","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061599780620000216000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c806379ba50971161019d578063a8cca32a116100e9578063c69d81d7116100a2578063ebc797721161007c578063ebc7977214610887578063eee7b0c11461088f578063f48bb534146108a2578063f68246ce146108c557600080fd5b8063c69d81d71461084e578063cf65e30f14610861578063d82aff111461087457600080fd5b8063a8cca32a146107b9578063aa7839e8146107cc578063b35bf5db146107df578063c3b2b6e4146107ff578063c3b83f5f14610828578063c63011b21461083b57600080fd5b80638a6ef9841161015657806395e7f02d1161013057806395e7f02d146107425780639906a1f514610766578063a24536f914610786578063a6182c981461079957600080fd5b80638a6ef984146106e05780638da5cb5b14610709578063944450391461072257600080fd5b806379ba5097146106695780637b6cfe9d146106715780637bd72d811461067a578063815feffd1461068d578063876ae352146106ad57806389c0b25c146106cd57600080fd5b806341ed2c121161025c578063677445471161021557806371dba48d116101ef57806371dba48d146105e15780637210cceb1461061a57806375969e321461062d57806375e2570b1461065657600080fd5b8063677445471461058e5780636cd431dd146105a157806371720212146105c157600080fd5b806341ed2c12146104e4578063485cc955146105145780634ee05dd61461052757806353a47bb71461055d578063580a913d146105705780635c975abb1461058357600080fd5b806322cdda1a116102c95780633878970f116102a35780633878970f1461043b57806339672ba3146104755780633baebf43146104a05780633c794933146104d157600080fd5b806322cdda1a146103f25780632db4c70814610415578063380d96221461042857600080fd5b8063084739e41461031157806313af40351461034d57806314ec9a1f146103625780631627540c146103755780631eb4370a1461038857806320564334146103c1575b600080fd5b61033a61031f366004615414565b6001600160a01b03166000908152606c602052604090205490565b6040519081526020015b60405180910390f35b61036061035b366004615414565b6108d8565b005b61033a6103703660046155af565b610a18565b610360610383366004615414565b610a4a565b61033a610396366004615543565b6001600160a01b03919091166000908152607160209081526040808320938352929052206003015490565b61033a6103cf3660046155af565b607660209081526000938452604080852082529284528284209052825290205481565b610405610400366004615543565b610aa0565b6040519015158152602001610344565b610360610423366004615543565b610b02565b61040561043636600461556e565b610e76565b610405610449366004615543565b6001600160a01b0391909116600090815260716020908152604080832093835292905220600201541590565b61033a610483366004615543565b607460209081526000928352604080842090915290825290205481565b61033a6104ae36600461556e565b607560209081526000938452604080852082529284528284209052825290205481565b61033a6104df366004615543565b61119e565b6067546104fc9061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610344565b61036061052236600461544c565b6111cd565b6104fc610535366004615543565b6001600160a01b03918216600090815260716020908152604080832093835292905220541690565b6001546104fc906001600160a01b031681565b61033a61057e366004615543565b6112b9565b60345460ff16610405565b61033a61059c3660046155af565b6112fd565b61033a6105af366004615414565b606c6020526000908152604090205481565b61033a6105cf366004615414565b606d6020526000908152604090205481565b61033a6105ef366004615543565b6001600160a01b03919091166000908152607160209081526040808320938352929052206002015490565b610405610628366004615543565b61133b565b6104fc61063b366004615414565b6070602052600090815260409020546001600160a01b031681565b610360610664366004615414565b6113d2565b61036061152d565b61033a60685481565b610405610688366004615414565b61162a565b61033a61069b366004615414565b606e6020526000908152604090205481565b6106c06106bb366004615543565b6116c5565b60405161034491906157fe565b6103606106db366004615484565b6117fa565b6104fc6106ee36600461563d565b6069602052600090815260409020546001600160a01b031681565b6000546104fc906201000090046001600160a01b031681565b610735610730366004615543565b6122f5565b6040516103449190615787565b610755610750366004615543565b61236a565b604051610344959493929190615723565b61033a610774366004615414565b606a6020526000908152604090205481565b61033a610794366004615543565b61243b565b61033a6107a7366004615414565b606b6020526000908152604090205481565b6104056107c7366004615414565b6124f2565b6103606107da366004615414565b61250f565b6107f26107ed366004615543565b6125bf565b60405161034491906157cb565b61033a61080d366004615414565b6001600160a01b03166000908152606e602052604090205490565b610360610836366004615414565b612670565b610405610849366004615414565b612789565b61036061085c366004615414565b6127e4565b61036061086f366004615414565b6129c9565b610360610882366004615414565b612aec565b610360612b92565b61036061089d3660046155e3565b612bf0565b6104056108b0366004615414565b606f6020526000908152604090205460ff1681565b61033a6108d336600461556e565b6135cd565b6001600160a01b0381166109335760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f7420626520300000000000000060448201526064015b60405180910390fd5b600154600160a01b900460ff161561099f5760405162461bcd60e51b815260206004820152602960248201527f416c726561647920696e697469616c697a65642c20757365206e6f6d696e617460448201526832a732bba7bbb732b960b91b606482015260840161092a565b6001805460ff60a01b1916600160a01b179055600080546001600160a01b03831662010000810262010000600160b01b03199092169190911782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91015b60405180910390a150565b60736020528260005260406000206020528160005260406000208160078110610a4057600080fd5b0154925083915050565b610a52613672565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290602001610a0d565b6001600160a01b038216600090815260716020908152604080832084845290915281206002015460031480610afb57506001600160a01b03831660009081526071602090815260408083208584529091529020600201546006145b9392505050565b60345460ff1615610b485760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161092a565b610b53828233610e76565b610b925760405162461bcd60e51b815260206004820152601060248201526f2ab730b13632903a379031b630b4b69760811b604482015260640161092a565b60675460405163fbdec41360e01b81526001600160a01b0384811660048301526101009092049091169063fbdec4139060240160206040518083038186803b158015610bdd57600080fd5b505afa158015610bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c15919061561d565b15610c6e576001600160a01b0382166000908152606e60209081526040808320839055606c909152908190208290555160008051602061594283398151915290610c659084908490600690615766565b60405180910390a15b606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015610cbc57600080fd5b505afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf49190615430565b6001600160a01b031663403b14128333606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015610d5257600080fd5b505afa158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a9190615430565b6040516380af208b60e01b81526001600160a01b03888116600483015233602483015291909116906380af208b9060440160206040518083038186803b158015610dd357600080fd5b505afa158015610de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0b9190615655565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610e5a57600080fd5b505af1158015610e6e573d6000803e3d6000fd5b505050505050565b606754604051633761c52760e11b81526001600160a01b03858116600483015260009261010090041690636ec38a4e9060240160206040518083038186803b158015610ec157600080fd5b505afa158015610ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef9919061561d565b8015610f1d57506001600160a01b0384166000908152606b60205260409020548311155b8015610fec57506001600160a01b0384166000908152606f602052604090205460ff1680610f6357506001600160a01b0384166000908152606d60205260409020548311155b80610fec575060675460405163fbdec41360e01b81526001600160a01b0386811660048301526101009092049091169063fbdec4139060240160206040518083038186803b158015610fb457600080fd5b505afa158015610fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fec919061561d565b801561101f57506001600160a01b0384811660009081526071602090815260408083208784529091529020548116908316145b801561104f57506001600160a01b0384166000908152607160209081526040808320868452909152902060020154155b801561107357506001600160a01b0384166000908152606c60205260409020548314155b801561118757506000606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b1580156110ca57600080fd5b505afa1580156110de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111029190615430565b6040516380af208b60e01b81526001600160a01b038781166004830152858116602483015291909116906380af208b9060440160206040518083038186803b15801561114d57600080fd5b505afa158015611161573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111859190615655565b115b1561119457506001610afb565b5060009392505050565b6001600160a01b0382166000908152607260209081526040808320848452909152812054610afb9060016136ec565b600054610100900460ff166111e85760005460ff16156111ec565b303b155b61124f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161092a565b600054610100900460ff16158015611271576000805461ffff19166101011790555b61127a836108d8565b611282612b92565b60678054610100600160a81b0319166101006001600160a01b0385160217905580156112b4576000805461ff00191690555b505050565b6000610afb6112c8848461243b565b6001600160a01b03851660009081526072602090815260408083208784529091529020546112f79060016136ec565b906136ec565b6072602052826000526040600020602052816000526040600020818154811061132557600080fd5b9060005260206000200160009250925050505481565b6001600160a01b0382166000908152606f602052604081205460ff168061137a57506001600160a01b0383166000908152606d60205260409020548211155b80156113aa57506001600160a01b0383166000908152607160209081526040808320858452909152902060020154155b8015610afb5750506001600160a01b03919091166000908152606c6020526040902054141590565b6113da613672565b6113e3816124f2565b6113ff5760405162461bcd60e51b815260040161092a906157de565b606880546000908152606960208181526040808420546001600160a01b038781168652606a8085528387208054885286865284882080546001600160a01b0319169484169490941790935591548754875294845282862054168552909152909120555461146d9060016136ec565b6068556001600160a01b038181166000818152606a6020526040808220919091556067549051631404a95d60e11b8152600481019290925261010090049091169063280952ba90602401600060405180830381600087803b1580156114d157600080fd5b505af11580156114e5573d6000803e3d6000fd5b5050606854604080516001600160a01b038616815260208101929092527f86d1787a7c5d5a35ae49625fd6b646c884e5449312f20d0068fba244a8c657bb9350019050610a0d565b6001546001600160a01b031633146115a55760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b606482015260840161092a565b60005460015460408051620100009093046001600160a01b03908116845290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600180546000805462010000600160b01b0319166001600160a01b03831662010000021790556001600160a01b0319169055565b6001600160a01b0381166000908152606f602052604081205460ff161580156116bf5750816001600160a01b031663a9daaed56040518163ffffffff1660e01b815260040160206040518083038186803b15801561168757600080fd5b505afa15801561169b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bf919061561d565b92915050565b6117026040518060a0016040528060006001600160a01b031681526020016060815260200160008152602001600081526020016000151581525090565b6001600160a01b038084166000908152607160209081526040808320868452825291829020825160a08101909352805490931682526001830180549293929184019161174d906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611779906158a7565b80156117c65780601f1061179b576101008083540402835291602001916117c6565b820191906000526020600020905b8154815290600101906020018083116117a957829003601f168201915b5050509183525050600282015460208201526003820154604082015260049091015460ff1615156060909101529392505050565b60345460ff16156118405760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161092a565b606754604051633761c52760e11b81526001600160a01b03848116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b15801561188b57600080fd5b505afa15801561189f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c3919061561d565b6118fc5760405162461bcd60e51b815260206004820152600a6024820152694e6f742041637469766560b01b604482015260640161092a565b61190582612789565b156119485760405162461bcd60e51b8152602060048201526013602482015272436c6f73656420666f7220646973707574657360681b604482015260640161092a565b60675460405163677755bb60e01b81526001600160a01b03848116600483015233926101009004169063677755bb9060240160206040518083038186803b15801561199257600080fd5b505afa1580156119a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ca9190615430565b6001600160a01b03161415611a215760405162461bcd60e51b815260206004820152601760248201527f43726561746f722063616e206e6f742064697370757465000000000000000000604482015260640161092a565b611a2a336124f2565b15611a6d5760405162461bcd60e51b815260206004820152601360248201527227a19031b0b7103737ba103234b9b83aba329760691b604482015260640161092a565b816001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b158015611aa657600080fd5b505afa158015611aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ade9190615655565b606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2c57600080fd5b505afa158015611b40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b649190615430565b6040516370a0823160e01b81523360048201526001600160a01b0391909116906370a082319060240160206040518083038186803b158015611ba557600080fd5b505afa158015611bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bdd9190615655565b1015611c245760405162461bcd60e51b81526020600482015260166024820152754c6f7720616d6f756e7420666f72206469737075746560501b604482015260640161092a565b816001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b158015611c5d57600080fd5b505afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c959190615655565b606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015611ce357600080fd5b505afa158015611cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1b9190615430565b6001600160a01b031663dd62ed3e33606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015611d7857600080fd5b505afa158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db09190615430565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b158015611df657600080fd5b505afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e9190615655565b1015611e6c5760405162461bcd60e51b815260206004820152600d60248201526c27379030b63637bbb0b731b29760991b604482015260640161092a565b604051602001611e8790602080825260009082015260400190565b6040516020818303038152906040528051906020012081604051602001611eae91906157cb565b604051602081830303815290604052805190602001201415611f0b5760405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206469737075746520737472696e6760501b604482015260640161092a565b606760019054906101000a90046001600160a01b03166001600160a01b031663592740b26040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5957600080fd5b505afa158015611f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f919190615655565b81511080611fa05750606e8151105b611fe45760405162461bcd60e51b81526020600482015260156024820152740a6e8e4d2dcce40caf0c6cacac8e640d8cadccee8d605b1b604482015260640161092a565b6001600160a01b0382166000908152606b60205260409020546120089060016136f8565b6001600160a01b0383166000908152606b6020908152604080832093909355606e905220546120389060016136f8565b6001600160a01b0383166000908152606e602090815260408083209390935560718152828220606b82528383208054845281835284842080546001600160a01b031916331790555483528152919020825161209c9260019290920191840190615341565b506001600160a01b0382166000908152607160209081526040808320606b83528184205484529091529020426003909101556068546120dc906001615858565b67ffffffffffffffff81111561210257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561212b578160200160208202803683370190505b506001600160a01b0383166000908152607260209081526040808320606b83528184205484528252909120825161216893919291909101906153c5565b50816001600160a01b0316633f6fa6556040518163ffffffff1660e01b815260040160206040518083038186803b1580156121a257600080fd5b505afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da919061561d565b612217576001600160a01b0382166000908152607160209081526040808320606b83528184205484529091529020600401805460ff191660011790555b60675460405163019e079960e61b81526001600160a01b03848116600483015233602483015261010090920490911690636781e64090604401600060405180830381600087803b15801561226a57600080fd5b505af115801561227e573d6000803e3d6000fd5b5050506001600160a01b0383166000908152607160209081526040808320606b8352818420548452909152908190206004015490517ffd91eaa9167cff43800cbd454f3b6fb7051298a311ed47ec4f7fcf2c5a78738792506122e9918591859160ff169033906156e8565b60405180910390a15050565b6001600160a01b038216600090815260726020908152604080832084845282529182902080548351818402810184019094528084526060939283018282801561235d57602002820191906000526020600020905b815481526020019060010190808311612349575b5050505050905092915050565b6071602090815260009283526040808420909152908252902080546001820180546001600160a01b0390921692916123a1906158a7565b80601f01602080910402602001604051908101604052809291908181526020018280546123cd906158a7565b801561241a5780601f106123ef5761010080835404028352916020019161241a565b820191906000526020600020905b8154815290600101906020018083116123fd57829003601f168201915b50505050600283015460038401546004909401549293909290915060ff1685565b60008060015b6001600160a01b03851660009081526072602090815260408083208784529091529020548110156124ea576001600160a01b038516600090815260726020908152604080832087845290915281208054839081106124af57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154116124c65760006124c9565b60015b6124d69060ff1683615858565b9150806124e2816158e2565b915050612441565b509392505050565b6001600160a01b03166000908152606a6020526040902054151590565b612517613672565b6001600160a01b0381166000908152606f602052604090205460ff1661256e5760405162461bcd60e51b815260206004820152600c60248201526b4f70656e20616c726561647960a01b604482015260640161092a565b6001600160a01b0381166000818152606f6020908152604091829020805460ff1916905590519182527fba1dc3bb562a92f019150e93749bcdeeb5d64787f37a856f4563f38a12877b0e9101610a0d565b6001600160a01b038216600090815260716020908152604080832084845290915290206001018054606091906125f4906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054612620906158a7565b801561235d5780601f106126425761010080835404028352916020019161235d565b820191906000526020600020905b815481529060010190602001808311612650575093979650505050505050565b612678613672565b6001600160a01b0381166126c05760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161092a565b600154600160a81b900460ff16156127105760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481d1c985b9cd9995c9c9959606a1b604482015260640161092a565b600080546001600160a01b038381166201000081810262010000600160b01b031990941693909317938490556001805460ff60a81b1916600160a81b1790556040805193909404909116825260208201527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9101610a0d565b6001600160a01b0381166000908152606f602052604081205460ff16806116bf5750816001600160a01b0316631897c8fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561168757600080fd5b6127ec613672565b6001600160a01b0381166128355760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21030b2323932b9b99760811b604482015260640161092a565b606760019054906101000a90046001600160a01b03166001600160a01b0316634d736d586040518163ffffffff1660e01b815260040160206040518083038186803b15801561288357600080fd5b505afa158015612897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bb9190615655565b60685411156129025760405162461bcd60e51b815260206004820152601360248201527213d0c81b595b58995c9cc8195e18d959591959606a1b604482015260640161092a565b61290b816124f2565b156129455760405162461bcd60e51b815260206004820152600a602482015269416c7265616479204f4360b01b604482015260640161092a565b6068546129539060016136f8565b6068818155600091825260696020908152604080842080546001600160a01b0319166001600160a01b0387169081179091559254838552606a8352938190208490558051928352908201929092527f7b669209e50faed123ff5edb840280b4529293d7408675dbe630eb19cc12e5bb9101610a0d565b6000546201000090046001600160a01b03163314806129f7575060675461010090046001600160a01b031633145b612a385760405162461bcd60e51b815260206004820152601260248201527127b7363c9036b0b730b3b2b917b7bbb732b960711b604482015260640161092a565b6001600160a01b0381166000908152606f602052604090205460ff1615612a925760405162461bcd60e51b815260206004820152600e60248201526d436c6f73656420616c726561647960901b604482015260640161092a565b6001600160a01b0381166000818152606f60209081526040808320805460ff191660011790558051938452908301919091527f72ae4e77c5952790aabb8be5b30e11bc87653ea8bb7558b88a1f8bf466fb71c59101610a0d565b612af4613672565b6001600160a01b038116612b3c5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161092a565b60678054610100600160a81b0319166101006001600160a01b038416908102919091179091556040519081527f23e455350850b05998316f502175b427a275f4d5be9e2a04d530ea39239e1b6f90602001610a0d565b60675460ff1615612bdb5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161092a565b6067805460ff19166001908117909155606655565b612bf9336124f2565b612c155760405162461bcd60e51b815260040161092a906157de565b606754604051633761c52760e11b81526001600160a01b03868116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b158015612c6057600080fd5b505afa158015612c74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c98919061561d565b612cd95760405162461bcd60e51b81526020600482015260126024820152712737ba1030b1ba34bb329036b0b935b2ba1760711b604482015260640161092a565b612ce284612789565b15612d265760405162461bcd60e51b815260206004820152601460248201527321b637b9b2b2103337b9103234b9b83aba32b99760611b604482015260640161092a565b60008311612d6d5760405162461bcd60e51b8152602060048201526014602482015273111a5cdc1d5d19481b9bdb88195e1a5cdd195b9d60621b604482015260640161092a565b6001600160a01b038416600090815260716020908152604080832086845290915290206002015415612dd35760405162461bcd60e51b815260206004820152600f60248201526e2234b9b83aba329031b637b9b2b21760891b604482015260640161092a565b60078211158015612de45750600082115b612e285760405162461bcd60e51b815260206004820152601560248201527424b73b30b634b2103234b9b83aba329031b7b2329760591b604482015260640161092a565b6001600160a01b038416600090815260716020908152604080832086845290915290206004015460ff1615612e9c5760048210612e975760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21031b7b2329760991b604482015260640161092a565b612f48565b6004821015612eed5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f646520696e206d617475726974790000000000000000604482015260640161092a565b6001600160a01b0384166000908152606d60205260409020548311612f485760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e4818d85b98d95b1b1959607a1b604482015260640161092a565b600081118015612f585750600482145b1561323257836001600160a01b0316632486d6716040518163ffffffff1660e01b815260040160206040518083038186803b158015612f9657600080fd5b505afa158015612faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fce9190615655565b81141561302f5760405162461bcd60e51b815260206004820152602960248201527f4f432063616e206e6f7420766f746520666f7220746865207265736f6c766564604482015268103837b9b4ba34b7b760b91b606482015260840161092a565b6001600160a01b038416600090815260756020908152604080832086845282528083203384529091529020548114156130a25760405162461bcd60e51b815260206004820152601560248201527429b0b6b2903bb4b73734b733903837b9b4ba34b7b760591b604482015260640161092a565b6001600160a01b03841660009081526075602090815260408083208684528252808320338452909152902054613155576001600160a01b038416600081815260756020908152604080832087845282528083203384528252808320859055928252607681528282208683528152828220848352905220546131249060016136f8565b6001600160a01b03851660009081526076602090815260408083208784528252808320858452909152902055613232565b6001600160a01b03841660008181526076602090815260408083208784528252808320938352607582528083208784528252808320338452825280832054835292905220546131a59060016136ec565b6001600160a01b0385166000818152607660209081526040808320888452825280832093835260758252808320888452825280832033845282528083208054845293909152808220939093559083905582815220546132059060016136f8565b6001600160a01b038516600090815260766020908152604080832087845282528083208584529091529020555b6001600160a01b03841660009081526072602090815260408083208684528252808320338452606a9092528220548154811061327e57634e487b7160e01b600052603260045260246000fd5b906000526020600020015411156133b5576001600160a01b03841660008181526073602090815260408083208784528252808320938352607282528083208784528252808320338452606a90925290912054815461332a936001939092909181106132f957634e487b7160e01b600052603260045260246000fd5b90600052602060002001546007811061332257634e487b7160e01b600052603260045260246000fd5b0154906136ec565b6001600160a01b03851660008181526073602090815260408083208884528252808320938352607282528083208884528252808320338452606a909252909120548154811061338957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600781106133b257634e487b7160e01b600052603260045260246000fd5b01555b6001600160a01b03841660009081526072602090815260408083208684528252808320338452606a90925290912054815484929190811061340657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092556001600160a01b03861681526073825260408082208683529092522061346190600190846007811061345957634e487b7160e01b600052603260045260246000fd5b0154906136f8565b6001600160a01b0385166000908152607360209081526040808320878452909152902083600781106134a357634e487b7160e01b600052603260045260246000fd5b0155604080516001600160a01b038616815260208101859052908101839052606081018290523360808201527fe5a4e79fc191615470d7a161db08d0e2f18b21da5df60451d35a2fcac7524a8e9060a00160405180910390a160685461350a906002613704565b6001600160a01b03851660009081526073602090815260408083208784529091529020836007811061354c57634e487b7160e01b600052603260045260246000fd5b015411156135c75760048214156135bc5760008061356a8686613710565b606854919350915061357d906002613704565b8211156135b5576001600160a01b038616600090815260746020908152604080832088845290915290208190556135b5868686613813565b50506135c7565b6135c7848484613813565b50505050565b60006135d8826124f2565b1561363e576001600160a01b03808516600090815260726020908152604080832087845282528083209386168352606a9091529020548154811061362c57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050610afb565b613647826124f2565b6136635760405162461bcd60e51b815260040161092a906157de565b50670de0b6b3a7640000610afb565b6000546201000090046001600160a01b031633146136ea5760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b606482015260840161092a565b565b6000610afb8284615890565b6000610afb8284615858565b6000610afb8284615870565b60008060008060005b866001600160a01b031663e7702d056040518163ffffffff1660e01b815260040160206040518083038186803b15801561375257600080fd5b505afa158015613766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061378a9190615655565b8111613807576001600160a01b038716600090815260766020908152604080832089845282528083208484529091529020548310156137f5576001600160a01b0387166000908152607660209081526040808320898452825280832084845290915290205492509050805b806137ff816158e2565b915050613719565b50909590945092505050565b6001606660008282546138269190615858565b90915550506066546001600160a01b0384166000908152607160209081526040808320868452909152902060020154156138935760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e4818db1bdcd95960921b604482015260640161092a565b600082116138d45760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21037b83a34b7b760911b604482015260640161092a565b6001600160a01b03841660008181526071602090815260408083208784528252808320600201869055928252606e90522054613911576000613935565b6001600160a01b0384166000908152606e60205260409020546139359060016136ec565b6001600160a01b0385166000908152606e6020526040902055600382148061395d5750600682145b15613ca957606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b1580156139b057600080fd5b505afa1580156139c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e89190615430565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b158015613a4557600080fd5b505afa158015613a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a7d9190615430565b876001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b158015613ab657600080fd5b505afa158015613aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aee9190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152613b3c9594939260679216906004016156b8565b600060405180830381600087803b158015613b5657600080fd5b505af1158015613b6a573d6000803e3d6000fd5b5050506001600160a01b0385166000908152606c60205260409020849055506006821415613bf857606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b158015613bdf57600080fd5b505af1158015613bf3573d6000803e3d6000fd5b505050505b6001600160a01b0384166000908152606e6020526040902054613c7b576067546040516305c6035560e11b81526001600160a01b03868116600483015261010090920490911690630b8c06aa90602401600060405180830381600087803b158015613c6257600080fd5b505af1158015613c76573d6000803e3d6000fd5b505050505b600080516020615942833981519152848484604051613c9c93929190615766565b60405180910390a16152f0565b600182141561430857606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b158015613cff57600080fd5b505af1158015613d13573d6000803e3d6000fd5b50506067546040516305c6035560e11b81526001600160a01b0388811660048301526101009092049091169250630b8c06aa9150602401600060405180830381600087803b158015613d6457600080fd5b505af1158015613d78573d6000803e3d6000fd5b5050606754604051630fe40c4760e41b81526001600160a01b038881166004830152610100909204909116925063fe40c4709150602401600060405180830381600087803b158015613dc957600080fd5b505af1158015613ddd573d6000803e3d6000fd5b5050506001600160a01b038086166000908152606f6020908152604091829020805460ff19166001179055606754825163dfb8bae760e01b81529251610100909104909316935063dfb8bae792600480840193829003018186803b158015613e4457600080fd5b505afa158015613e58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e7c9190615430565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b158015613ed957600080fd5b505afa158015613eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f119190615430565b876001600160a01b031663b0092db76040518163ffffffff1660e01b815260040160206040518083038186803b158015613f4a57600080fd5b505afa158015613f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f829190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152613fd09594939260659216906004016156b8565b600060405180830381600087803b158015613fea57600080fd5b505af1158015613ffe573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b15801561405057600080fd5b505afa158015614064573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140889190615430565b6001600160a01b03858116600081815260716020908152604080832089845282529182902054825163b0092db760e01b81529251958516956327b153a0958b959216936142129363b0092db792600480840193829003018186803b1580156140ef57600080fd5b505afa158015614103573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141279190615655565b6112f78a6001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b15801561416357600080fd5b505afa158015614177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061419b9190615655565b8b6001600160a01b03166389265ca76040518163ffffffff1660e01b815260040160206040518083038186803b1580156141d457600080fd5b505afa1580156141e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420c9190615655565b906136f8565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526142609594939260689216906004016156b8565b600060405180830381600087803b15801561427a57600080fd5b505af115801561428e573d6000803e3d6000fd5b505050506001600160a01b0384166000818152606c6020908152604091829020869055815192835282018490527f72ae4e77c5952790aabb8be5b30e11bc87653ea8bb7558b88a1f8bf466fb71c591015b60405180910390a1600080516020615942833981519152848484604051613c9c93929190615766565b60028214156148de57606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b15801561435e57600080fd5b505af1158015614372573d6000803e3d6000fd5b50506067546040516305c6035560e11b81526001600160a01b0388811660048301526101009092049091169250630b8c06aa9150602401600060405180830381600087803b1580156143c357600080fd5b505af11580156143d7573d6000803e3d6000fd5b5050606754604051630fe40c4760e41b81526001600160a01b038881166004830152610100909204909116925063fe40c4709150602401600060405180830381600087803b15801561442857600080fd5b505af115801561443c573d6000803e3d6000fd5b5050506001600160a01b038086166000908152606f6020908152604091829020805460ff19166001179055606754825163dfb8bae760e01b81529251610100909104909316935063dfb8bae792600480840193829003018186803b1580156144a357600080fd5b505afa1580156144b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144db9190615430565b60675460405163677755bb60e01b81526001600160a01b038781166004830152928316926327b153a09288926101009091049091169063677755bb9060240160206040518083038186803b15801561453257600080fd5b505afa158015614546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061456a9190615430565b876001600160a01b03166389265ca76040518163ffffffff1660e01b815260040160206040518083038186803b1580156145a357600080fd5b505afa1580156145b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145db9190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526146299594939260659216906004016156b8565b600060405180830381600087803b15801561464357600080fd5b505af1158015614657573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b1580156146a957600080fd5b505afa1580156146bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146e19190615430565b6001600160a01b038581166000818152607160209081526040808320898452825291829020548251636da19c3560e01b81529251958516956327b153a0958b959216939192636da19c359260048082019391829003018186803b15801561474757600080fd5b505afa15801561475b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061477f9190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526147cd9594939260679216906004016156b8565b600060405180830381600087803b1580156147e757600080fd5b505af11580156147fb573d6000803e3d6000fd5b50506067546001600160a01b0387811660008181526071602090815260408083208b845282529182902054825163465591f960e01b815292516101009096048516975063b33e3afb96508b9594169363465591f9926004808201939291829003018186803b15801561486c57600080fd5b505afa158015614880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148a49190615655565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401614260565b6004821415614e4a57606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b15801561493457600080fd5b505af1158015614948573d6000803e3d6000fd5b50506067546040516305c6035560e11b81526001600160a01b0388811660048301526101009092049091169250630b8c06aa9150602401600060405180830381600087803b15801561499957600080fd5b505af11580156149ad573d6000803e3d6000fd5b50506067546001600160a01b0387811660008181526074602090815260408083208b84529091529081902054905163b91f5e3560e01b81526004810192909252602482015261010090920416925063b91f5e359150604401600060405180830381600087803b158015614a1f57600080fd5b505af1158015614a33573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015614a8557600080fd5b505afa158015614a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614abd9190615430565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b158015614b1a57600080fd5b505afa158015614b2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b529190615430565b876001600160a01b03166389265ca76040518163ffffffff1660e01b815260040160206040518083038186803b158015614b8b57600080fd5b505afa158015614b9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bc39190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152614c119594939260669216906004016156b8565b600060405180830381600087803b158015614c2b57600080fd5b505af1158015614c3f573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015614c9157600080fd5b505afa158015614ca5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cc99190615430565b6001600160a01b038581166000818152607160209081526040808320898452825291829020548251636da19c3560e01b81529251958516956327b153a0958b959216939192636da19c359260048082019391829003018186803b158015614d2f57600080fd5b505afa158015614d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d679190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152614db59594939260679216906004016156b8565b600060405180830381600087803b158015614dcf57600080fd5b505af1158015614de3573d6000803e3d6000fd5b505050506001600160a01b0384166000818152606f60209081526040808320805460ff19166001179055606c825291829020869055815192835282018490527f72ae4e77c5952790aabb8be5b30e11bc87653ea8bb7558b88a1f8bf466fb71c591016142df565b60058214156152f0576067546040516305c6035560e11b81526001600160a01b03868116600483015261010090920490911690630b8c06aa90602401600060405180830381600087803b158015614ea057600080fd5b505af1158015614eb4573d6000803e3d6000fd5b50506067546040516304268b7560e31b81526001600160a01b03888116600483015261010090920490911692506321345ba89150602401600060405180830381600087803b158015614f0557600080fd5b505af1158015614f19573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015614f6b57600080fd5b505afa158015614f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fa39190615430565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b15801561500057600080fd5b505afa158015615014573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150389190615430565b876001600160a01b031663b0092db76040518163ffffffff1660e01b815260040160206040518083038186803b15801561507157600080fd5b505afa158015615085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150a99190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526150f79594939260669216906004016156b8565b600060405180830381600087803b15801561511157600080fd5b505af1158015615125573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b15801561517757600080fd5b505afa15801561518b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151af9190615430565b6001600160a01b03858116600081815260716020908152604080832089845282529182902054825163b0092db760e01b81529251958516956327b153a0958b959216936152169363b0092db792600480840193829003018186803b1580156140ef57600080fd5b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526152649594939260699216906004016156b8565b600060405180830381600087803b15801561527e57600080fd5b505af1158015615292573d6000803e3d6000fd5b5050506001600160a01b0385166000908152606b6020908152604080832054606d835281842055606e8252808320839055606c90915290819020859055516000805160206159428339815191529150613c9c90869086908690615766565b60665481146135c75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161092a565b82805461534d906158a7565b90600052602060002090601f01602090048101928261536f57600085556153b5565b82601f1061538857805160ff19168380011785556153b5565b828001600101855582156153b5579182015b828111156153b557825182559160200191906001019061539a565b506153c19291506153ff565b5090565b8280548282559060005260206000209081019282156153b557916020028201828111156153b557825182559160200191906001019061539a565b5b808211156153c15760008155600101615400565b600060208284031215615425578081fd5b8135610afb81615929565b600060208284031215615441578081fd5b8151610afb81615929565b6000806040838503121561545e578081fd5b823561546981615929565b9150602083013561547981615929565b809150509250929050565b60008060408385031215615496578182fd5b82356154a181615929565b9150602083013567ffffffffffffffff808211156154bd578283fd5b818501915085601f8301126154d0578283fd5b8135818111156154e2576154e2615913565b604051601f8201601f19908116603f0116810190838211818310171561550a5761550a615913565b81604052828152886020848701011115615522578586fd5b82602086016020830137856020848301015280955050505050509250929050565b60008060408385031215615555578182fd5b823561556081615929565b946020939093013593505050565b600080600060608486031215615582578081fd5b833561558d81615929565b92506020840135915060408401356155a481615929565b809150509250925092565b6000806000606084860312156155c3578283fd5b83356155ce81615929565b95602085013595506040909401359392505050565b600080600080608085870312156155f8578081fd5b843561560381615929565b966020860135965060408601359560600135945092505050565b60006020828403121561562e578081fd5b81518015158114610afb578182fd5b60006020828403121561564e578081fd5b5035919050565b600060208284031215615666578081fd5b5051919050565b60008151808452815b8181101561569257602081850181015186830182015201615676565b818111156156a35782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b039586168152938516602085015260408401929092526060830152909116608082015260a00190565b600060018060a01b0380871683526080602084015261570a608084018761566d565b9415156040840152929092166060909101525092915050565b6001600160a01b038616815260a0602082018190526000906157479083018761566d565b6040830195909552506060810192909252151560809091015292915050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b818110156157bf578351835292840192918401916001016157a3565b50909695505050505050565b602081526000610afb602083018461566d565b6020808252600690820152654e6f74204f4360d01b604082015260600190565b602080825282516001600160a01b03168282015282015160a0604083015260009061582c60c084018261566d565b905060408401516060840152606084015160808401526080840151151560a08401528091505092915050565b6000821982111561586b5761586b6158fd565b500190565b60008261588b57634e487b7160e01b81526012600452602481fd5b500490565b6000828210156158a2576158a26158fd565b500390565b600181811c908216806158bb57607f821691505b602082108114156158dc57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156158f6576158f66158fd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461593e57600080fd5b5056fe22030d24c56fdfb5edf6a4fc074d3ae64f4a1de374968f0a0871f9fa5d494c4ea2646970667358221220e4f54674cd54894aa723c787a8297e6e3c5b1d054eb51d458fff5b1d0a9ae94d64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061030c5760003560e01c806379ba50971161019d578063a8cca32a116100e9578063c69d81d7116100a2578063ebc797721161007c578063ebc7977214610887578063eee7b0c11461088f578063f48bb534146108a2578063f68246ce146108c557600080fd5b8063c69d81d71461084e578063cf65e30f14610861578063d82aff111461087457600080fd5b8063a8cca32a146107b9578063aa7839e8146107cc578063b35bf5db146107df578063c3b2b6e4146107ff578063c3b83f5f14610828578063c63011b21461083b57600080fd5b80638a6ef9841161015657806395e7f02d1161013057806395e7f02d146107425780639906a1f514610766578063a24536f914610786578063a6182c981461079957600080fd5b80638a6ef984146106e05780638da5cb5b14610709578063944450391461072257600080fd5b806379ba5097146106695780637b6cfe9d146106715780637bd72d811461067a578063815feffd1461068d578063876ae352146106ad57806389c0b25c146106cd57600080fd5b806341ed2c121161025c578063677445471161021557806371dba48d116101ef57806371dba48d146105e15780637210cceb1461061a57806375969e321461062d57806375e2570b1461065657600080fd5b8063677445471461058e5780636cd431dd146105a157806371720212146105c157600080fd5b806341ed2c12146104e4578063485cc955146105145780634ee05dd61461052757806353a47bb71461055d578063580a913d146105705780635c975abb1461058357600080fd5b806322cdda1a116102c95780633878970f116102a35780633878970f1461043b57806339672ba3146104755780633baebf43146104a05780633c794933146104d157600080fd5b806322cdda1a146103f25780632db4c70814610415578063380d96221461042857600080fd5b8063084739e41461031157806313af40351461034d57806314ec9a1f146103625780631627540c146103755780631eb4370a1461038857806320564334146103c1575b600080fd5b61033a61031f366004615414565b6001600160a01b03166000908152606c602052604090205490565b6040519081526020015b60405180910390f35b61036061035b366004615414565b6108d8565b005b61033a6103703660046155af565b610a18565b610360610383366004615414565b610a4a565b61033a610396366004615543565b6001600160a01b03919091166000908152607160209081526040808320938352929052206003015490565b61033a6103cf3660046155af565b607660209081526000938452604080852082529284528284209052825290205481565b610405610400366004615543565b610aa0565b6040519015158152602001610344565b610360610423366004615543565b610b02565b61040561043636600461556e565b610e76565b610405610449366004615543565b6001600160a01b0391909116600090815260716020908152604080832093835292905220600201541590565b61033a610483366004615543565b607460209081526000928352604080842090915290825290205481565b61033a6104ae36600461556e565b607560209081526000938452604080852082529284528284209052825290205481565b61033a6104df366004615543565b61119e565b6067546104fc9061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610344565b61036061052236600461544c565b6111cd565b6104fc610535366004615543565b6001600160a01b03918216600090815260716020908152604080832093835292905220541690565b6001546104fc906001600160a01b031681565b61033a61057e366004615543565b6112b9565b60345460ff16610405565b61033a61059c3660046155af565b6112fd565b61033a6105af366004615414565b606c6020526000908152604090205481565b61033a6105cf366004615414565b606d6020526000908152604090205481565b61033a6105ef366004615543565b6001600160a01b03919091166000908152607160209081526040808320938352929052206002015490565b610405610628366004615543565b61133b565b6104fc61063b366004615414565b6070602052600090815260409020546001600160a01b031681565b610360610664366004615414565b6113d2565b61036061152d565b61033a60685481565b610405610688366004615414565b61162a565b61033a61069b366004615414565b606e6020526000908152604090205481565b6106c06106bb366004615543565b6116c5565b60405161034491906157fe565b6103606106db366004615484565b6117fa565b6104fc6106ee36600461563d565b6069602052600090815260409020546001600160a01b031681565b6000546104fc906201000090046001600160a01b031681565b610735610730366004615543565b6122f5565b6040516103449190615787565b610755610750366004615543565b61236a565b604051610344959493929190615723565b61033a610774366004615414565b606a6020526000908152604090205481565b61033a610794366004615543565b61243b565b61033a6107a7366004615414565b606b6020526000908152604090205481565b6104056107c7366004615414565b6124f2565b6103606107da366004615414565b61250f565b6107f26107ed366004615543565b6125bf565b60405161034491906157cb565b61033a61080d366004615414565b6001600160a01b03166000908152606e602052604090205490565b610360610836366004615414565b612670565b610405610849366004615414565b612789565b61036061085c366004615414565b6127e4565b61036061086f366004615414565b6129c9565b610360610882366004615414565b612aec565b610360612b92565b61036061089d3660046155e3565b612bf0565b6104056108b0366004615414565b606f6020526000908152604090205460ff1681565b61033a6108d336600461556e565b6135cd565b6001600160a01b0381166109335760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f7420626520300000000000000060448201526064015b60405180910390fd5b600154600160a01b900460ff161561099f5760405162461bcd60e51b815260206004820152602960248201527f416c726561647920696e697469616c697a65642c20757365206e6f6d696e617460448201526832a732bba7bbb732b960b91b606482015260840161092a565b6001805460ff60a01b1916600160a01b179055600080546001600160a01b03831662010000810262010000600160b01b03199092169190911782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91015b60405180910390a150565b60736020528260005260406000206020528160005260406000208160078110610a4057600080fd5b0154925083915050565b610a52613672565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290602001610a0d565b6001600160a01b038216600090815260716020908152604080832084845290915281206002015460031480610afb57506001600160a01b03831660009081526071602090815260408083208584529091529020600201546006145b9392505050565b60345460ff1615610b485760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161092a565b610b53828233610e76565b610b925760405162461bcd60e51b815260206004820152601060248201526f2ab730b13632903a379031b630b4b69760811b604482015260640161092a565b60675460405163fbdec41360e01b81526001600160a01b0384811660048301526101009092049091169063fbdec4139060240160206040518083038186803b158015610bdd57600080fd5b505afa158015610bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c15919061561d565b15610c6e576001600160a01b0382166000908152606e60209081526040808320839055606c909152908190208290555160008051602061594283398151915290610c659084908490600690615766565b60405180910390a15b606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015610cbc57600080fd5b505afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf49190615430565b6001600160a01b031663403b14128333606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015610d5257600080fd5b505afa158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a9190615430565b6040516380af208b60e01b81526001600160a01b03888116600483015233602483015291909116906380af208b9060440160206040518083038186803b158015610dd357600080fd5b505afa158015610de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0b9190615655565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610e5a57600080fd5b505af1158015610e6e573d6000803e3d6000fd5b505050505050565b606754604051633761c52760e11b81526001600160a01b03858116600483015260009261010090041690636ec38a4e9060240160206040518083038186803b158015610ec157600080fd5b505afa158015610ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef9919061561d565b8015610f1d57506001600160a01b0384166000908152606b60205260409020548311155b8015610fec57506001600160a01b0384166000908152606f602052604090205460ff1680610f6357506001600160a01b0384166000908152606d60205260409020548311155b80610fec575060675460405163fbdec41360e01b81526001600160a01b0386811660048301526101009092049091169063fbdec4139060240160206040518083038186803b158015610fb457600080fd5b505afa158015610fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fec919061561d565b801561101f57506001600160a01b0384811660009081526071602090815260408083208784529091529020548116908316145b801561104f57506001600160a01b0384166000908152607160209081526040808320868452909152902060020154155b801561107357506001600160a01b0384166000908152606c60205260409020548314155b801561118757506000606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b1580156110ca57600080fd5b505afa1580156110de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111029190615430565b6040516380af208b60e01b81526001600160a01b038781166004830152858116602483015291909116906380af208b9060440160206040518083038186803b15801561114d57600080fd5b505afa158015611161573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111859190615655565b115b1561119457506001610afb565b5060009392505050565b6001600160a01b0382166000908152607260209081526040808320848452909152812054610afb9060016136ec565b600054610100900460ff166111e85760005460ff16156111ec565b303b155b61124f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161092a565b600054610100900460ff16158015611271576000805461ffff19166101011790555b61127a836108d8565b611282612b92565b60678054610100600160a81b0319166101006001600160a01b0385160217905580156112b4576000805461ff00191690555b505050565b6000610afb6112c8848461243b565b6001600160a01b03851660009081526072602090815260408083208784529091529020546112f79060016136ec565b906136ec565b6072602052826000526040600020602052816000526040600020818154811061132557600080fd5b9060005260206000200160009250925050505481565b6001600160a01b0382166000908152606f602052604081205460ff168061137a57506001600160a01b0383166000908152606d60205260409020548211155b80156113aa57506001600160a01b0383166000908152607160209081526040808320858452909152902060020154155b8015610afb5750506001600160a01b03919091166000908152606c6020526040902054141590565b6113da613672565b6113e3816124f2565b6113ff5760405162461bcd60e51b815260040161092a906157de565b606880546000908152606960208181526040808420546001600160a01b038781168652606a8085528387208054885286865284882080546001600160a01b0319169484169490941790935591548754875294845282862054168552909152909120555461146d9060016136ec565b6068556001600160a01b038181166000818152606a6020526040808220919091556067549051631404a95d60e11b8152600481019290925261010090049091169063280952ba90602401600060405180830381600087803b1580156114d157600080fd5b505af11580156114e5573d6000803e3d6000fd5b5050606854604080516001600160a01b038616815260208101929092527f86d1787a7c5d5a35ae49625fd6b646c884e5449312f20d0068fba244a8c657bb9350019050610a0d565b6001546001600160a01b031633146115a55760405162461bcd60e51b815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527402063616e20616363657074206f776e65727368697605c1b606482015260840161092a565b60005460015460408051620100009093046001600160a01b03908116845290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600180546000805462010000600160b01b0319166001600160a01b03831662010000021790556001600160a01b0319169055565b6001600160a01b0381166000908152606f602052604081205460ff161580156116bf5750816001600160a01b031663a9daaed56040518163ffffffff1660e01b815260040160206040518083038186803b15801561168757600080fd5b505afa15801561169b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bf919061561d565b92915050565b6117026040518060a0016040528060006001600160a01b031681526020016060815260200160008152602001600081526020016000151581525090565b6001600160a01b038084166000908152607160209081526040808320868452825291829020825160a08101909352805490931682526001830180549293929184019161174d906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611779906158a7565b80156117c65780601f1061179b576101008083540402835291602001916117c6565b820191906000526020600020905b8154815290600101906020018083116117a957829003601f168201915b5050509183525050600282015460208201526003820154604082015260049091015460ff1615156060909101529392505050565b60345460ff16156118405760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161092a565b606754604051633761c52760e11b81526001600160a01b03848116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b15801561188b57600080fd5b505afa15801561189f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c3919061561d565b6118fc5760405162461bcd60e51b815260206004820152600a6024820152694e6f742041637469766560b01b604482015260640161092a565b61190582612789565b156119485760405162461bcd60e51b8152602060048201526013602482015272436c6f73656420666f7220646973707574657360681b604482015260640161092a565b60675460405163677755bb60e01b81526001600160a01b03848116600483015233926101009004169063677755bb9060240160206040518083038186803b15801561199257600080fd5b505afa1580156119a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ca9190615430565b6001600160a01b03161415611a215760405162461bcd60e51b815260206004820152601760248201527f43726561746f722063616e206e6f742064697370757465000000000000000000604482015260640161092a565b611a2a336124f2565b15611a6d5760405162461bcd60e51b815260206004820152601360248201527227a19031b0b7103737ba103234b9b83aba329760691b604482015260640161092a565b816001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b158015611aa657600080fd5b505afa158015611aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ade9190615655565b606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2c57600080fd5b505afa158015611b40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b649190615430565b6040516370a0823160e01b81523360048201526001600160a01b0391909116906370a082319060240160206040518083038186803b158015611ba557600080fd5b505afa158015611bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bdd9190615655565b1015611c245760405162461bcd60e51b81526020600482015260166024820152754c6f7720616d6f756e7420666f72206469737075746560501b604482015260640161092a565b816001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b158015611c5d57600080fd5b505afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c959190615655565b606760019054906101000a90046001600160a01b03166001600160a01b0316633013ce296040518163ffffffff1660e01b815260040160206040518083038186803b158015611ce357600080fd5b505afa158015611cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1b9190615430565b6001600160a01b031663dd62ed3e33606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015611d7857600080fd5b505afa158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db09190615430565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b158015611df657600080fd5b505afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e9190615655565b1015611e6c5760405162461bcd60e51b815260206004820152600d60248201526c27379030b63637bbb0b731b29760991b604482015260640161092a565b604051602001611e8790602080825260009082015260400190565b6040516020818303038152906040528051906020012081604051602001611eae91906157cb565b604051602081830303815290604052805190602001201415611f0b5760405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206469737075746520737472696e6760501b604482015260640161092a565b606760019054906101000a90046001600160a01b03166001600160a01b031663592740b26040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5957600080fd5b505afa158015611f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f919190615655565b81511080611fa05750606e8151105b611fe45760405162461bcd60e51b81526020600482015260156024820152740a6e8e4d2dcce40caf0c6cacac8e640d8cadccee8d605b1b604482015260640161092a565b6001600160a01b0382166000908152606b60205260409020546120089060016136f8565b6001600160a01b0383166000908152606b6020908152604080832093909355606e905220546120389060016136f8565b6001600160a01b0383166000908152606e602090815260408083209390935560718152828220606b82528383208054845281835284842080546001600160a01b031916331790555483528152919020825161209c9260019290920191840190615341565b506001600160a01b0382166000908152607160209081526040808320606b83528184205484529091529020426003909101556068546120dc906001615858565b67ffffffffffffffff81111561210257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561212b578160200160208202803683370190505b506001600160a01b0383166000908152607260209081526040808320606b83528184205484528252909120825161216893919291909101906153c5565b50816001600160a01b0316633f6fa6556040518163ffffffff1660e01b815260040160206040518083038186803b1580156121a257600080fd5b505afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da919061561d565b612217576001600160a01b0382166000908152607160209081526040808320606b83528184205484529091529020600401805460ff191660011790555b60675460405163019e079960e61b81526001600160a01b03848116600483015233602483015261010090920490911690636781e64090604401600060405180830381600087803b15801561226a57600080fd5b505af115801561227e573d6000803e3d6000fd5b5050506001600160a01b0383166000908152607160209081526040808320606b8352818420548452909152908190206004015490517ffd91eaa9167cff43800cbd454f3b6fb7051298a311ed47ec4f7fcf2c5a78738792506122e9918591859160ff169033906156e8565b60405180910390a15050565b6001600160a01b038216600090815260726020908152604080832084845282529182902080548351818402810184019094528084526060939283018282801561235d57602002820191906000526020600020905b815481526020019060010190808311612349575b5050505050905092915050565b6071602090815260009283526040808420909152908252902080546001820180546001600160a01b0390921692916123a1906158a7565b80601f01602080910402602001604051908101604052809291908181526020018280546123cd906158a7565b801561241a5780601f106123ef5761010080835404028352916020019161241a565b820191906000526020600020905b8154815290600101906020018083116123fd57829003601f168201915b50505050600283015460038401546004909401549293909290915060ff1685565b60008060015b6001600160a01b03851660009081526072602090815260408083208784529091529020548110156124ea576001600160a01b038516600090815260726020908152604080832087845290915281208054839081106124af57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154116124c65760006124c9565b60015b6124d69060ff1683615858565b9150806124e2816158e2565b915050612441565b509392505050565b6001600160a01b03166000908152606a6020526040902054151590565b612517613672565b6001600160a01b0381166000908152606f602052604090205460ff1661256e5760405162461bcd60e51b815260206004820152600c60248201526b4f70656e20616c726561647960a01b604482015260640161092a565b6001600160a01b0381166000818152606f6020908152604091829020805460ff1916905590519182527fba1dc3bb562a92f019150e93749bcdeeb5d64787f37a856f4563f38a12877b0e9101610a0d565b6001600160a01b038216600090815260716020908152604080832084845290915290206001018054606091906125f4906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054612620906158a7565b801561235d5780601f106126425761010080835404028352916020019161235d565b820191906000526020600020905b815481529060010190602001808311612650575093979650505050505050565b612678613672565b6001600160a01b0381166126c05760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161092a565b600154600160a81b900460ff16156127105760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481d1c985b9cd9995c9c9959606a1b604482015260640161092a565b600080546001600160a01b038381166201000081810262010000600160b01b031990941693909317938490556001805460ff60a81b1916600160a81b1790556040805193909404909116825260208201527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9101610a0d565b6001600160a01b0381166000908152606f602052604081205460ff16806116bf5750816001600160a01b0316631897c8fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561168757600080fd5b6127ec613672565b6001600160a01b0381166128355760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21030b2323932b9b99760811b604482015260640161092a565b606760019054906101000a90046001600160a01b03166001600160a01b0316634d736d586040518163ffffffff1660e01b815260040160206040518083038186803b15801561288357600080fd5b505afa158015612897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bb9190615655565b60685411156129025760405162461bcd60e51b815260206004820152601360248201527213d0c81b595b58995c9cc8195e18d959591959606a1b604482015260640161092a565b61290b816124f2565b156129455760405162461bcd60e51b815260206004820152600a602482015269416c7265616479204f4360b01b604482015260640161092a565b6068546129539060016136f8565b6068818155600091825260696020908152604080842080546001600160a01b0319166001600160a01b0387169081179091559254838552606a8352938190208490558051928352908201929092527f7b669209e50faed123ff5edb840280b4529293d7408675dbe630eb19cc12e5bb9101610a0d565b6000546201000090046001600160a01b03163314806129f7575060675461010090046001600160a01b031633145b612a385760405162461bcd60e51b815260206004820152601260248201527127b7363c9036b0b730b3b2b917b7bbb732b960711b604482015260640161092a565b6001600160a01b0381166000908152606f602052604090205460ff1615612a925760405162461bcd60e51b815260206004820152600e60248201526d436c6f73656420616c726561647960901b604482015260640161092a565b6001600160a01b0381166000818152606f60209081526040808320805460ff191660011790558051938452908301919091527f72ae4e77c5952790aabb8be5b30e11bc87653ea8bb7558b88a1f8bf466fb71c59101610a0d565b612af4613672565b6001600160a01b038116612b3c5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161092a565b60678054610100600160a81b0319166101006001600160a01b038416908102919091179091556040519081527f23e455350850b05998316f502175b427a275f4d5be9e2a04d530ea39239e1b6f90602001610a0d565b60675460ff1615612bdb5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015260640161092a565b6067805460ff19166001908117909155606655565b612bf9336124f2565b612c155760405162461bcd60e51b815260040161092a906157de565b606754604051633761c52760e11b81526001600160a01b03868116600483015261010090920490911690636ec38a4e9060240160206040518083038186803b158015612c6057600080fd5b505afa158015612c74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c98919061561d565b612cd95760405162461bcd60e51b81526020600482015260126024820152712737ba1030b1ba34bb329036b0b935b2ba1760711b604482015260640161092a565b612ce284612789565b15612d265760405162461bcd60e51b815260206004820152601460248201527321b637b9b2b2103337b9103234b9b83aba32b99760611b604482015260640161092a565b60008311612d6d5760405162461bcd60e51b8152602060048201526014602482015273111a5cdc1d5d19481b9bdb88195e1a5cdd195b9d60621b604482015260640161092a565b6001600160a01b038416600090815260716020908152604080832086845290915290206002015415612dd35760405162461bcd60e51b815260206004820152600f60248201526e2234b9b83aba329031b637b9b2b21760891b604482015260640161092a565b60078211158015612de45750600082115b612e285760405162461bcd60e51b815260206004820152601560248201527424b73b30b634b2103234b9b83aba329031b7b2329760591b604482015260640161092a565b6001600160a01b038416600090815260716020908152604080832086845290915290206004015460ff1615612e9c5760048210612e975760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21031b7b2329760991b604482015260640161092a565b612f48565b6004821015612eed5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f646520696e206d617475726974790000000000000000604482015260640161092a565b6001600160a01b0384166000908152606d60205260409020548311612f485760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e4818d85b98d95b1b1959607a1b604482015260640161092a565b600081118015612f585750600482145b1561323257836001600160a01b0316632486d6716040518163ffffffff1660e01b815260040160206040518083038186803b158015612f9657600080fd5b505afa158015612faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fce9190615655565b81141561302f5760405162461bcd60e51b815260206004820152602960248201527f4f432063616e206e6f7420766f746520666f7220746865207265736f6c766564604482015268103837b9b4ba34b7b760b91b606482015260840161092a565b6001600160a01b038416600090815260756020908152604080832086845282528083203384529091529020548114156130a25760405162461bcd60e51b815260206004820152601560248201527429b0b6b2903bb4b73734b733903837b9b4ba34b7b760591b604482015260640161092a565b6001600160a01b03841660009081526075602090815260408083208684528252808320338452909152902054613155576001600160a01b038416600081815260756020908152604080832087845282528083203384528252808320859055928252607681528282208683528152828220848352905220546131249060016136f8565b6001600160a01b03851660009081526076602090815260408083208784528252808320858452909152902055613232565b6001600160a01b03841660008181526076602090815260408083208784528252808320938352607582528083208784528252808320338452825280832054835292905220546131a59060016136ec565b6001600160a01b0385166000818152607660209081526040808320888452825280832093835260758252808320888452825280832033845282528083208054845293909152808220939093559083905582815220546132059060016136f8565b6001600160a01b038516600090815260766020908152604080832087845282528083208584529091529020555b6001600160a01b03841660009081526072602090815260408083208684528252808320338452606a9092528220548154811061327e57634e487b7160e01b600052603260045260246000fd5b906000526020600020015411156133b5576001600160a01b03841660008181526073602090815260408083208784528252808320938352607282528083208784528252808320338452606a90925290912054815461332a936001939092909181106132f957634e487b7160e01b600052603260045260246000fd5b90600052602060002001546007811061332257634e487b7160e01b600052603260045260246000fd5b0154906136ec565b6001600160a01b03851660008181526073602090815260408083208884528252808320938352607282528083208884528252808320338452606a909252909120548154811061338957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600781106133b257634e487b7160e01b600052603260045260246000fd5b01555b6001600160a01b03841660009081526072602090815260408083208684528252808320338452606a90925290912054815484929190811061340657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092556001600160a01b03861681526073825260408082208683529092522061346190600190846007811061345957634e487b7160e01b600052603260045260246000fd5b0154906136f8565b6001600160a01b0385166000908152607360209081526040808320878452909152902083600781106134a357634e487b7160e01b600052603260045260246000fd5b0155604080516001600160a01b038616815260208101859052908101839052606081018290523360808201527fe5a4e79fc191615470d7a161db08d0e2f18b21da5df60451d35a2fcac7524a8e9060a00160405180910390a160685461350a906002613704565b6001600160a01b03851660009081526073602090815260408083208784529091529020836007811061354c57634e487b7160e01b600052603260045260246000fd5b015411156135c75760048214156135bc5760008061356a8686613710565b606854919350915061357d906002613704565b8211156135b5576001600160a01b038616600090815260746020908152604080832088845290915290208190556135b5868686613813565b50506135c7565b6135c7848484613813565b50505050565b60006135d8826124f2565b1561363e576001600160a01b03808516600090815260726020908152604080832087845282528083209386168352606a9091529020548154811061362c57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050610afb565b613647826124f2565b6136635760405162461bcd60e51b815260040161092a906157de565b50670de0b6b3a7640000610afb565b6000546201000090046001600160a01b031633146136ea5760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201526e37b936903a3434b99030b1ba34b7b760891b606482015260840161092a565b565b6000610afb8284615890565b6000610afb8284615858565b6000610afb8284615870565b60008060008060005b866001600160a01b031663e7702d056040518163ffffffff1660e01b815260040160206040518083038186803b15801561375257600080fd5b505afa158015613766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061378a9190615655565b8111613807576001600160a01b038716600090815260766020908152604080832089845282528083208484529091529020548310156137f5576001600160a01b0387166000908152607660209081526040808320898452825280832084845290915290205492509050805b806137ff816158e2565b915050613719565b50909590945092505050565b6001606660008282546138269190615858565b90915550506066546001600160a01b0384166000908152607160209081526040808320868452909152902060020154156138935760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e4818db1bdcd95960921b604482015260640161092a565b600082116138d45760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21037b83a34b7b760911b604482015260640161092a565b6001600160a01b03841660008181526071602090815260408083208784528252808320600201869055928252606e90522054613911576000613935565b6001600160a01b0384166000908152606e60205260409020546139359060016136ec565b6001600160a01b0385166000908152606e6020526040902055600382148061395d5750600682145b15613ca957606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b1580156139b057600080fd5b505afa1580156139c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e89190615430565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b158015613a4557600080fd5b505afa158015613a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a7d9190615430565b876001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b158015613ab657600080fd5b505afa158015613aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aee9190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152613b3c9594939260679216906004016156b8565b600060405180830381600087803b158015613b5657600080fd5b505af1158015613b6a573d6000803e3d6000fd5b5050506001600160a01b0385166000908152606c60205260409020849055506006821415613bf857606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b158015613bdf57600080fd5b505af1158015613bf3573d6000803e3d6000fd5b505050505b6001600160a01b0384166000908152606e6020526040902054613c7b576067546040516305c6035560e11b81526001600160a01b03868116600483015261010090920490911690630b8c06aa90602401600060405180830381600087803b158015613c6257600080fd5b505af1158015613c76573d6000803e3d6000fd5b505050505b600080516020615942833981519152848484604051613c9c93929190615766565b60405180910390a16152f0565b600182141561430857606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b158015613cff57600080fd5b505af1158015613d13573d6000803e3d6000fd5b50506067546040516305c6035560e11b81526001600160a01b0388811660048301526101009092049091169250630b8c06aa9150602401600060405180830381600087803b158015613d6457600080fd5b505af1158015613d78573d6000803e3d6000fd5b5050606754604051630fe40c4760e41b81526001600160a01b038881166004830152610100909204909116925063fe40c4709150602401600060405180830381600087803b158015613dc957600080fd5b505af1158015613ddd573d6000803e3d6000fd5b5050506001600160a01b038086166000908152606f6020908152604091829020805460ff19166001179055606754825163dfb8bae760e01b81529251610100909104909316935063dfb8bae792600480840193829003018186803b158015613e4457600080fd5b505afa158015613e58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e7c9190615430565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b158015613ed957600080fd5b505afa158015613eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f119190615430565b876001600160a01b031663b0092db76040518163ffffffff1660e01b815260040160206040518083038186803b158015613f4a57600080fd5b505afa158015613f5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f829190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152613fd09594939260659216906004016156b8565b600060405180830381600087803b158015613fea57600080fd5b505af1158015613ffe573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b15801561405057600080fd5b505afa158015614064573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140889190615430565b6001600160a01b03858116600081815260716020908152604080832089845282529182902054825163b0092db760e01b81529251958516956327b153a0958b959216936142129363b0092db792600480840193829003018186803b1580156140ef57600080fd5b505afa158015614103573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141279190615655565b6112f78a6001600160a01b0316636da19c356040518163ffffffff1660e01b815260040160206040518083038186803b15801561416357600080fd5b505afa158015614177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061419b9190615655565b8b6001600160a01b03166389265ca76040518163ffffffff1660e01b815260040160206040518083038186803b1580156141d457600080fd5b505afa1580156141e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420c9190615655565b906136f8565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526142609594939260689216906004016156b8565b600060405180830381600087803b15801561427a57600080fd5b505af115801561428e573d6000803e3d6000fd5b505050506001600160a01b0384166000818152606c6020908152604091829020869055815192835282018490527f72ae4e77c5952790aabb8be5b30e11bc87653ea8bb7558b88a1f8bf466fb71c591015b60405180910390a1600080516020615942833981519152848484604051613c9c93929190615766565b60028214156148de57606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b15801561435e57600080fd5b505af1158015614372573d6000803e3d6000fd5b50506067546040516305c6035560e11b81526001600160a01b0388811660048301526101009092049091169250630b8c06aa9150602401600060405180830381600087803b1580156143c357600080fd5b505af11580156143d7573d6000803e3d6000fd5b5050606754604051630fe40c4760e41b81526001600160a01b038881166004830152610100909204909116925063fe40c4709150602401600060405180830381600087803b15801561442857600080fd5b505af115801561443c573d6000803e3d6000fd5b5050506001600160a01b038086166000908152606f6020908152604091829020805460ff19166001179055606754825163dfb8bae760e01b81529251610100909104909316935063dfb8bae792600480840193829003018186803b1580156144a357600080fd5b505afa1580156144b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144db9190615430565b60675460405163677755bb60e01b81526001600160a01b038781166004830152928316926327b153a09288926101009091049091169063677755bb9060240160206040518083038186803b15801561453257600080fd5b505afa158015614546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061456a9190615430565b876001600160a01b03166389265ca76040518163ffffffff1660e01b815260040160206040518083038186803b1580156145a357600080fd5b505afa1580156145b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145db9190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526146299594939260659216906004016156b8565b600060405180830381600087803b15801561464357600080fd5b505af1158015614657573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b1580156146a957600080fd5b505afa1580156146bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146e19190615430565b6001600160a01b038581166000818152607160209081526040808320898452825291829020548251636da19c3560e01b81529251958516956327b153a0958b959216939192636da19c359260048082019391829003018186803b15801561474757600080fd5b505afa15801561475b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061477f9190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526147cd9594939260679216906004016156b8565b600060405180830381600087803b1580156147e757600080fd5b505af11580156147fb573d6000803e3d6000fd5b50506067546001600160a01b0387811660008181526071602090815260408083208b845282529182902054825163465591f960e01b815292516101009096048516975063b33e3afb96508b9594169363465591f9926004808201939291829003018186803b15801561486c57600080fd5b505afa158015614880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148a49190615655565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401614260565b6004821415614e4a57606754604051630bbd647b60e11b81526001600160a01b0386811660048301526101009092049091169063177ac8f690602401600060405180830381600087803b15801561493457600080fd5b505af1158015614948573d6000803e3d6000fd5b50506067546040516305c6035560e11b81526001600160a01b0388811660048301526101009092049091169250630b8c06aa9150602401600060405180830381600087803b15801561499957600080fd5b505af11580156149ad573d6000803e3d6000fd5b50506067546001600160a01b0387811660008181526074602090815260408083208b84529091529081902054905163b91f5e3560e01b81526004810192909252602482015261010090920416925063b91f5e359150604401600060405180830381600087803b158015614a1f57600080fd5b505af1158015614a33573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015614a8557600080fd5b505afa158015614a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614abd9190615430565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b158015614b1a57600080fd5b505afa158015614b2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b529190615430565b876001600160a01b03166389265ca76040518163ffffffff1660e01b815260040160206040518083038186803b158015614b8b57600080fd5b505afa158015614b9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bc39190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152614c119594939260669216906004016156b8565b600060405180830381600087803b158015614c2b57600080fd5b505af1158015614c3f573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015614c9157600080fd5b505afa158015614ca5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cc99190615430565b6001600160a01b038581166000818152607160209081526040808320898452825291829020548251636da19c3560e01b81529251958516956327b153a0958b959216939192636da19c359260048082019391829003018186803b158015614d2f57600080fd5b505afa158015614d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d679190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b168152614db59594939260679216906004016156b8565b600060405180830381600087803b158015614dcf57600080fd5b505af1158015614de3573d6000803e3d6000fd5b505050506001600160a01b0384166000818152606f60209081526040808320805460ff19166001179055606c825291829020869055815192835282018490527f72ae4e77c5952790aabb8be5b30e11bc87653ea8bb7558b88a1f8bf466fb71c591016142df565b60058214156152f0576067546040516305c6035560e11b81526001600160a01b03868116600483015261010090920490911690630b8c06aa90602401600060405180830381600087803b158015614ea057600080fd5b505af1158015614eb4573d6000803e3d6000fd5b50506067546040516304268b7560e31b81526001600160a01b03888116600483015261010090920490911692506321345ba89150602401600060405180830381600087803b158015614f0557600080fd5b505af1158015614f19573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b158015614f6b57600080fd5b505afa158015614f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fa39190615430565b6001600160a01b03166327b153a085606760019054906101000a90046001600160a01b03166001600160a01b031663543f17156040518163ffffffff1660e01b815260040160206040518083038186803b15801561500057600080fd5b505afa158015615014573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150389190615430565b876001600160a01b031663b0092db76040518163ffffffff1660e01b815260040160206040518083038186803b15801561507157600080fd5b505afa158015615085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150a99190615655565b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526150f79594939260669216906004016156b8565b600060405180830381600087803b15801561511157600080fd5b505af1158015615125573d6000803e3d6000fd5b50505050606760019054906101000a90046001600160a01b03166001600160a01b031663dfb8bae76040518163ffffffff1660e01b815260040160206040518083038186803b15801561517757600080fd5b505afa15801561518b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151af9190615430565b6001600160a01b03858116600081815260716020908152604080832089845282529182902054825163b0092db760e01b81529251958516956327b153a0958b959216936152169363b0092db792600480840193829003018186803b1580156140ef57600080fd5b6001600160a01b03808a1660009081526071602090815260408083208c8452909152908190205490516001600160e01b031960e088901b1681526152649594939260699216906004016156b8565b600060405180830381600087803b15801561527e57600080fd5b505af1158015615292573d6000803e3d6000fd5b5050506001600160a01b0385166000908152606b6020908152604080832054606d835281842055606e8252808320839055606c90915290819020859055516000805160206159428339815191529150613c9c90869086908690615766565b60665481146135c75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161092a565b82805461534d906158a7565b90600052602060002090601f01602090048101928261536f57600085556153b5565b82601f1061538857805160ff19168380011785556153b5565b828001600101855582156153b5579182015b828111156153b557825182559160200191906001019061539a565b506153c19291506153ff565b5090565b8280548282559060005260206000209081019282156153b557916020028201828111156153b557825182559160200191906001019061539a565b5b808211156153c15760008155600101615400565b600060208284031215615425578081fd5b8135610afb81615929565b600060208284031215615441578081fd5b8151610afb81615929565b6000806040838503121561545e578081fd5b823561546981615929565b9150602083013561547981615929565b809150509250929050565b60008060408385031215615496578182fd5b82356154a181615929565b9150602083013567ffffffffffffffff808211156154bd578283fd5b818501915085601f8301126154d0578283fd5b8135818111156154e2576154e2615913565b604051601f8201601f19908116603f0116810190838211818310171561550a5761550a615913565b81604052828152886020848701011115615522578586fd5b82602086016020830137856020848301015280955050505050509250929050565b60008060408385031215615555578182fd5b823561556081615929565b946020939093013593505050565b600080600060608486031215615582578081fd5b833561558d81615929565b92506020840135915060408401356155a481615929565b809150509250925092565b6000806000606084860312156155c3578283fd5b83356155ce81615929565b95602085013595506040909401359392505050565b600080600080608085870312156155f8578081fd5b843561560381615929565b966020860135965060408601359560600135945092505050565b60006020828403121561562e578081fd5b81518015158114610afb578182fd5b60006020828403121561564e578081fd5b5035919050565b600060208284031215615666578081fd5b5051919050565b60008151808452815b8181101561569257602081850181015186830182015201615676565b818111156156a35782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b039586168152938516602085015260408401929092526060830152909116608082015260a00190565b600060018060a01b0380871683526080602084015261570a608084018761566d565b9415156040840152929092166060909101525092915050565b6001600160a01b038616815260a0602082018190526000906157479083018761566d565b6040830195909552506060810192909252151560809091015292915050565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b818110156157bf578351835292840192918401916001016157a3565b50909695505050505050565b602081526000610afb602083018461566d565b6020808252600690820152654e6f74204f4360d01b604082015260600190565b602080825282516001600160a01b03168282015282015160a0604083015260009061582c60c084018261566d565b905060408401516060840152606084015160808401526080840151151560a08401528091505092915050565b6000821982111561586b5761586b6158fd565b500190565b60008261588b57634e487b7160e01b81526012600452602481fd5b500490565b6000828210156158a2576158a26158fd565b500390565b600181811c908216806158bb57607f821691505b602082108114156158dc57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156158f6576158f66158fd565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461593e57600080fd5b5056fe22030d24c56fdfb5edf6a4fc074d3ae64f4a1de374968f0a0871f9fa5d494c4ea2646970667358221220e4f54674cd54894aa723c787a8297e6e3c5b1d054eb51d458fff5b1d0a9ae94d64736f6c63430008040033
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.