Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
8624167 | 1124 days ago | 0 ETH | ||||
8624126 | 1124 days ago | 0 ETH | ||||
8623984 | 1124 days ago | 0 ETH | ||||
8623963 | 1124 days ago | 0 ETH | ||||
8623899 | 1124 days ago | 0 ETH | ||||
8623827 | 1124 days ago | 0 ETH | ||||
8623735 | 1124 days ago | 0 ETH | ||||
8623715 | 1124 days ago | 0 ETH | ||||
8623691 | 1124 days ago | 0 ETH | ||||
8623662 | 1124 days ago | 0 ETH | ||||
8623653 | 1124 days ago | 0 ETH | ||||
8623650 | 1124 days ago | 0 ETH | ||||
8623649 | 1124 days ago | 0 ETH | ||||
8623639 | 1124 days ago | 0 ETH | ||||
8623621 | 1124 days ago | 0 ETH | ||||
8623618 | 1124 days ago | 0 ETH | ||||
8623613 | 1124 days ago | 0 ETH | ||||
8623602 | 1124 days ago | 0 ETH | ||||
8623592 | 1124 days ago | 0 ETH | ||||
8623579 | 1124 days ago | 0 ETH | ||||
8623565 | 1124 days ago | 0 ETH | ||||
8623553 | 1124 days ago | 0 ETH | ||||
8623540 | 1124 days ago | 0 ETH | ||||
8623514 | 1124 days ago | 0 ETH | ||||
8623509 | 1124 days ago | 0 ETH |
Loading...
Loading
Contract Name:
HideNSeekV2
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT LICENSE pragma solidity >0.8.0; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "./IHideNSeekV2.sol"; import "./HideNSeekGameLogicV2.sol"; import "./IBOO.sol"; import "./IPeekABoo.sol"; import "./IStakeManager.sol"; import "./ILevel.sol"; contract HideNSeekV2 is Initializable, IHideNSeekV2, HideNSeekGameLogicV2 { function initialize() public initializer { __Ownable_init(); GHOST_COSTS = [20 ether, 30 ether, 40 ether]; BUSTER_COSTS = [10 ether, 20 ether, 30 ether]; BUSTER_BONUS = [5 ether, 10 ether]; ghostReceive = [0 ether, 5 ether, 10 ether]; } function stakePeekABoo(uint256[] calldata tokenIds) external { IStakeManager smRef = sm; for (uint256 i = 0; i < tokenIds.length; i++) { smRef.stakePABOnService(tokenIds[i], address(this), _msgSender()); } } function unstakePeekABoo(uint256[] calldata tokenIds) external { IPeekABoo peekabooRef = peekaboo; IStakeManager smRef = sm; uint256 activeSessionId; for (uint256 i = 0; i < tokenIds.length; i++) { require( peekabooRef.ownerOf(tokenIds[i]) == address(smRef), "Not your token." ); smRef.unstakePeekABoo(tokenIds[i]); if (peekabooRef.getTokenTraits(tokenIds[i]).isGhost) { for ( uint256 j = 0; j < TIDtoActiveSessions[tokenIds[i]].length; j++ ) { activeSessionId = TIDtoActiveSessions[tokenIds[i]][j]; removeActiveGhostMap(tokenIds[i], activeSessionId); boo.transfer( TIDtoGMS[tokenIds[i]][activeSessionId].owner, TIDtoGMS[tokenIds[i]][activeSessionId].balance ); TIDtoGMS[tokenIds[i]][activeSessionId].balance = 0; TIDtoGMS[tokenIds[i]][activeSessionId].active = false; } } } } function createGhostMaps(uint256 tId, bytes32[] calldata cmm) external { IBOO booRef = boo; IPeekABoo peekabooRef = peekaboo; IStakeManager smRef = sm; require(tx.origin == _msgSender(), "No SmartContracts"); require( smRef.isStaked(tId, address(this)), "This is not staked in HideNSeek" ); require(peekabooRef.getTokenTraits(tId).isGhost, "Not a ghost"); require(smRef.ownerOf(tId) == _msgSender(), "This isn't your token"); require( peekabooRef.getGhostMapGridFromTokenId(tId).initialized, "Ghostmap is not initialized" ); smRef.claimEnergy(tId); smRef.useEnergy(tId, cmm.length); uint256 difficulty = peekabooRef .getGhostMapGridFromTokenId(tId) .difficulty; uint256 cost = GHOST_COSTS[difficulty]; uint256 sId; for (uint256 i = 0; i < cmm.length; i++) { sId = TIDtoNextSessionNumber[tId]; TIDtoGMS[tId][sId].active = true; TIDtoGMS[tId][sId].tokenId = tId; TIDtoGMS[tId][sId].sessionId = sId; TIDtoGMS[tId][sId].difficulty = difficulty; TIDtoGMS[tId][sId].cost = cost; TIDtoGMS[tId][sId].balance = cost; TIDtoGMS[tId][sId].commitment = cmm[i]; TIDtoGMS[tId][sId].owner = _msgSender(); TIDtoNextSessionNumber[tId] = sId + 1; TIDtoActiveSessions[tId].push(sId); activeSessions.push(Session(tId, sId, _msgSender(), address(0x0))); emit GhostMapCreated(msg.sender, tId, sId); } booRef.transferFrom(msg.sender, address(this), cost * cmm.length); } function claimGhostMaps( uint256 tId, uint256[] calldata sId, int256[2][] calldata gps, uint256[] calldata nonces ) external { require(sId.length == nonces.length, "Incorrect lengths"); require(sId.length == gps.length, "Incorrect lengths"); if (_msgSender() != ACS) require( sm.isStaked(tId, address(this)) && sm.ownerOf(tId) == _msgSender(), "not staked or not owner" ); for (uint256 i = 0; i < sId.length; i++) { claimGhostMap(tId, sId[i], gps[i], nonces[i]); } } function claimBusterSession(uint256 tokenId, uint256 sessionId) external { GhostMapSession memory gms = TIDtoGMS[tokenId][sessionId]; require(gms.busterPlayer == _msgSender(), "must be the buster player"); require( sm.isStaked(tokenId, address(this)), "This is not staked in HideNSeek" ); require( block.timestamp - 1 days >= gms.playedTime, "ghost player has time" ); boo.transfer(gms.busterPlayer, gms.balance); emit GameComplete( gms.busterPlayer, gms.owner, tokenId, sessionId, gms.difficulty, gms.balance, 0 ); clearMap(tokenId, sessionId, gms.owner, gms.busterPlayer); } function generateLockedSession() external { require( lockedSessions[_msgSender()].lockedBy == address(0x0), "Already locked a session" ); uint256 index = pseudoRandom(_msgSender()) % activeSessions.length; uint256 count = 0; while (activeSessions[index].owner == _msgSender()) { require(count < 5, "Preventing infinite loop"); index = (pseudoRandom(_msgSender()) + index) % activeSessions.length; count++; } activeSessions[index].lockedBy = _msgSender(); Session memory session = activeSessions[index]; GhostMapSession memory gms = TIDtoGMS[session.tokenId][ session.sessionId ]; boo.transferFrom( _msgSender(), address(this), BUSTER_COSTS[gms.difficulty] ); TIDtoGMS[session.tokenId][session.sessionId].balance += BUSTER_COSTS[ gms.difficulty ]; lockedSessions[_msgSender()] = session; TIDtoGMS[session.tokenId][session.sessionId].lockedTime = block .timestamp; removeActiveGhostMap(session.tokenId, session.sessionId); } function playGameSession(uint256[] calldata bi, int256[2][] calldata bp) external { IStakeManager smRef = sm; require( lockedSessions[_msgSender()].lockedBy != address(0x0), "You have not locked in a session yet" ); uint256 tokenId = lockedSessions[_msgSender()].tokenId; uint256 sessionId = lockedSessions[_msgSender()].sessionId; GhostMapSession memory gms = TIDtoGMS[tokenId][sessionId]; for (uint256 i = 0; i < bi.length; i++) { smRef.claimEnergy(bi[i]); smRef.useEnergy(bi[i], 1); } playRequirements(bi, bp, tokenId); playGame(bi, bp, tokenId, sessionId, BUSTER_COSTS[gms.difficulty]); TIDtoGMS[tokenId][sessionId].playedTime = block.timestamp; emit PlayedGame(_msgSender(), tokenId, sessionId); claimableSessions[gms.owner].push(lockedSessions[_msgSender()]); claimableSessions[_msgSender()].push(lockedSessions[_msgSender()]); delete lockedSessions[_msgSender()]; } //Admin Access function setPeekABoo(address _peekaboo) external onlyOwner { peekaboo = IPeekABoo(_peekaboo); } function setBOO(address _boo) external onlyOwner { boo = IBOO(_boo); } function setStakeManager(address _sm) external onlyOwner { sm = IStakeManager(_sm); } function setLevel(address _level) external onlyOwner { level = ILevel(_level); } function getLockedSession() external view returns (Session memory) { return lockedSessions[_msgSender()]; } // Public READ Game Method function getGhostMapSessionStats(uint256 tokenId, uint256 sessionId) external view returns (GhostMapSession memory) { return TIDtoGMS[tokenId][sessionId]; } function getTokenIdActiveSessions(uint256 tokenId) external view returns (uint256[] memory) { return TIDtoActiveSessions[tokenId]; } function matchHistory(address owner) external view returns (GhostMapSession[] memory) { uint256[2][] memory mh = ownerMatchHistory[owner]; GhostMapSession[] memory hnsHistory = new GhostMapSession[](mh.length); for (uint256 i = 0; i < mh.length; i++) { hnsHistory[i] = TIDtoGMS[mh[i][0]][mh[i][1]]; } return hnsHistory; } function setAutoClaimServer(address autoClaimAddress) external onlyOwner { ACS = autoClaimAddress; } function setGhostCost(uint256[3] memory _GHOST_COST) external onlyOwner { GHOST_COSTS = _GHOST_COST; } function setBusterCost(uint256[3] memory _BUSTER_COST) external onlyOwner { BUSTER_COSTS = _BUSTER_COST; } function setBonus(uint256[2] memory _BONUS) external onlyOwner { BUSTER_BONUS = _BONUS; } function numberOfClaimableSessions(address owner) external view returns (uint256) { return claimableSessions[owner].length; } }
// SPDX-License-Identifier: MIT LICENSE pragma solidity >0.8.0; interface IStakeManager { function stakePABOnService( uint256 tokenId, address service, address owner ) external; function isStaked(uint256 tokenId, address service) external view returns (bool); function unstakePeekABoo(uint256 tokenId) external; function getServices() external view returns (address[] memory); function isService(address service) external view returns (bool); function initializeEnergy(uint256 tokenId) external; function claimEnergy(uint256 tokenId) external; function useEnergy(uint256 tokenId, uint256 amount) external; function ownerOf(uint256 tokenId) external returns (address); function tokensOf(address owner) external returns (uint256[] memory); }
// SPDX-License-Identifier: MIT LICENSE pragma solidity >0.8.0; import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; interface IPeekABoo is IERC721Upgradeable { struct PeekABooTraits { bool isGhost; uint256 background; uint256 back; uint256 bodyColor; uint256 hat; uint256 face; uint256 clothesOrHelmet; uint256 hands; uint64 ability; uint64 revealShape; uint64 tier; uint64 level; } struct GhostMap { uint256[10][10] grid; int256 gridSize; uint256 difficulty; bool initialized; } function devMint(address to, uint256[] memory types) external; function mint(uint256[] calldata types, bytes32[] memory proof) external; function publicMint(uint256[] calldata types) external payable; function getTokenTraits(uint256 tokenId) external view returns (PeekABooTraits memory); function setTokenTraits( uint256 tokenId, uint256 traitType, uint256 traitId ) external; function setMultipleTokenTraits( uint256 tokenId, uint256[] calldata traitTypes, uint256[] calldata traitIds ) external; function getGhostMapGridFromTokenId(uint256 tokenId) external view returns (GhostMap memory); function mintPhase2( uint256 tokenId, uint256[] memory types, uint256 amount, uint256 booAmount ) external; function incrementLevel(uint256 tokenId) external; function incrementTier(uint256 tokenId) external; function getPhase1Minted() external view returns (uint256 result); function getPhase2Minted() external view returns (uint256 result); function withdraw() external; }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; import "./IPeekABoo.sol"; import "./IStakeManager.sol"; interface ILevel { function updateExp( uint256 tokenId, bool won, uint256 difficulty ) external; function expAmount(uint256 tokenId) external view returns (uint256); function isUnlocked( uint256 tokenId, uint256 traitType, uint256 traitId ) external returns (bool); function getUnlockedTraits(uint256 tokenId, uint256 traitType) external returns (uint256); }
// SPDX-License-Identifier: MIT LICENSE pragma solidity >0.8.0; interface IHideNSeekV2 { struct GhostMapSession { bool active; uint256 tokenId; uint256 sessionId; uint256 difficulty; uint256 cost; uint256 balance; bytes32 commitment; address owner; address busterPlayer; uint256 numberOfBusters; uint256[3] busterTokenIds; int256[2][3] busterPositions; uint256 lockedTime; uint256 playedTime; bool won; } struct Session { uint256 tokenId; uint256 sessionId; address owner; address lockedBy; } function stakePeekABoo(uint256[] calldata tokenIds) external; function unstakePeekABoo(uint256[] calldata tokenIds) external; function claimGhostMaps( uint256 tokenId, uint256[] calldata sessionIds, int256[2][] calldata ghostPositions, uint256[] calldata nonces ) external; function playGameSession(uint256[] calldata bi, int256[2][] calldata bp) external; function getGhostMapSessionStats(uint256 tokenId, uint256 sessionId) external view returns (GhostMapSession memory); function getLockedSession() external returns (Session memory); function getTokenIdActiveSessions(uint256 tokenId) external view returns (uint256[] memory); function matchHistory(address owner) external view returns (GhostMapSession[] memory); function numberOfClaimableSessions(address owner) external view returns (uint256); function claimBusterSession(uint256 tokenId, uint256 sessionId) external; function createGhostMaps(uint256 tokenId, bytes32[] calldata commitments) external; }
// SPDX-License-Identifier: MIT LICENSE pragma solidity >0.8.0; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; interface IBOO is IERC20Upgradeable { function mint(address to, uint256 amount) external; function burn(address from, uint256 amount) external; function cap() external view returns (uint256); function setAllocationAddress(address fundingAddress, uint256 allocation) external; function removeAllocationAddress(address fundingAddress) external; }
// SPDX-License-Identifier: MIT LICENSE pragma solidity >0.8.0; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "./IHideNSeekV2.sol"; import "./HideNSeekBaseV2.sol"; import "./IPeekABoo.sol"; import "./IBOO.sol"; abstract contract HideNSeekGameLogicV2 is OwnableUpgradeable, HideNSeekBaseV2 { function playGame( uint256[] calldata busterIds, int256[2][] calldata busterPos, uint256 tokenId, uint256 sessionId, uint256 cost ) internal { IPeekABoo peekabooRef = peekaboo; TIDtoGMS[tokenId][sessionId].busterPlayer = _msgSender(); TIDtoGMS[tokenId][sessionId].numberOfBusters = busterIds.length; for (uint256 i = 0; i < busterIds.length; i++) { TIDtoGMS[tokenId][sessionId].busterTokenIds[i] = busterIds[i]; TIDtoGMS[tokenId][sessionId].busterPositions[i] = busterPos[i]; } } // Returns true if ghost wins, false if ghost loses function verifyGame( IHideNSeekV2.GhostMapSession memory gms, uint256 tokenId, int256[2] calldata ghostPosition, uint256 nonce, uint256 sessionId ) internal returns (bool) { // IPeekABoo peekabooRef = peekaboo; IBOO booRef = boo; for (uint256 i = 0; i < gms.numberOfBusters; i++) { // Ghost reveal logic if ( doesRadiusReveal( gms.busterPositions[i], peekaboo.getTokenTraits(gms.busterTokenIds[i]).revealShape, gms.busterTokenIds[i], ghostPosition ) || ( gms.busterTokenIds.length == 1 ? doesAbilityReveal( gms.busterPositions[i], gms.busterTokenIds[i], ghostPosition ) : ( gms.busterTokenIds.length == 2 ? doesAbilityReveal( gms.busterPositions[i], gms.busterTokenIds[i], ghostPosition, gms.busterPositions[(i == 0) ? 1 : 0] ) : doesAbilityReveal( gms.busterPositions[i], gms.busterTokenIds[i], ghostPosition, gms.busterPositions[(i == 0) ? 2 : 0], gms.busterPositions[(i == 1) ? 2 : 1] ) ) ) ) { //Boo Generator Cashing // if (peekabooRef.getTokenTraits(gms.busterTokenIds[i]).ability == 6) { // booRef.mint(gms.busterPlayer, 10 ether); // } return true; } } return false; } function doesRadiusReveal( int256[2] memory busterPosition, uint256 revealShape, uint256 busterId, int256[2] memory ghostPosition ) internal view returns (bool) { // NormalRevealShape if (revealShape == 0) { for (int256 i = -1; i <= 1; i++) { for (int256 j = -1; j <= 1; j++) { if ( (ghostPosition[0] == busterPosition[0] + i && ghostPosition[1] == busterPosition[1] + j) ) return true; } } } // PlusRevealShape else if (revealShape == 1) { for (int256 i = -2; i <= 2; i++) { if ( (ghostPosition[0] == busterPosition[0] && ghostPosition[1] == busterPosition[1] + i) || (ghostPosition[0] == busterPosition[0] + i && ghostPosition[1] == busterPosition[1]) ) return true; } } // XRevealShape else if (revealShape == 2) { for (int256 i = -2; i <= 2; i++) { if ( ghostPosition[0] == busterPosition[0] + i && ghostPosition[1] == busterPosition[1] + i ) { return true; } } } return false; } function doesAbilityReveal( int256[2] memory busterPosition, uint256 busterId, int256[2] memory ghostPosition, int256[2] memory otherBuster1, int256[2] memory otherBuster2 ) internal view returns (bool) { IPeekABoo peekabooRef = peekaboo; //LightBuster if (peekabooRef.getTokenTraits(busterId).ability == 1) { if (ghostPosition[0] == busterPosition[0]) return true; } //HomeBound else if (peekabooRef.getTokenTraits(busterId).ability == 2) { if ( ((busterPosition[0] == otherBuster1[0]) && (busterPosition[0] == ghostPosition[0])) || // Buster 1 on same row ((busterPosition[0] == otherBuster2[0]) && (busterPosition[0] == ghostPosition[0])) || // Buster 2 on same row ((busterPosition[1] == otherBuster1[1]) && (busterPosition[1] == ghostPosition[1])) || // Buster 1 on same column ((busterPosition[1] == otherBuster2[1]) && (busterPosition[1] == ghostPosition[1])) ) // Buster 2 on same column { return true; } } //GreenGoo else if (peekabooRef.getTokenTraits(busterId).ability == 3) { if (ghostPosition[1] == busterPosition[1]) { return true; } } //StandUnited else if (peekabooRef.getTokenTraits(busterId).ability == 4) { if ( isBusterAdjacent(busterPosition, otherBuster1) || isBusterAdjacent(busterPosition, otherBuster2) ) { for (int256 i = -2; i <= 2; i++) { for (int256 j = -2; i <= 2; i++) { if ( (ghostPosition[0] == busterPosition[0] + i && ghostPosition[1] == busterPosition[1] + j) ) return true; } } } } //HolyCross else if (peekabooRef.getTokenTraits(busterId).ability == 5) { if ( ghostPosition[0] == busterPosition[0] || ghostPosition[1] == busterPosition[1] ) { return true; } } return false; } function doesAbilityReveal( int256[2] memory busterPosition, uint256 busterId, int256[2] memory ghostPosition, int256[2] memory otherBuster1 ) internal view returns (bool) { IPeekABoo peekabooRef = peekaboo; //LightBuster if (peekabooRef.getTokenTraits(busterId).ability == 1) { if (ghostPosition[0] == busterPosition[0]) return true; } //HomeBound else if (peekabooRef.getTokenTraits(busterId).ability == 2) { if ( ((busterPosition[0] == otherBuster1[0]) && (busterPosition[0] == ghostPosition[0])) || // Buster 1 on same row ((busterPosition[1] == otherBuster1[1]) && (busterPosition[1] == ghostPosition[1])) ) // Buster 1 on same column { return true; } } //GreenGoo else if (peekabooRef.getTokenTraits(busterId).ability == 3) { if (ghostPosition[1] == busterPosition[1]) { return true; } } //StandUnited else if (peekabooRef.getTokenTraits(busterId).ability == 4) { if (isBusterAdjacent(busterPosition, otherBuster1)) { for (int256 i = -2; i <= 2; i++) { for (int256 j = -2; i <= 2; i++) { if ( (ghostPosition[0] == busterPosition[0] + i && ghostPosition[1] == busterPosition[1] + j) ) return true; } } } } //HolyCross else if (peekabooRef.getTokenTraits(busterId).ability == 5) { if ( ghostPosition[0] == busterPosition[0] || ghostPosition[1] == busterPosition[1] ) { return true; } } return false; } function doesAbilityReveal( int256[2] memory busterPosition, uint256 busterId, int256[2] memory ghostPosition ) internal view returns (bool) { IPeekABoo peekabooRef = peekaboo; //LightBuster if (peekabooRef.getTokenTraits(busterId).ability == 1) { if (ghostPosition[0] == busterPosition[0]) return true; } //GreenGoo else if (peekabooRef.getTokenTraits(busterId).ability == 3) { if (ghostPosition[1] == busterPosition[1]) { return true; } } //HolyCross else if (peekabooRef.getTokenTraits(busterId).ability == 5) { if ( ghostPosition[0] == busterPosition[0] || ghostPosition[1] == busterPosition[1] ) { return true; } } return false; } function isBusterAdjacent(int256[2] memory pos1, int256[2] memory pos2) internal pure returns (bool) { int256 difference = pos1[0] + pos1[1] - (pos2[0] + pos2[1]); return difference <= 1 && difference >= -1; } function verifyCommitment( uint256 tokenId, uint256 sessionId, int256[2] calldata ghostPosition, uint256 nonce ) internal view returns (bool) { return bytes32( keccak256( abi.encodePacked( tokenId, ghostPosition[0], ghostPosition[1], nonce ) ) ) == TIDtoGMS[tokenId][sessionId].commitment; } function hasEnoughBooToFund( uint256[] calldata booFundingAmount, address sender ) internal view returns (bool) { uint256 totalBooFundingAmount; for (uint256 i = 0; i < booFundingAmount.length; i++) { totalBooFundingAmount += booFundingAmount[i]; } return boo.balanceOf(sender) >= totalBooFundingAmount; } function isNotInBound(uint256 tokenId, int256[2] calldata position) internal view returns (bool) { IPeekABoo.GhostMap memory ghostMap = peekaboo .getGhostMapGridFromTokenId(tokenId); if ( ghostMap.grid[uint256(position[1])][uint256(position[0])] == 1 || position[0] < 0 || position[0] > ghostMap.gridSize - 1 || position[1] < 0 || position[1] > ghostMap.gridSize - 1 ) { return true; } return false; } function claimGhostMap( uint256 tokenId, uint256 sessionId, int256[2] calldata ghostPosition, uint256 nonce ) internal { IBOO booRef = boo; IHideNSeekV2.GhostMapSession memory gms = TIDtoGMS[tokenId][sessionId]; uint256 difficulty = gms.difficulty; require(gms.active, "Session no longer active"); bool overTime = block.timestamp - 1 days >= gms.lockedTime; bool notInbound = isNotInBound(tokenId, ghostPosition); if (overTime) { booRef.transfer(gms.owner, gms.balance); emit GameComplete( gms.owner, gms.busterPlayer, tokenId, sessionId, difficulty, gms.balance, 0 ); TIDtoGMS[tokenId][sessionId].won = true; } if (!overTime) { require( verifyCommitment(tokenId, sessionId, ghostPosition, nonce), "Commitment incorrect, please do not cheat" ); if (notInbound) { booRef.transfer(gms.busterPlayer, gms.balance); emit GameComplete( gms.busterPlayer, gms.owner, tokenId, sessionId, difficulty, gms.balance, 0 ); } } uint256 busterReceive; if (!overTime && !notInbound) { if (verifyGame(gms, tokenId, ghostPosition, nonce, sessionId)) { busterReceive = gms.balance - ghostReceive[gms.numberOfBusters - 1]; booRef.transfer(gms.busterPlayer, busterReceive); booRef.transfer( gms.owner, ghostReceive[gms.numberOfBusters - 1] ); if (gms.numberOfBusters == 1) { booRef.mint(gms.busterPlayer, BUSTER_BONUS[1]); } else if (gms.numberOfBusters == 2) { booRef.mint(gms.busterPlayer, BUSTER_BONUS[0]); } level.updateExp(tokenId, false, difficulty); for (uint256 i = 0; i < gms.numberOfBusters; i++) { level.updateExp(gms.busterTokenIds[i], true, difficulty); } emit GameComplete( gms.busterPlayer, gms.owner, tokenId, sessionId, difficulty, busterReceive, ghostReceive[gms.numberOfBusters - 1] ); } else { booRef.transfer(gms.owner, gms.balance); level.updateExp(tokenId, true, difficulty); for (uint256 i = 0; i < gms.numberOfBusters; i++) { level.updateExp(gms.busterTokenIds[i], false, difficulty); } emit GameComplete( gms.owner, gms.busterPlayer, tokenId, sessionId, difficulty, gms.balance, 0 ); TIDtoGMS[tokenId][sessionId].won = true; } } clearMap(tokenId, sessionId, gms.owner, gms.busterPlayer); } function pseudoRandom(address sender) internal returns (uint256) { return uint256( keccak256( abi.encodePacked( sender, tx.gasprice, block.timestamp, activeSessions.length, sender ) ) ); } function removeActiveGhostMap(uint256 tokenId, uint256 sessionId) internal { for (uint256 i = 0; i < activeSessions.length; i++) { if ( activeSessions[i].tokenId == tokenId && activeSessions[i].sessionId == sessionId ) { activeSessions[i] = activeSessions[activeSessions.length - 1]; activeSessions.pop(); break; } } for (uint256 i = 0; i < TIDtoActiveSessions[tokenId].length; i++) { if (TIDtoActiveSessions[tokenId][i] == sessionId) { TIDtoActiveSessions[tokenId][i] = TIDtoActiveSessions[tokenId][ TIDtoActiveSessions[tokenId].length - 1 ]; TIDtoActiveSessions[tokenId].pop(); return; } } } function removeClaimableSession( address owner, uint256 tokenId, uint256 sessionId ) internal { for (uint256 i = 0; i < claimableSessions[owner].length; i++) { if ( claimableSessions[owner][i].tokenId == tokenId && claimableSessions[owner][i].sessionId == sessionId ) { claimableSessions[owner][i] = claimableSessions[owner][ claimableSessions[owner].length - 1 ]; claimableSessions[owner].pop(); return; } } } function notSamePosition(int256[2] calldata pos1, int256[2] calldata pos2) internal pure returns (bool) { return !(pos1[0] == pos2[0] && pos1[1] == pos2[1]); } function clearMap( uint256 tokenId, uint256 sessionId, address gp, address bp ) internal { TIDtoGMS[tokenId][sessionId].balance = 0; TIDtoGMS[tokenId][sessionId].active = false; ownerMatchHistory[gp].push([tokenId, sessionId]); ownerMatchHistory[bp].push([tokenId, sessionId]); removeClaimableSession(gp, tokenId, sessionId); removeClaimableSession(bp, tokenId, sessionId); } function createCommitment( uint256 tId, int256[2] calldata gp, uint256 nonce ) public pure returns (bytes32) { return bytes32(keccak256(abi.encodePacked(tId, gp[0], gp[1], nonce))); } function playRequirements( uint256[] calldata bi, int256[2][] calldata bp, uint256 tokenId ) internal { IStakeManager smRef = sm; IPeekABoo peekabooRef = peekaboo; require(bi.length == bp.length, "Incorrect lengths"); require( bi.length <= 3 && bi.length > 0, "Can only play with up to 3 busters" ); require( smRef.ownerOf(bi[0]) == _msgSender(), "Not staked or not your buster" ); require( !peekabooRef.getTokenTraits(bi[0]).isGhost, "You can't play with a ghost" ); require(!isNotInBound(tokenId, bp[0]), "buster1 not inbound"); if (bi.length == 2) { require( smRef.ownerOf(bi[1]) == _msgSender(), "Not staked or not your buster" ); require( !peekabooRef.getTokenTraits(bi[1]).isGhost, "You can't play with a ghost" ); require( notSamePosition(bp[0], bp[1]), "buster1 pos cannot be same as buster2" ); require(!isNotInBound(tokenId, bp[1]), "buster2 not inbound"); } else if (bi.length == 3) { require( smRef.ownerOf(bi[1]) == _msgSender() && smRef.ownerOf(bi[2]) == _msgSender(), "Not staked or not your buster" ); require( !peekabooRef.getTokenTraits(bi[1]).isGhost && !peekabooRef.getTokenTraits(bi[2]).isGhost, "You can't play with a ghost" ); require( notSamePosition(bp[0], bp[1]) && notSamePosition(bp[0], bp[2]) && notSamePosition(bp[1], bp[2]), "buster pos cannot be samee" ); require(!isNotInBound(tokenId, bp[1]), "buster2 not inbound"); require(!isNotInBound(tokenId, bp[2]), "buster3 not inbound"); } } }
// SPDX-License-Identifier: MIT LICENSE pragma solidity >0.8.0; import "./IHideNSeekV2.sol"; import "./IPeekABoo.sol"; import "./IStakeManager.sol"; import "./IBOO.sol"; import "./ILevel.sol"; contract HideNSeekBaseV2 { // reference to the peekaboo smart contract IPeekABoo public peekaboo; IBOO public boo; IStakeManager public sm; ILevel public level; address ACS; mapping(uint256 => mapping(uint256 => IHideNSeekV2.GhostMapSession)) public TIDtoGMS; mapping(uint256 => uint256) public TIDtoNextSessionNumber; mapping(uint256 => uint256[]) public TIDtoActiveSessions; mapping(address => uint256[2][]) public ownerMatchHistory; mapping(address => IHideNSeekV2.Session[]) public claimableSessions; mapping(address => IHideNSeekV2.Session) lockedSessions; IHideNSeekV2.Session[] activeSessions; uint256[3] public GHOST_COSTS; uint256[3] public BUSTER_COSTS; uint256[2] public BUSTER_BONUS; event StakedPeekABoo(address from, uint256 tokenId); event UnstakedPeekABoo(address from, uint256 tokenId); event ClaimedGhostMap(uint256 tokenId, uint256 sessionId); event PlayedGame(address from, uint256 tokenId, uint256 sessionId); event GhostMapCreated( address indexed ghostPlayer, uint256 indexed tokenId, uint256 session ); event GameComplete( address winner, address loser, uint256 indexed tokenId, uint256 indexed session, uint256 difficulty, uint256 winnerAmount, uint256 loserAmount ); uint256[3] public ghostReceive; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// 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 { } 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; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, 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 (last updated v4.5.0) (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 proxied contracts do not make use of 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 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "london", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sessionId","type":"uint256"}],"name":"ClaimedGhostMap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"address","name":"loser","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"session","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"difficulty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winnerAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loserAmount","type":"uint256"}],"name":"GameComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"ghostPlayer","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"session","type":"uint256"}],"name":"GhostMapCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sessionId","type":"uint256"}],"name":"PlayedGame","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"StakedPeekABoo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"UnstakedPeekABoo","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"BUSTER_BONUS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"BUSTER_COSTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"GHOST_COSTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"TIDtoActiveSessions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"TIDtoGMS","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"sessionId","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"bytes32","name":"commitment","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"busterPlayer","type":"address"},{"internalType":"uint256","name":"numberOfBusters","type":"uint256"},{"internalType":"uint256","name":"lockedTime","type":"uint256"},{"internalType":"uint256","name":"playedTime","type":"uint256"},{"internalType":"bool","name":"won","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"TIDtoNextSessionNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boo","outputs":[{"internalType":"contract IBOO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"sessionId","type":"uint256"}],"name":"claimBusterSession","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tId","type":"uint256"},{"internalType":"uint256[]","name":"sId","type":"uint256[]"},{"internalType":"int256[2][]","name":"gps","type":"int256[2][]"},{"internalType":"uint256[]","name":"nonces","type":"uint256[]"}],"name":"claimGhostMaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimableSessions","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"sessionId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"lockedBy","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tId","type":"uint256"},{"internalType":"int256[2]","name":"gp","type":"int256[2]"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"createCommitment","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tId","type":"uint256"},{"internalType":"bytes32[]","name":"cmm","type":"bytes32[]"}],"name":"createGhostMaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"generateLockedSession","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"sessionId","type":"uint256"}],"name":"getGhostMapSessionStats","outputs":[{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"sessionId","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"bytes32","name":"commitment","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"busterPlayer","type":"address"},{"internalType":"uint256","name":"numberOfBusters","type":"uint256"},{"internalType":"uint256[3]","name":"busterTokenIds","type":"uint256[3]"},{"internalType":"int256[2][3]","name":"busterPositions","type":"int256[2][3]"},{"internalType":"uint256","name":"lockedTime","type":"uint256"},{"internalType":"uint256","name":"playedTime","type":"uint256"},{"internalType":"bool","name":"won","type":"bool"}],"internalType":"struct IHideNSeekV2.GhostMapSession","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLockedSession","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"sessionId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"lockedBy","type":"address"}],"internalType":"struct IHideNSeekV2.Session","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenIdActiveSessions","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ghostReceive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"level","outputs":[{"internalType":"contract ILevel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"matchHistory","outputs":[{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"sessionId","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"bytes32","name":"commitment","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"busterPlayer","type":"address"},{"internalType":"uint256","name":"numberOfBusters","type":"uint256"},{"internalType":"uint256[3]","name":"busterTokenIds","type":"uint256[3]"},{"internalType":"int256[2][3]","name":"busterPositions","type":"int256[2][3]"},{"internalType":"uint256","name":"lockedTime","type":"uint256"},{"internalType":"uint256","name":"playedTime","type":"uint256"},{"internalType":"bool","name":"won","type":"bool"}],"internalType":"struct IHideNSeekV2.GhostMapSession[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberOfClaimableSessions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerMatchHistory","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"peekaboo","outputs":[{"internalType":"contract IPeekABoo","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"bi","type":"uint256[]"},{"internalType":"int256[2][]","name":"bp","type":"int256[2][]"}],"name":"playGameSession","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"autoClaimAddress","type":"address"}],"name":"setAutoClaimServer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_boo","type":"address"}],"name":"setBOO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"_BONUS","type":"uint256[2]"}],"name":"setBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[3]","name":"_BUSTER_COST","type":"uint256[3]"}],"name":"setBusterCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[3]","name":"_GHOST_COST","type":"uint256[3]"}],"name":"setGhostCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_level","type":"address"}],"name":"setLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_peekaboo","type":"address"}],"name":"setPeekABoo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sm","type":"address"}],"name":"setStakeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sm","outputs":[{"internalType":"contract IStakeManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakePeekABoo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakePeekABoo","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50615fb380620000216000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c806387b5b05e11610130578063b8063947116100b8578063e0f46a7e1161007c578063e0f46a7e1461052d578063e62deb9814610630578063ea1e97ff146106c5578063ec429abb146106d8578063f2fde38b146106eb57600080fd5b8063b8063947146104d9578063baf34e35146104ec578063d772ac6b146104ff578063da8c36af14610512578063de491c231461052557600080fd5b80639b19d0c8116100ff5780639b19d0c81461046d5780639ee1a69114610480578063a112245914610493578063aa237e3f146104b3578063afd6e65d146104c657600080fd5b806387b5b05e146104165780638da5cb5b1461042957806392cb91011461043a578063943b57181461044d57600080fd5b80635024b104116101be5780637052fb97116101825780637052fb97146103aa578063715018a6146103ca5780637cd570b6146103d25780638129fc1c146103e5578063829e4721146103ed57600080fd5b80635024b1041461033e5780635b2df6ef1461035e5780636783e7fb146103715780636fd5ae151461038457806370019c6c1461039757600080fd5b80632a615cf8116102055780632a615cf8146102b95780632b69c7f7146102da578063419cd50b146102ed578063462720f9146103005780634b3df2001461031357600080fd5b806306a3faac146102375780630e7c67fc1461024c57806319a0b2691461025f5780632092406a146102a6575b600080fd5b61024a6102453660046154d4565b6106fe565b005b61024a61025a366004615568565b610742565b61027261026d366004615585565b61078e565b6040805194855260208501939093526001600160a01b03918216928401929092521660608201526080015b60405180910390f35b61024a6102b43660046155fc565b6107e1565b6102cc6102c736600461563d565b610c52565b60405190815260200161029d565b6102cc6102e836600461563d565b610c69565b61024a6102fb366004615568565b610c79565b6102cc61030e366004615656565b610cc5565b606654610326906001600160a01b031681565b6040516001600160a01b03909116815260200161029d565b61035161034c366004615692565b610d07565b60405161029d91906157f5565b61024a61036c366004615568565b610e77565b61024a61037f366004615804565b610ec3565b606854610326906001600160a01b031681565b61024a6103a536600461585c565b610efa565b6102cc6103b836600461563d565b606b6020526000908152604090205481565b61024a611631565b606754610326906001600160a01b031681565b61024a611667565b6102cc6103fb366004615568565b6001600160a01b03166000908152606e602052604090205490565b6102cc610424366004615692565b61181e565b6033546001600160a01b0316610326565b61024a610448366004615568565b61184f565b61046061045b366004615568565b61189b565b60405161029d91906158a7565b61024a61047b36600461593a565b611b91565b61024a61048e3660046155fc565b611da9565b6104a66104a136600461563d565b611e70565b60405161029d91906159dd565b61024a6104c1366004615692565b611ed2565b6102cc6104d4366004615a15565b612283565b61024a6104e7366004615a4a565b6122c5565b61024a6104fa366004615804565b61279d565b6102cc61050d36600461563d565b6127d4565b606554610326906001600160a01b031681565b61024a6127e4565b6105be61053b366004615692565b606a602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a015460138b015460148c01546015909c015460ff9b8c169c9a9b999a98999798969795966001600160a01b0395861696959094169492939192168d565b604080519d15158e5260208e019c909c529a8c019990995260608b019790975260808a019590955260a089019390935260c08801919091526001600160a01b0390811660e08801521661010086015261012085015261014084015261016083015215156101808201526101a00161029d565b6040805160808082018352600080835260208084018290528385018290526060938401829052338252606f815290849020845180840186528154808252600183015482850190815260028401546001600160a01b03908116848a01908152600390950154811693880193845288519283529051948201949094529151831695820195909552935116918301919091520161029d565b61024a6106d3366004615568565b612cab565b6102cc6106e636600461563d565b612cf7565b61024a6106f9366004615568565b612d07565b6033546001600160a01b031633146107315760405162461bcd60e51b815260040161072890615ab5565b60405180910390fd5b61073e60778260026151f2565b5050565b6033546001600160a01b0316331461076c5760405162461bcd60e51b815260040161072890615ab5565b606780546001600160a01b0319166001600160a01b0392909216919091179055565b606e60205281600052604060002081815481106107aa57600080fd5b6000918252602090912060049091020180546001820154600283015460039093015491945092506001600160a01b03918216911684565b6065546067546001600160a01b0391821691166000805b84811015610c4a57826001600160a01b0316846001600160a01b0316636352211e88888581811061082b5761082b615aea565b905060200201356040518263ffffffff1660e01b815260040161085091815260200190565b602060405180830381865afa15801561086d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108919190615b00565b6001600160a01b0316146108d95760405162461bcd60e51b815260206004820152600f60248201526e2737ba103cb7bab9103a37b5b2b71760891b6044820152606401610728565b826001600160a01b031663060ce4e48787848181106108fa576108fa615aea565b905060200201356040518263ffffffff1660e01b815260040161091f91815260200190565b600060405180830381600087803b15801561093957600080fd5b505af115801561094d573d6000803e3d6000fd5b50505050836001600160a01b03166394e5684787878481811061097257610972615aea565b905060200201356040518263ffffffff1660e01b815260040161099791815260200190565b61018060405180830381865afa1580156109b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d99190615b49565b5115610c385760005b606c60008888858181106109f8576109f8615aea565b90506020020135815260200190815260200160002080549050811015610c3657606c6000888885818110610a2e57610a2e615aea565b9050602002013581526020019081526020016000208181548110610a5457610a54615aea565b90600052602060002001549250610a83878784818110610a7657610a76615aea565b9050602002013584612d9f565b6066546001600160a01b031663a9059cbb606a60008a8a87818110610aaa57610aaa615aea565b6020908102929092013583525081810192909252604090810160009081208882529092528120600701546001600160a01b031690606a908b8b88818110610af357610af3615aea565b9050602002013581526020019081526020016000206000878152602001908152602001600020600501546040518363ffffffff1660e01b8152600401610b4e9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015610b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b919190615c04565b506000606a6000898986818110610baa57610baa615aea565b9050602002013581526020019081526020016000206000858152602001908152602001600020600501819055506000606a6000898986818110610bef57610bef615aea565b6020908102929092013583525081810192909252604090810160009081208782529092529020805460ff191691151591909117905580610c2e81615c35565b9150506109e2565b505b80610c4281615c35565b9150506107f8565b505050505050565b60798160038110610c6257600080fd5b0154905081565b60748160038110610c6257600080fd5b6033546001600160a01b03163314610ca35760405162461bcd60e51b815260040161072890615ab5565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b60408051602080820186905284358284015284810135606083015260808083018590528351808403909101815260a090920190925280519101205b9392505050565b610d0f615230565b6000838152606a6020908152604080832085845282529182902082516101e081018452815460ff161515815260018201549281019290925260028101548284015260038082015460608085019190915260048301546080850152600583015460a0850152600683015460c085015260078301546001600160a01b0390811660e08601526008840154166101008501526009830154610120850152845190810194859052929391926101408501929091600a85019182845b815481526020019060010190808311610dc65750505091835250506040805160608101909152602090910190600d830160036000835b82821015610e4257604080518082019182905290600284810287019182845b815481526020019060010190808311610e1b57505050505081526020019060010190610dfc565b50505090825250601382015460208201526014820154604082015260159091015460ff16151560609091015290505b92915050565b6033546001600160a01b03163314610ea15760405162461bcd60e51b815260040161072890615ab5565b606980546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610eed5760405162461bcd60e51b815260040161072890615ab5565b61073e60748260036152cb565b6066546065546067546001600160a01b03928316929182169116323314610f575760405162461bcd60e51b81526020600482015260116024820152704e6f20536d617274436f6e74726163747360781b6044820152606401610728565b6040516321c4542560e21b8152600481018790523060248201526001600160a01b03821690638711509490604401602060405180830381865afa158015610fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc69190615c04565b6110125760405162461bcd60e51b815260206004820152601f60248201527f54686973206973206e6f74207374616b656420696e20486964654e5365656b006044820152606401610728565b6040516394e5684760e01b8152600481018790526001600160a01b038316906394e568479060240161018060405180830381865afa158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c9190615b49565b516110b75760405162461bcd60e51b815260206004820152600b60248201526a139bdd08184819da1bdcdd60aa1b6044820152606401610728565b336040516331a9108f60e11b8152600481018890526001600160a01b0391821691831690636352211e906024016020604051808303816000875af1158015611103573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111279190615b00565b6001600160a01b0316146111755760405162461bcd60e51b81526020600482015260156024820152742a3434b99034b9b713ba103cb7bab9103a37b5b2b760591b6044820152606401610728565b6040516320aeff8960e11b8152600481018790526001600160a01b0383169063415dff1290602401610ce060405180830381865afa1580156111bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111df9190615c50565b6060015161122f5760405162461bcd60e51b815260206004820152601b60248201527f47686f73746d6170206973206e6f7420696e697469616c697a656400000000006044820152606401610728565b604051630ccc702360e41b8152600481018790526001600160a01b0382169063ccc7023090602401600060405180830381600087803b15801561127157600080fd5b505af1158015611285573d6000803e3d6000fd5b50506040516317bad50b60e11b815260048101899052602481018790526001600160a01b0384169250632f75aa169150604401600060405180830381600087803b1580156112d257600080fd5b505af11580156112e6573d6000803e3d6000fd5b50506040516320aeff8960e11b815260048101899052600092506001600160a01b038516915063415dff1290602401610ce060405180830381865afa158015611333573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113579190615c50565b60400151905060006071826003811061137257611372615aea565b015490506000805b878110156115915760008a8152606b6020908152604080832054606a8352818420818552909252909120805460ff19166001908117825581018c905560028101829055600381018690556004810185905560050184905591508888828181106113e5576113e5615aea565b60008d8152606a6020908152604080832088845282529091209102929092013560068301555060070180546001600160a01b03191633179055611429826001615d29565b60008b8152606b6020908152604080832093909355606c81528282208054600180820183559184528284200186905583516080810185528e81528083018781523382870181815260608401878152607080549687018155909752925160049094027f8f6b23ffa15f0465e3176e15ca644cf24f86dc1312fe715484e3c4aead5eb78b81019490945590517f8f6b23ffa15f0465e3176e15ca644cf24f86dc1312fe715484e3c4aead5eb78c84015590517f8f6b23ffa15f0465e3176e15ca644cf24f86dc1312fe715484e3c4aead5eb78d830180546001600160a01b03199081166001600160a01b039384161790915594517f8f6b23ffa15f0465e3176e15ca644cf24f86dc1312fe715484e3c4aead5eb78e909301805490951692169190911790925591518481528c927f79348131f74fc4e027d69030639333e9dd8bd9cf93210920ea3fc14643ebbe3e910160405180910390a38061158981615c35565b91505061137a565b506001600160a01b0386166323b872dd33306115ad8b87615d41565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015611601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116259190615c04565b50505050505050505050565b6033546001600160a01b0316331461165b5760405162461bcd60e51b815260040161072890615ab5565b6116656000613015565b565b600054610100900460ff166116825760005460ff1615611686565b303b155b6116e95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610728565b600054610100900460ff1615801561170b576000805461ffff19166101011790555b611713613067565b604080516060810182526801158e460913d0000081526801a055690d9db80000602082015268022b1c8c1227a00000918101919091526117579060719060036152f8565b5060408051606081018252678ac7230489e8000081526801158e460913d0000060208201526801a055690d9db800009181019190915261179b9060749060036152f8565b5060408051808201909152674563918244f400008152678ac7230489e8000060208201526117cd906077906002615333565b506040805160608101825260008152674563918244f400006020820152678ac7230489e800009181019190915261180890607990600361536c565b50801561181b576000805461ff00191690555b50565b606c602052816000526040600020818154811061183a57600080fd5b90600052602060002001600091509150505481565b6033546001600160a01b031633146118795760405162461bcd60e51b815260040161072890615ab5565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152606d60209081526040808320805482518185028101850190935280835260609493849084015b828210156119205760008481526020902060408051808201918290529160028581029091019182845b8154815260200190600101908083116118f9575050505050815260200190600101906118d0565b505050509050600081516001600160401b0381111561194157611941615450565b60405190808252806020026020018201604052801561197a57816020015b611967615230565b81526020019060019003908161195f5790505b50905060005b8251811015611b8957606a600084838151811061199f5761199f615aea565b60200260200101516000600281106119b9576119b9615aea565b6020020151815260200190815260200160002060008483815181106119e0576119e0615aea565b60200260200101516001600281106119fa576119fa615aea565b60209081029190910151825281810192909252604090810160002081516101e081018352815460ff161515815260018201549381019390935260028101548383015260038082015460608086019190915260048301546080860152600583015460a0860152600683015460c086015260078301546001600160a01b0390811660e08701526008840154166101008601526009830154610120860152835190810193849052919261014085019291600a85019182845b815481526020019060010190808311611aaf5750505091835250506040805160608101909152602090910190600d830160036000835b82821015611b2b57604080518082019182905290600284810287019182845b815481526020019060010190808311611b0457505050505081526020019060010190611ae5565b50505090825250601382015460208201526014820154604082015260159091015460ff1615156060909101528251839083908110611b6b57611b6b615aea565b60200260200101819052508080611b8190615c35565b915050611980565b509392505050565b848114611bb05760405162461bcd60e51b815260040161072890615d60565b848314611bcf5760405162461bcd60e51b815260040161072890615d60565b6069546001600160a01b0316336001600160a01b031614611d2f576067546040516321c4542560e21b8152600481018990523060248201526001600160a01b0390911690638711509490604401602060405180830381865afa158015611c39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5d9190615c04565b8015611ce35750336067546040516331a9108f60e11b8152600481018a90526001600160a01b039283169290911690636352211e906024016020604051808303816000875af1158015611cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd89190615b00565b6001600160a01b0316145b611d2f5760405162461bcd60e51b815260206004820152601760248201527f6e6f74207374616b6564206f72206e6f74206f776e65720000000000000000006044820152606401610728565b60005b85811015611d9f57611d8d88888884818110611d5057611d50615aea565b90506020020135878785818110611d6957611d69615aea565b905060400201868686818110611d8157611d81615aea565b90506020020135613096565b80611d9781615c35565b915050611d32565b5050505050505050565b6067546001600160a01b031660005b82811015611e6a57816001600160a01b031663c3b527fa858584818110611de157611de1615aea565b9050602002013530611df03390565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152166044820152606401600060405180830381600087803b158015611e3f57600080fd5b505af1158015611e53573d6000803e3d6000fd5b505050508080611e6290615c35565b915050611db8565b50505050565b6000818152606c6020908152604091829020805483518184028101840190945280845260609392830182828015611ec657602002820191906000526020600020905b815481526020019060010190808311611eb2575b50505050509050919050565b6000828152606a60209081526040808320848452825280832081516101e081018352815460ff161515815260018201549381019390935260028101548383015260038082015460608086019190915260048301546080860152600583015460a0860152600683015460c086015260078301546001600160a01b0390811660e08701526008840154166101008601526009830154610120860152835190810193849052919261014085019291600a85019182845b815481526020019060010190808311611f855750505091835250506040805160608101909152602090910190600d830160036000835b8282101561200157604080518082019182905290600284810287019182845b815481526020019060010190808311611fda57505050505081526020019060010190611fbb565b50505090825250601382015460208201526014820154604082015260159091015460ff1615156060909101526101008101519091506001600160a01b0316331461208d5760405162461bcd60e51b815260206004820152601960248201527f6d757374206265207468652062757374657220706c61796572000000000000006044820152606401610728565b6067546040516321c4542560e21b8152600481018590523060248201526001600160a01b0390911690638711509490604401602060405180830381865afa1580156120dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121009190615c04565b61214c5760405162461bcd60e51b815260206004820152601f60248201527f54686973206973206e6f74207374616b656420696e20486964654e5365656b006044820152606401610728565b6101a081015161215f6201518042615d8b565b10156121a55760405162461bcd60e51b815260206004820152601560248201527467686f737420706c61796572206861732074696d6560581b6044820152606401610728565b60665461010082015160a083015160405163a9059cbb60e01b81526001600160a01b039283166004820152602481019190915291169063a9059cbb906044016020604051808303816000875af1158015612203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122279190615c04565b508183600080516020615f5e8339815191528361010001518460e0015185606001518660a001516000604051612261959493929190615da2565b60405180910390a361227e83838360e00151846101000151613ace565b505050565b606d602052826000526040600020828154811061229f57600080fd5b906000526020600020906002020181600281106122bb57600080fd5b0154925083915050565b606754336000908152606f60205260409020600301546001600160a01b0391821691166123405760405162461bcd60e51b8152602060048201526024808201527f596f752068617665206e6f74206c6f636b656420696e20612073657373696f6e604482015263081e595d60e21b6064820152608401610728565b336000908152606f602090815260408083208054600191820154818652606a8552838620818752855283862084516101e081018652815460ff1615158152938101549584019590955260028501548385015260038086015460608086019190915260048701546080860152600587015460a0860152600687015460c086015260078701546001600160a01b0390811660e0870152600888015416610100860152600987015461012086015285519081019586905292969195919491926101408501929091600a85019182845b81548152602001906001019080831161240c5750505091835250506040805160608101909152602090910190600d830160036000835b8282101561248857604080518082019182905290600284810287019182845b81548152602001906001019080831161246157505050505081526020019060010190612442565b50505090825250601382015460208201526014820154604082015260159091015460ff161515606090910152905060005b878110156125ce57846001600160a01b031663ccc702308a8a848181106124e2576124e2615aea565b905060200201356040518263ffffffff1660e01b815260040161250791815260200190565b600060405180830381600087803b15801561252157600080fd5b505af1158015612535573d6000803e3d6000fd5b50505050846001600160a01b0316632f75aa168a8a8481811061255a5761255a615aea565b9050602002013560016040518363ffffffff1660e01b8152600401612589929190918252602082015260400190565b600060405180830381600087803b1580156125a357600080fd5b505af11580156125b7573d6000803e3d6000fd5b5050505080806125c690615c35565b9150506124b9565b506125dc8888888887613ba0565b61260388888888878760748860600151600381106125fc576125fc615aea565b015461444b565b6000838152606a6020908152604080832085845282529182902042601490910155815133815290810185905280820184905290517f1672eae23529a9b0ac1de0bfdabd150ca14cba776759455856ec36f8a28462cf9181900360600190a160e08101516001600160a01b039081166000908152606e6020818152604080842033808652606f808552838720835460018082018655948952868920825460049092020190815584820154948101949094556002808201549085018054918b166001600160a01b031992831617905560039182015491909401805491909916931692909217909655858552929091528220929091906001600160a01b039081168252602080830193909352604091820160009081208554600180820188559683528583208254600490920201908155868201548188015560028083015481830180549187166001600160a01b031992831617905560039384015492840180549390961692811692909217909455338352606f90955292812081815594850155830180548316905591909101805490911690555050505050505050565b6033546001600160a01b031633146127c75760405162461bcd60e51b815260040161072890615ab5565b61073e60718260036152cb565b60778160028110610c6257600080fd5b336000908152606f60205260409020600301546001600160a01b03161561284d5760405162461bcd60e51b815260206004820152601860248201527f416c7265616479206c6f636b656420612073657373696f6e00000000000000006044820152606401610728565b60705460009061285c33614561565b6128669190615dd3565b905060005b336001600160a01b03166070838154811061288857612888615aea565b60009182526020909120600260049092020101546001600160a01b0316141561293057600581106128fb5760405162461bcd60e51b815260206004820152601860248201527f50726576656e74696e6720696e66696e697465206c6f6f7000000000000000006044820152606401610728565b6070548261290833614561565b6129129190615d29565b61291c9190615dd3565b91508061292881615c35565b91505061286b565b336070838154811061294457612944615aea565b906000526020600020906004020160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060006070838154811061298e5761298e615aea565b600091825260208083206040805160808082018352600495860290930180548083526001808301548488019081526002808501546001600160a01b03908116878901526003958601548116606080890191909152948c52606a8a52878c2092518c52918952868b2087516101e081018952815460ff161515815293810154998401999099528801548287015287840154828401529787015495810195909552600586015460a0860152600686015460c08601526007860154871660e08601526008860154909616610100850152600985015461012085015282519586019283905290965091936101408501929091600a8501919082845b815481526020019060010190808311612a855750505091835250506040805160608101909152602090910190600d830160036000835b82821015612b0157604080518082019182905290600284810287019182845b815481526020019060010190808311612ada57505050505081526020019060010190612abb565b50505090825250601382015460208201526014820154604082015260159091015460ff1615156060909101526066549091506001600160a01b03166323b872dd33306074856060015160038110612b5a57612b5a615aea565b01546040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015612bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd49190615c04565b506074816060015160038110612bec57612bec615aea565b015482516000908152606a6020908152604080832082870151845290915281206005018054909190612c1f908490615d29565b9091555050336000908152606f60209081526040808320855180825586840180516001840155878401516002840180546001600160a01b039283166001600160a01b03199182161790915560608a015160039095018054959092169416939093179092558452606a8352818420815185529092529091204260139091015582519051611e6a9190612d9f565b6033546001600160a01b03163314612cd55760405162461bcd60e51b815260040161072890615ab5565b606880546001600160a01b0319166001600160a01b0392909216919091179055565b60718160038110610c6257600080fd5b6033546001600160a01b03163314612d315760405162461bcd60e51b815260040161072890615ab5565b6001600160a01b038116612d965760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610728565b61181b81613015565b60005b607054811015612f0f578260708281548110612dc057612dc0615aea565b906000526020600020906004020160000154148015612e0257508160708281548110612dee57612dee615aea565b906000526020600020906004020160010154145b15612efd5760708054612e1790600190615d8b565b81548110612e2757612e27615aea565b906000526020600020906004020160708281548110612e4857612e48615aea565b6000918252602090912082546004909202019081556001808301549082015560028083015490820180546001600160a01b03199081166001600160a01b039384161790915560039384015493909201805490921692169190911790556070805480612eb557612eb5615df5565b60008281526020812060046000199093019283020181815560018101919091556002810180546001600160a01b03199081169091556003909101805490911690559055612f0f565b80612f0781615c35565b915050612da2565b5060005b6000838152606c602052604090205481101561227e576000838152606c60205260409020805483919083908110612f4c57612f4c615aea565b90600052602060002001541415613003576000838152606c602052604090208054612f7990600190615d8b565b81548110612f8957612f89615aea565b9060005260206000200154606c60008581526020019081526020016000208281548110612fb857612fb8615aea565b9060005260206000200181905550606c6000848152602001908152602001600020805480612fe857612fe8615df5565b60019003818190600052602060002001600090559055505050565b8061300d81615c35565b915050612f13565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1661308e5760405162461bcd60e51b815260040161072890615e0b565b6116656145b7565b6066546000858152606a60209081526040808320878452825280832081516101e081018352815460ff161515815260018201549381019390935260028101548383015260038082015460608086019190915260048301546080860152600583015460a0860152600683015460c086015260078301546001600160a01b0390811660e087015260088401548116610100870152600984015461012087015284519182019485905290961695919261014085019291600a85019182845b8154815260200190600101908083116131515750505091835250506040805160608101909152602090910190600d830160036000835b828210156131cd57604080518082019182905290600284810287019182845b8154815260200190600101908083116131a657505050505081526020019060010190613187565b50505090825250601382015460208201526014820154604082015260159091015460ff16151560609182015281015181519192509061324e5760405162461bcd60e51b815260206004820152601860248201527f53657373696f6e206e6f206c6f6e6765722061637469766500000000000000006044820152606401610728565b6101808201516000906132646201518042615d8b565b10159050600061327489886145e7565b9050811561336d5760e084015160a085015160405163a9059cbb60e01b81526001600160a01b0388169263a9059cbb926132c4926004016001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156132e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133079190615c04565b508789600080516020615f5e8339815191528660e00151876101000151878960a00151600060405161333d959493929190615da2565b60405180910390a36000898152606a602090815260408083208b84529091529020601501805460ff191660011790555b816134ad5761337e89898989614700565b6133dc5760405162461bcd60e51b815260206004820152602960248201527f436f6d6d69746d656e7420696e636f72726563742c20706c6561736520646f206044820152681b9bdd0818da19585d60ba1b6064820152608401610728565b80156134ad5761010084015160a085015160405163a9059cbb60e01b81526001600160a01b0388169263a9059cbb9261342b926004016001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561344a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346e9190615c04565b508789600080516020615f5e8339815191528661010001518760e00151878960a0015160006040516134a4959493929190615da2565b60405180910390a35b6000821580156134bb575081155b15613abd576134cd858b8a8a8d614763565b156138ac57607960018661012001516134e69190615d8b565b600381106134f6576134f6615aea565b01548560a001516135079190615d8b565b61010086015160405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925087169063a9059cbb906044016020604051808303816000875af115801561355f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135839190615c04565b50856001600160a01b031663a9059cbb8660e00151607960018961012001516135ac9190615d8b565b600381106135bc576135bc615aea565b01546040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015613609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061362d9190615c04565b50846101200151600114156136ae576101008501516078546040516340c10f1960e01b81526001600160a01b0392831660048201526024810191909152908716906340c10f1990604401600060405180830381600087803b15801561369157600080fd5b505af11580156136a5573d6000803e3d6000fd5b5050505061372a565b8461012001516002141561372a576101008501516077546040516340c10f1960e01b81526001600160a01b0392831660048201526024810191909152908716906340c10f1990604401600060405180830381600087803b15801561371157600080fd5b505af1158015613725573d6000803e3d6000fd5b505050505b6068546040516308f0ed1960e41b8152600481018c905260006024820152604481018690526001600160a01b0390911690638f0ed19090606401600060405180830381600087803b15801561377e57600080fd5b505af1158015613792573d6000803e3d6000fd5b5050505060005b856101200151811015613849576068546101408701516001600160a01b0390911690638f0ed1909083600381106137d2576137d2615aea565b60200201516040516001600160e01b031960e084901b16815260048101919091526001602482015260448101889052606401600060405180830381600087803b15801561381e57600080fd5b505af1158015613832573d6000803e3d6000fd5b50505050808061384190615c35565b915050613799565b50888a600080516020615f5e8339815191528761010001518860e001518886607960018d610120015161387c9190615d8b565b6003811061388c5761388c615aea565b015460405161389f959493929190615da2565b60405180910390a3613abd565b60e085015160a086015160405163a9059cbb60e01b81526001600160a01b0389169263a9059cbb926138f4926004016001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015613913573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139379190615c04565b506068546040516308f0ed1960e41b8152600481018c905260016024820152604481018690526001600160a01b0390911690638f0ed19090606401600060405180830381600087803b15801561398c57600080fd5b505af11580156139a0573d6000803e3d6000fd5b5050505060005b856101200151811015613a57576068546101408701516001600160a01b0390911690638f0ed1909083600381106139e0576139e0615aea565b60200201516040516001600160e01b031960e084901b16815260048101919091526000602482015260448101889052606401600060405180830381600087803b158015613a2c57600080fd5b505af1158015613a40573d6000803e3d6000fd5b505050508080613a4f90615c35565b9150506139a7565b50888a600080516020615f5e8339815191528760e00151886101000151888a60a001516000604051613a8d959493929190615da2565b60405180910390a360008a8152606a602090815260408083208c84529091529020601501805460ff191660011790555b6116258a8a8760e001518861010001515b6000848152606a60209081526040808320868452825280832060058101849055805460ff191690556001600160a01b0385168352606d82528083208151808301909252878252818301879052805460018101825590845291909220613b3b926002928302909101916151f2565b506001600160a01b0381166000908152606d602090815260408083208151808301909252878252818301879052805460018101825590845291909220613b89926002928302909101916151f2565b50613b9582858561497b565b611e6a81858561497b565b6067546065546001600160a01b039182169116858414613bd25760405162461bcd60e51b815260040161072890615d60565b60038611801590613be257508515155b613c395760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920706c6179207769746820757020746f2033206275737465604482015261727360f01b6064820152608401610728565b336001600160a01b038316636352211e8989600081613c5a57613c5a615aea565b905060200201356040518263ffffffff1660e01b8152600401613c7f91815260200190565b6020604051808303816000875af1158015613c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc29190615b00565b6001600160a01b031614613ce85760405162461bcd60e51b815260040161072890615e56565b806001600160a01b03166394e5684788886000818110613d0a57613d0a615aea565b905060200201356040518263ffffffff1660e01b8152600401613d2f91815260200190565b61018060405180830381865afa158015613d4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d719190615b49565b5115613d8f5760405162461bcd60e51b815260040161072890615e8d565b613db18386866000818110613da657613da6615aea565b9050604002016145e7565b15613df45760405162461bcd60e51b8152602060048201526013602482015272189d5cdd195c8c481b9bdd081a5b989bdd5b99606a1b6044820152606401610728565b600286141561404857336001600160a01b038316636352211e89896001818110613e2057613e20615aea565b905060200201356040518263ffffffff1660e01b8152600401613e4591815260200190565b6020604051808303816000875af1158015613e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e889190615b00565b6001600160a01b031614613eae5760405162461bcd60e51b815260040161072890615e56565b806001600160a01b03166394e5684788886001818110613ed057613ed0615aea565b905060200201356040518263ffffffff1660e01b8152600401613ef591815260200190565b61018060405180830381865afa158015613f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f379190615b49565b5115613f555760405162461bcd60e51b815260040161072890615e8d565b613f8f85856000818110613f6b57613f6b615aea565b90506040020186866001818110613f8457613f84615aea565b905060400201614b7b565b613fe95760405162461bcd60e51b815260206004820152602560248201527f6275737465723120706f732063616e6e6f742062652073616d6520617320627560448201526439ba32b91960d91b6064820152608401610728565b6140008386866001818110613da657613da6615aea565b156140435760405162461bcd60e51b8152602060048201526013602482015272189d5cdd195c8c881b9bdd081a5b989bdd5b99606a1b6044820152606401610728565b614442565b600386141561444257336001600160a01b038316636352211e8989600181811061407457614074615aea565b905060200201356040518263ffffffff1660e01b815260040161409991815260200190565b6020604051808303816000875af11580156140b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140dc9190615b00565b6001600160a01b03161480156141835750336001600160a01b038316636352211e8989600281811061411057614110615aea565b905060200201356040518263ffffffff1660e01b815260040161413591815260200190565b6020604051808303816000875af1158015614154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141789190615b00565b6001600160a01b0316145b61419f5760405162461bcd60e51b815260040161072890615e56565b806001600160a01b03166394e56847888860018181106141c1576141c1615aea565b905060200201356040518263ffffffff1660e01b81526004016141e691815260200190565b61018060405180830381865afa158015614204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142289190615b49565b511580156142bd5750806001600160a01b03166394e568478888600281811061425357614253615aea565b905060200201356040518263ffffffff1660e01b815260040161427891815260200190565b61018060405180830381865afa158015614296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142ba9190615b49565b51155b6142d95760405162461bcd60e51b815260040161072890615e8d565b6142ef85856000818110613f6b57613f6b615aea565b801561432557506143258585600081811061430c5761430c615aea565b90506040020186866002818110613f8457613f84615aea565b801561434257506143428585600181811061430c5761430c615aea565b61438e5760405162461bcd60e51b815260206004820152601a60248201527f62757374657220706f732063616e6e6f742062652073616d65650000000000006044820152606401610728565b6143a58386866001818110613da657613da6615aea565b156143e85760405162461bcd60e51b8152602060048201526013602482015272189d5cdd195c8c881b9bdd081a5b989bdd5b99606a1b6044820152606401610728565b6143ff8386866002818110613da657613da6615aea565b156144425760405162461bcd60e51b8152602060048201526013602482015272189d5cdd195c8cc81b9bdd081a5b989bdd5b99606a1b6044820152606401610728565b50505050505050565b6065546000848152606a6020908152604080832086845290915281206008810180546001600160a01b031916331790556009018890556001600160a01b03909116905b87811015614556578888828181106144a8576144a8615aea565b6000888152606a602090815260408083208a845282529091209102929092013591600a01905082600381106144df576144df615aea565b01558686828181106144f3576144f3615aea565b905060400201606a60008781526020019081526020016000206000868152602001908152602001600020600d01826003811061453157614531615aea565b600202019060026145439291906153a4565b508061454e81615c35565b91505061448e565b505050505050505050565b6070546040805160609390931b6bffffffffffffffffffffffff191660208085018290523a6034860152426054860152607485019390935260948401528051608881850301815260a89093019052815191012090565b600054610100900460ff166145de5760405162461bcd60e51b815260040161072890615e0b565b61166533613015565b6065546040516320aeff8960e11b81526004810184905260009182916001600160a01b039091169063415dff1290602401610ce060405180830381865afa158015614636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061465a9190615c50565b80519091506020840135600a811061467457614674615aea565b60200201518335600a811061468b5761468b615aea565b60200201516001148061469f575060008335125b806146ba5750600181602001516146b69190615ec4565b8335135b806146c9575060006020840135125b806146e75750600181602001516146e09190615ec4565b6020840135135b156146f6576001915050610e71565b5060009392505050565b6000848152606a6020908152604080832086845282528083206006015481518084018990528635928101929092529185013560608201526080810184905260a001604051602081830303815290604052805190602001201490505b949350505050565b6066546000906001600160a01b0316815b87610120015181101561496b57614883886101600151826003811061479b5761479b615aea565b60200201516065546101408b01516001600160a01b03909116906394e568479085600381106147cc576147cc615aea565b60200201516040518263ffffffff1660e01b81526004016147ef91815260200190565b61018060405180830381865afa15801561480d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148319190615b49565b61012001516001600160401b03168a6101400151846003811061485657614856615aea565b6020020151604080518082018252908b906002908390839080828437600092019190915250614b9d915050565b80614949575061494988610160015182600381106148a3576148a3615aea565b602002015189610140015183600381106148bf576148bf615aea565b6020020151604080518082018252908a90600290839083908082843760009201919091525050506101608c015185156148f95760006148fc565b60025b60ff166003811061490f5761490f615aea565b60200201518c61016001518660011461492957600161492c565b60025b60ff166003811061493f5761493f615aea565b6020020151614d18565b1561495957600192505050614972565b8061496381615c35565b915050614774565b5060009150505b95945050505050565b60005b6001600160a01b0384166000908152606e6020526040902054811015611e6a576001600160a01b0384166000908152606e602052604090208054849190839081106149cb576149cb615aea565b906000526020600020906004020160000154148015614a2657506001600160a01b0384166000908152606e60205260409020805483919083908110614a1257614a12615aea565b906000526020600020906004020160010154145b15614b69576001600160a01b0384166000908152606e602052604090208054614a5190600190615d8b565b81548110614a6157614a61615aea565b9060005260206000209060040201606e6000866001600160a01b03166001600160a01b031681526020019081526020016000208281548110614aa557614aa5615aea565b6000918252602080832084546004909302019182556001808501549083015560028085015490830180546001600160a01b03199081166001600160a01b0393841617909155600395860154959093018054909316948116949094179091559186168152606e90915260409020805480614b2057614b20615df5565b60008281526020812060046000199093019283020181815560018101919091556002810180546001600160a01b0319908116909155600390910180549091169055905550505050565b80614b7381615c35565b91505061497e565b600082358235148015614b95575060208381013590830135145b159392505050565b600083614c25576000195b60018113614c1f576000195b60018113614c0c578651614bc9908390615f03565b8451148015614bea57506020870151614be3908290615f03565b6020850151145b15614bfa5760019250505061475b565b80614c0481615f44565b915050614bb4565b5080614c1781615f44565b915050614ba8565b50614d0d565b8360011415614ca7576001195b60028113614c1f5785518351148015614c5d57506020860151614c56908290615f03565b6020840151145b80614c8657508551614c70908290615f03565b8351148015614c86575060208087015190840151145b15614c9557600191505061475b565b80614c9f81615f44565b915050614c32565b8360021415614d0d576001195b60028113614d0b578551614cc9908290615f03565b8351148015614cea57506020860151614ce3908290615f03565b6020840151145b15614cf957600191505061475b565b80614d0381615f44565b915050614cb4565b505b506000949350505050565b6065546040516394e5684760e01b8152600481018690526000916001600160a01b03169081906394e568479060240161018060405180830381865afa158015614d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d899190615b49565b61010001516001600160401b031660011415614dbf5786518560005b60200201511415614dba576001915050614972565b615115565b6040516394e5684760e01b8152600481018790526001600160a01b038216906394e568479060240161018060405180830381865afa158015614e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e299190615b49565b61010001516001600160401b031660021415614ec15783518751148015614e51575084518751145b80614e69575082518751148015614e69575084518751145b80614e8d575060208085015190880151148015614e8d575060208086015190880151145b80614eb2575060208084015190880151148015614eb257506020850151876001614da5565b15614dba576001915050614972565b6040516394e5684760e01b8152600481018790526001600160a01b038216906394e568479060240161018060405180830381865afa158015614f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f2b9190615b49565b61010001516001600160401b031660031415614f4e576020870151856001614da5565b6040516394e5684760e01b8152600481018790526001600160a01b038216906394e568479060240161018060405180830381865afa158015614f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fb89190615b49565b61010001516001600160401b03166004141561506f57614fd887856151a7565b80614fe85750614fe887846151a7565b15614dba576001195b60028113615069576001195b60028213615056578851615012908390615f03565b87511480156150335750602089015161502c908290615f03565b6020880151145b156150445760019350505050614972565b8161504e81615f44565b925050614ffd565b508061506181615f44565b915050614ff1565b50615115565b6040516394e5684760e01b8152600481018790526001600160a01b038216906394e568479060240161018060405180830381865afa1580156150b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150d99190615b49565b61010001516001600160401b03166005141561511557865185511480615106575060208088015190860151145b15615115576001915050614972565b5060009695505050505050565b6002811361519a576001195b60028213615187578751615143908390615f03565b86511480156151645750602088015161515d908290615f03565b6020870151145b15615175576001935050505061475b565b8161517f81615f44565b92505061512e565b508061519281615f44565b915050615122565b5050600095945050505050565b6020810151815160009182916151bd9190615f03565b602085015185516151ce9190615f03565b6151d89190615ec4565b90506001811315801561475b575060001913159392505050565b8260028101928215615220579160200282015b82811115615220578251825591602001919060010190615205565b5061522c9291506153d2565b5090565b604051806101e0016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000801916815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016152a16153e7565b81526020016152ae615405565b815260200160008152602001600081526020016000151581525090565b82600381019282156152205791602002820182811115615220578251825591602001919060010190615205565b8260038101928215615220579160200282015b82811115615220578251829068ffffffffffffffffff1690559160200191906001019061530b565b8260028101928215615220579160200282015b8281111561522057825182906001600160401b0316905591602001919060010190615346565b8260038101928215615220579160200282018281111561522057825182906001600160401b0316905591602001919060010190615346565b8260028101928215615220579160200282015b828111156152205782358255916020019190600101906153b7565b5b8082111561522c57600081556001016153d3565b60405180606001604052806003906020820280368337509192915050565b60405180606001604052806003905b61541c615432565b8152602001906001900390816154145790505090565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b038111828210171561548957615489615450565b60405290565b604051608081016001600160401b038111828210171561548957615489615450565b60405161014081016001600160401b038111828210171561548957615489615450565b6000604082840312156154e657600080fd5b82601f8301126154f557600080fd5b604051604081018181106001600160401b038211171561551757615517615450565b806040525080604084018581111561552e57600080fd5b845b81811015615548578035835260209283019201615530565b509195945050505050565b6001600160a01b038116811461181b57600080fd5b60006020828403121561557a57600080fd5b8135610d0081615553565b6000806040838503121561559857600080fd5b82356155a381615553565b946020939093013593505050565b60008083601f8401126155c357600080fd5b5081356001600160401b038111156155da57600080fd5b6020830191508360208260051b85010111156155f557600080fd5b9250929050565b6000806020838503121561560f57600080fd5b82356001600160401b0381111561562557600080fd5b615631858286016155b1565b90969095509350505050565b60006020828403121561564f57600080fd5b5035919050565b60008060006080848603121561566b57600080fd5b83359250606084018581111561568057600080fd5b60208501925080359150509250925092565b600080604083850312156156a557600080fd5b50508035926020909101359150565b8060005b6003811015611e6a5781518452602093840193909101906001016156b8565b806000805b600381101561572257825185835b60028110156157095782518252602092830192909101906001016156ea565b50505060409490940193602092909201916001016156dc565b5050505050565b8051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015161578560e08401826001600160a01b03169052565b50610100818101516001600160a01b0316908301526101208082015190830152610140808201516157b8828501826156b4565b50506101608101516101a06157cf818501836156d7565b610180830151610260850152820151610280840152506101c0015115156102a090910152565b6102c08101610e718284615729565b60006060828403121561581657600080fd5b82601f83011261582557600080fd5b604051606081018181106001600160401b038211171561584757615847615450565b60405280606084018581111561552e57600080fd5b60008060006040848603121561587157600080fd5b8335925060208401356001600160401b0381111561588e57600080fd5b61589a868287016155b1565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b818110156158ea576158d6838551615729565b928401926102c092909201916001016158c3565b50909695505050505050565b60008083601f84011261590857600080fd5b5081356001600160401b0381111561591f57600080fd5b6020830191508360208260061b85010111156155f557600080fd5b60008060008060008060006080888a03121561595557600080fd5b8735965060208801356001600160401b038082111561597357600080fd5b61597f8b838c016155b1565b909850965060408a013591508082111561599857600080fd5b6159a48b838c016158f6565b909650945060608a01359150808211156159bd57600080fd5b506159ca8a828b016155b1565b989b979a50959850939692959293505050565b6020808252825182820181905260009190848201906040850190845b818110156158ea578351835292840192918401916001016159f9565b600080600060608486031215615a2a57600080fd5b8335615a3581615553565b95602085013595506040909401359392505050565b60008060008060408587031215615a6057600080fd5b84356001600160401b0380821115615a7757600080fd5b615a83888389016155b1565b90965094506020870135915080821115615a9c57600080fd5b50615aa9878288016158f6565b95989497509550505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215615b1257600080fd5b8151610d0081615553565b80518015158114615b2d57600080fd5b919050565b80516001600160401b0381168114615b2d57600080fd5b60006101808284031215615b5c57600080fd5b615b64615466565b615b6d83615b1d565b81526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e0820152610100615bc3818501615b32565b90820152610120615bd5848201615b32565b90820152610140615be7848201615b32565b90820152610160615bf9848201615b32565b908201529392505050565b600060208284031215615c1657600080fd5b610d0082615b1d565b634e487b7160e01b600052601160045260246000fd5b6000600019821415615c4957615c49615c1f565b5060010190565b6000610ce08284031215615c6357600080fd5b615c6b61548f565b601f8481850112615c7b57600080fd5b615c836154b1565b80610c80860187811115615c9657600080fd5b865b81811015615cf9578885820112615caf5760008081fd5b615cb76154b1565b8061014083018b811115615ccb5760008081fd5b835b81811015615ce5578051845260209384019301615ccd565b505085525060209093019261014001615c98565b509084525160208401525050610ca08301516040820152615d1d610cc08401615b1d565b60608201529392505050565b60008219821115615d3c57615d3c615c1f565b500190565b6000816000190483118215151615615d5b57615d5b615c1f565b500290565b602080825260119082015270496e636f7272656374206c656e6774687360781b604082015260600190565b600082821015615d9d57615d9d615c1f565b500390565b6001600160a01b03958616815293909416602084015260408301919091526060820152608081019190915260a00190565b600082615df057634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6020808252601d908201527f4e6f74207374616b6564206f72206e6f7420796f757220627573746572000000604082015260600190565b6020808252601b908201527f596f752063616e277420706c6179207769746820612067686f73740000000000604082015260600190565b60008083128015600160ff1b850184121615615ee257615ee2615c1f565b6001600160ff1b0384018313811615615efd57615efd615c1f565b50500390565b600080821280156001600160ff1b0384900385131615615f2557615f25615c1f565b600160ff1b8390038412811615615f3e57615f3e615c1f565b50500190565b60006001600160ff1b03821415615c4957615c49615c1f56feb50a5330a1d22e4c86e141658e745abecd71401f198a58ce9385a2b74c615ef4a2646970667358221220d74863cbe4dff12e6406916949dc58742d10338ff7f51dea120ed21ecbffefa164736f6c634300080a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102325760003560e01c806387b5b05e11610130578063b8063947116100b8578063e0f46a7e1161007c578063e0f46a7e1461052d578063e62deb9814610630578063ea1e97ff146106c5578063ec429abb146106d8578063f2fde38b146106eb57600080fd5b8063b8063947146104d9578063baf34e35146104ec578063d772ac6b146104ff578063da8c36af14610512578063de491c231461052557600080fd5b80639b19d0c8116100ff5780639b19d0c81461046d5780639ee1a69114610480578063a112245914610493578063aa237e3f146104b3578063afd6e65d146104c657600080fd5b806387b5b05e146104165780638da5cb5b1461042957806392cb91011461043a578063943b57181461044d57600080fd5b80635024b104116101be5780637052fb97116101825780637052fb97146103aa578063715018a6146103ca5780637cd570b6146103d25780638129fc1c146103e5578063829e4721146103ed57600080fd5b80635024b1041461033e5780635b2df6ef1461035e5780636783e7fb146103715780636fd5ae151461038457806370019c6c1461039757600080fd5b80632a615cf8116102055780632a615cf8146102b95780632b69c7f7146102da578063419cd50b146102ed578063462720f9146103005780634b3df2001461031357600080fd5b806306a3faac146102375780630e7c67fc1461024c57806319a0b2691461025f5780632092406a146102a6575b600080fd5b61024a6102453660046154d4565b6106fe565b005b61024a61025a366004615568565b610742565b61027261026d366004615585565b61078e565b6040805194855260208501939093526001600160a01b03918216928401929092521660608201526080015b60405180910390f35b61024a6102b43660046155fc565b6107e1565b6102cc6102c736600461563d565b610c52565b60405190815260200161029d565b6102cc6102e836600461563d565b610c69565b61024a6102fb366004615568565b610c79565b6102cc61030e366004615656565b610cc5565b606654610326906001600160a01b031681565b6040516001600160a01b03909116815260200161029d565b61035161034c366004615692565b610d07565b60405161029d91906157f5565b61024a61036c366004615568565b610e77565b61024a61037f366004615804565b610ec3565b606854610326906001600160a01b031681565b61024a6103a536600461585c565b610efa565b6102cc6103b836600461563d565b606b6020526000908152604090205481565b61024a611631565b606754610326906001600160a01b031681565b61024a611667565b6102cc6103fb366004615568565b6001600160a01b03166000908152606e602052604090205490565b6102cc610424366004615692565b61181e565b6033546001600160a01b0316610326565b61024a610448366004615568565b61184f565b61046061045b366004615568565b61189b565b60405161029d91906158a7565b61024a61047b36600461593a565b611b91565b61024a61048e3660046155fc565b611da9565b6104a66104a136600461563d565b611e70565b60405161029d91906159dd565b61024a6104c1366004615692565b611ed2565b6102cc6104d4366004615a15565b612283565b61024a6104e7366004615a4a565b6122c5565b61024a6104fa366004615804565b61279d565b6102cc61050d36600461563d565b6127d4565b606554610326906001600160a01b031681565b61024a6127e4565b6105be61053b366004615692565b606a602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a015460138b015460148c01546015909c015460ff9b8c169c9a9b999a98999798969795966001600160a01b0395861696959094169492939192168d565b604080519d15158e5260208e019c909c529a8c019990995260608b019790975260808a019590955260a089019390935260c08801919091526001600160a01b0390811660e08801521661010086015261012085015261014084015261016083015215156101808201526101a00161029d565b6040805160808082018352600080835260208084018290528385018290526060938401829052338252606f815290849020845180840186528154808252600183015482850190815260028401546001600160a01b03908116848a01908152600390950154811693880193845288519283529051948201949094529151831695820195909552935116918301919091520161029d565b61024a6106d3366004615568565b612cab565b6102cc6106e636600461563d565b612cf7565b61024a6106f9366004615568565b612d07565b6033546001600160a01b031633146107315760405162461bcd60e51b815260040161072890615ab5565b60405180910390fd5b61073e60778260026151f2565b5050565b6033546001600160a01b0316331461076c5760405162461bcd60e51b815260040161072890615ab5565b606780546001600160a01b0319166001600160a01b0392909216919091179055565b606e60205281600052604060002081815481106107aa57600080fd5b6000918252602090912060049091020180546001820154600283015460039093015491945092506001600160a01b03918216911684565b6065546067546001600160a01b0391821691166000805b84811015610c4a57826001600160a01b0316846001600160a01b0316636352211e88888581811061082b5761082b615aea565b905060200201356040518263ffffffff1660e01b815260040161085091815260200190565b602060405180830381865afa15801561086d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108919190615b00565b6001600160a01b0316146108d95760405162461bcd60e51b815260206004820152600f60248201526e2737ba103cb7bab9103a37b5b2b71760891b6044820152606401610728565b826001600160a01b031663060ce4e48787848181106108fa576108fa615aea565b905060200201356040518263ffffffff1660e01b815260040161091f91815260200190565b600060405180830381600087803b15801561093957600080fd5b505af115801561094d573d6000803e3d6000fd5b50505050836001600160a01b03166394e5684787878481811061097257610972615aea565b905060200201356040518263ffffffff1660e01b815260040161099791815260200190565b61018060405180830381865afa1580156109b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d99190615b49565b5115610c385760005b606c60008888858181106109f8576109f8615aea565b90506020020135815260200190815260200160002080549050811015610c3657606c6000888885818110610a2e57610a2e615aea565b9050602002013581526020019081526020016000208181548110610a5457610a54615aea565b90600052602060002001549250610a83878784818110610a7657610a76615aea565b9050602002013584612d9f565b6066546001600160a01b031663a9059cbb606a60008a8a87818110610aaa57610aaa615aea565b6020908102929092013583525081810192909252604090810160009081208882529092528120600701546001600160a01b031690606a908b8b88818110610af357610af3615aea565b9050602002013581526020019081526020016000206000878152602001908152602001600020600501546040518363ffffffff1660e01b8152600401610b4e9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015610b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b919190615c04565b506000606a6000898986818110610baa57610baa615aea565b9050602002013581526020019081526020016000206000858152602001908152602001600020600501819055506000606a6000898986818110610bef57610bef615aea565b6020908102929092013583525081810192909252604090810160009081208782529092529020805460ff191691151591909117905580610c2e81615c35565b9150506109e2565b505b80610c4281615c35565b9150506107f8565b505050505050565b60798160038110610c6257600080fd5b0154905081565b60748160038110610c6257600080fd5b6033546001600160a01b03163314610ca35760405162461bcd60e51b815260040161072890615ab5565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b60408051602080820186905284358284015284810135606083015260808083018590528351808403909101815260a090920190925280519101205b9392505050565b610d0f615230565b6000838152606a6020908152604080832085845282529182902082516101e081018452815460ff161515815260018201549281019290925260028101548284015260038082015460608085019190915260048301546080850152600583015460a0850152600683015460c085015260078301546001600160a01b0390811660e08601526008840154166101008501526009830154610120850152845190810194859052929391926101408501929091600a85019182845b815481526020019060010190808311610dc65750505091835250506040805160608101909152602090910190600d830160036000835b82821015610e4257604080518082019182905290600284810287019182845b815481526020019060010190808311610e1b57505050505081526020019060010190610dfc565b50505090825250601382015460208201526014820154604082015260159091015460ff16151560609091015290505b92915050565b6033546001600160a01b03163314610ea15760405162461bcd60e51b815260040161072890615ab5565b606980546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610eed5760405162461bcd60e51b815260040161072890615ab5565b61073e60748260036152cb565b6066546065546067546001600160a01b03928316929182169116323314610f575760405162461bcd60e51b81526020600482015260116024820152704e6f20536d617274436f6e74726163747360781b6044820152606401610728565b6040516321c4542560e21b8152600481018790523060248201526001600160a01b03821690638711509490604401602060405180830381865afa158015610fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc69190615c04565b6110125760405162461bcd60e51b815260206004820152601f60248201527f54686973206973206e6f74207374616b656420696e20486964654e5365656b006044820152606401610728565b6040516394e5684760e01b8152600481018790526001600160a01b038316906394e568479060240161018060405180830381865afa158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c9190615b49565b516110b75760405162461bcd60e51b815260206004820152600b60248201526a139bdd08184819da1bdcdd60aa1b6044820152606401610728565b336040516331a9108f60e11b8152600481018890526001600160a01b0391821691831690636352211e906024016020604051808303816000875af1158015611103573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111279190615b00565b6001600160a01b0316146111755760405162461bcd60e51b81526020600482015260156024820152742a3434b99034b9b713ba103cb7bab9103a37b5b2b760591b6044820152606401610728565b6040516320aeff8960e11b8152600481018790526001600160a01b0383169063415dff1290602401610ce060405180830381865afa1580156111bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111df9190615c50565b6060015161122f5760405162461bcd60e51b815260206004820152601b60248201527f47686f73746d6170206973206e6f7420696e697469616c697a656400000000006044820152606401610728565b604051630ccc702360e41b8152600481018790526001600160a01b0382169063ccc7023090602401600060405180830381600087803b15801561127157600080fd5b505af1158015611285573d6000803e3d6000fd5b50506040516317bad50b60e11b815260048101899052602481018790526001600160a01b0384169250632f75aa169150604401600060405180830381600087803b1580156112d257600080fd5b505af11580156112e6573d6000803e3d6000fd5b50506040516320aeff8960e11b815260048101899052600092506001600160a01b038516915063415dff1290602401610ce060405180830381865afa158015611333573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113579190615c50565b60400151905060006071826003811061137257611372615aea565b015490506000805b878110156115915760008a8152606b6020908152604080832054606a8352818420818552909252909120805460ff19166001908117825581018c905560028101829055600381018690556004810185905560050184905591508888828181106113e5576113e5615aea565b60008d8152606a6020908152604080832088845282529091209102929092013560068301555060070180546001600160a01b03191633179055611429826001615d29565b60008b8152606b6020908152604080832093909355606c81528282208054600180820183559184528284200186905583516080810185528e81528083018781523382870181815260608401878152607080549687018155909752925160049094027f8f6b23ffa15f0465e3176e15ca644cf24f86dc1312fe715484e3c4aead5eb78b81019490945590517f8f6b23ffa15f0465e3176e15ca644cf24f86dc1312fe715484e3c4aead5eb78c84015590517f8f6b23ffa15f0465e3176e15ca644cf24f86dc1312fe715484e3c4aead5eb78d830180546001600160a01b03199081166001600160a01b039384161790915594517f8f6b23ffa15f0465e3176e15ca644cf24f86dc1312fe715484e3c4aead5eb78e909301805490951692169190911790925591518481528c927f79348131f74fc4e027d69030639333e9dd8bd9cf93210920ea3fc14643ebbe3e910160405180910390a38061158981615c35565b91505061137a565b506001600160a01b0386166323b872dd33306115ad8b87615d41565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015611601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116259190615c04565b50505050505050505050565b6033546001600160a01b0316331461165b5760405162461bcd60e51b815260040161072890615ab5565b6116656000613015565b565b600054610100900460ff166116825760005460ff1615611686565b303b155b6116e95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610728565b600054610100900460ff1615801561170b576000805461ffff19166101011790555b611713613067565b604080516060810182526801158e460913d0000081526801a055690d9db80000602082015268022b1c8c1227a00000918101919091526117579060719060036152f8565b5060408051606081018252678ac7230489e8000081526801158e460913d0000060208201526801a055690d9db800009181019190915261179b9060749060036152f8565b5060408051808201909152674563918244f400008152678ac7230489e8000060208201526117cd906077906002615333565b506040805160608101825260008152674563918244f400006020820152678ac7230489e800009181019190915261180890607990600361536c565b50801561181b576000805461ff00191690555b50565b606c602052816000526040600020818154811061183a57600080fd5b90600052602060002001600091509150505481565b6033546001600160a01b031633146118795760405162461bcd60e51b815260040161072890615ab5565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152606d60209081526040808320805482518185028101850190935280835260609493849084015b828210156119205760008481526020902060408051808201918290529160028581029091019182845b8154815260200190600101908083116118f9575050505050815260200190600101906118d0565b505050509050600081516001600160401b0381111561194157611941615450565b60405190808252806020026020018201604052801561197a57816020015b611967615230565b81526020019060019003908161195f5790505b50905060005b8251811015611b8957606a600084838151811061199f5761199f615aea565b60200260200101516000600281106119b9576119b9615aea565b6020020151815260200190815260200160002060008483815181106119e0576119e0615aea565b60200260200101516001600281106119fa576119fa615aea565b60209081029190910151825281810192909252604090810160002081516101e081018352815460ff161515815260018201549381019390935260028101548383015260038082015460608086019190915260048301546080860152600583015460a0860152600683015460c086015260078301546001600160a01b0390811660e08701526008840154166101008601526009830154610120860152835190810193849052919261014085019291600a85019182845b815481526020019060010190808311611aaf5750505091835250506040805160608101909152602090910190600d830160036000835b82821015611b2b57604080518082019182905290600284810287019182845b815481526020019060010190808311611b0457505050505081526020019060010190611ae5565b50505090825250601382015460208201526014820154604082015260159091015460ff1615156060909101528251839083908110611b6b57611b6b615aea565b60200260200101819052508080611b8190615c35565b915050611980565b509392505050565b848114611bb05760405162461bcd60e51b815260040161072890615d60565b848314611bcf5760405162461bcd60e51b815260040161072890615d60565b6069546001600160a01b0316336001600160a01b031614611d2f576067546040516321c4542560e21b8152600481018990523060248201526001600160a01b0390911690638711509490604401602060405180830381865afa158015611c39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5d9190615c04565b8015611ce35750336067546040516331a9108f60e11b8152600481018a90526001600160a01b039283169290911690636352211e906024016020604051808303816000875af1158015611cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd89190615b00565b6001600160a01b0316145b611d2f5760405162461bcd60e51b815260206004820152601760248201527f6e6f74207374616b6564206f72206e6f74206f776e65720000000000000000006044820152606401610728565b60005b85811015611d9f57611d8d88888884818110611d5057611d50615aea565b90506020020135878785818110611d6957611d69615aea565b905060400201868686818110611d8157611d81615aea565b90506020020135613096565b80611d9781615c35565b915050611d32565b5050505050505050565b6067546001600160a01b031660005b82811015611e6a57816001600160a01b031663c3b527fa858584818110611de157611de1615aea565b9050602002013530611df03390565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152166044820152606401600060405180830381600087803b158015611e3f57600080fd5b505af1158015611e53573d6000803e3d6000fd5b505050508080611e6290615c35565b915050611db8565b50505050565b6000818152606c6020908152604091829020805483518184028101840190945280845260609392830182828015611ec657602002820191906000526020600020905b815481526020019060010190808311611eb2575b50505050509050919050565b6000828152606a60209081526040808320848452825280832081516101e081018352815460ff161515815260018201549381019390935260028101548383015260038082015460608086019190915260048301546080860152600583015460a0860152600683015460c086015260078301546001600160a01b0390811660e08701526008840154166101008601526009830154610120860152835190810193849052919261014085019291600a85019182845b815481526020019060010190808311611f855750505091835250506040805160608101909152602090910190600d830160036000835b8282101561200157604080518082019182905290600284810287019182845b815481526020019060010190808311611fda57505050505081526020019060010190611fbb565b50505090825250601382015460208201526014820154604082015260159091015460ff1615156060909101526101008101519091506001600160a01b0316331461208d5760405162461bcd60e51b815260206004820152601960248201527f6d757374206265207468652062757374657220706c61796572000000000000006044820152606401610728565b6067546040516321c4542560e21b8152600481018590523060248201526001600160a01b0390911690638711509490604401602060405180830381865afa1580156120dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121009190615c04565b61214c5760405162461bcd60e51b815260206004820152601f60248201527f54686973206973206e6f74207374616b656420696e20486964654e5365656b006044820152606401610728565b6101a081015161215f6201518042615d8b565b10156121a55760405162461bcd60e51b815260206004820152601560248201527467686f737420706c61796572206861732074696d6560581b6044820152606401610728565b60665461010082015160a083015160405163a9059cbb60e01b81526001600160a01b039283166004820152602481019190915291169063a9059cbb906044016020604051808303816000875af1158015612203573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122279190615c04565b508183600080516020615f5e8339815191528361010001518460e0015185606001518660a001516000604051612261959493929190615da2565b60405180910390a361227e83838360e00151846101000151613ace565b505050565b606d602052826000526040600020828154811061229f57600080fd5b906000526020600020906002020181600281106122bb57600080fd5b0154925083915050565b606754336000908152606f60205260409020600301546001600160a01b0391821691166123405760405162461bcd60e51b8152602060048201526024808201527f596f752068617665206e6f74206c6f636b656420696e20612073657373696f6e604482015263081e595d60e21b6064820152608401610728565b336000908152606f602090815260408083208054600191820154818652606a8552838620818752855283862084516101e081018652815460ff1615158152938101549584019590955260028501548385015260038086015460608086019190915260048701546080860152600587015460a0860152600687015460c086015260078701546001600160a01b0390811660e0870152600888015416610100860152600987015461012086015285519081019586905292969195919491926101408501929091600a85019182845b81548152602001906001019080831161240c5750505091835250506040805160608101909152602090910190600d830160036000835b8282101561248857604080518082019182905290600284810287019182845b81548152602001906001019080831161246157505050505081526020019060010190612442565b50505090825250601382015460208201526014820154604082015260159091015460ff161515606090910152905060005b878110156125ce57846001600160a01b031663ccc702308a8a848181106124e2576124e2615aea565b905060200201356040518263ffffffff1660e01b815260040161250791815260200190565b600060405180830381600087803b15801561252157600080fd5b505af1158015612535573d6000803e3d6000fd5b50505050846001600160a01b0316632f75aa168a8a8481811061255a5761255a615aea565b9050602002013560016040518363ffffffff1660e01b8152600401612589929190918252602082015260400190565b600060405180830381600087803b1580156125a357600080fd5b505af11580156125b7573d6000803e3d6000fd5b5050505080806125c690615c35565b9150506124b9565b506125dc8888888887613ba0565b61260388888888878760748860600151600381106125fc576125fc615aea565b015461444b565b6000838152606a6020908152604080832085845282529182902042601490910155815133815290810185905280820184905290517f1672eae23529a9b0ac1de0bfdabd150ca14cba776759455856ec36f8a28462cf9181900360600190a160e08101516001600160a01b039081166000908152606e6020818152604080842033808652606f808552838720835460018082018655948952868920825460049092020190815584820154948101949094556002808201549085018054918b166001600160a01b031992831617905560039182015491909401805491909916931692909217909655858552929091528220929091906001600160a01b039081168252602080830193909352604091820160009081208554600180820188559683528583208254600490920201908155868201548188015560028083015481830180549187166001600160a01b031992831617905560039384015492840180549390961692811692909217909455338352606f90955292812081815594850155830180548316905591909101805490911690555050505050505050565b6033546001600160a01b031633146127c75760405162461bcd60e51b815260040161072890615ab5565b61073e60718260036152cb565b60778160028110610c6257600080fd5b336000908152606f60205260409020600301546001600160a01b03161561284d5760405162461bcd60e51b815260206004820152601860248201527f416c7265616479206c6f636b656420612073657373696f6e00000000000000006044820152606401610728565b60705460009061285c33614561565b6128669190615dd3565b905060005b336001600160a01b03166070838154811061288857612888615aea565b60009182526020909120600260049092020101546001600160a01b0316141561293057600581106128fb5760405162461bcd60e51b815260206004820152601860248201527f50726576656e74696e6720696e66696e697465206c6f6f7000000000000000006044820152606401610728565b6070548261290833614561565b6129129190615d29565b61291c9190615dd3565b91508061292881615c35565b91505061286b565b336070838154811061294457612944615aea565b906000526020600020906004020160030160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060006070838154811061298e5761298e615aea565b600091825260208083206040805160808082018352600495860290930180548083526001808301548488019081526002808501546001600160a01b03908116878901526003958601548116606080890191909152948c52606a8a52878c2092518c52918952868b2087516101e081018952815460ff161515815293810154998401999099528801548287015287840154828401529787015495810195909552600586015460a0860152600686015460c08601526007860154871660e08601526008860154909616610100850152600985015461012085015282519586019283905290965091936101408501929091600a8501919082845b815481526020019060010190808311612a855750505091835250506040805160608101909152602090910190600d830160036000835b82821015612b0157604080518082019182905290600284810287019182845b815481526020019060010190808311612ada57505050505081526020019060010190612abb565b50505090825250601382015460208201526014820154604082015260159091015460ff1615156060909101526066549091506001600160a01b03166323b872dd33306074856060015160038110612b5a57612b5a615aea565b01546040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015612bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd49190615c04565b506074816060015160038110612bec57612bec615aea565b015482516000908152606a6020908152604080832082870151845290915281206005018054909190612c1f908490615d29565b9091555050336000908152606f60209081526040808320855180825586840180516001840155878401516002840180546001600160a01b039283166001600160a01b03199182161790915560608a015160039095018054959092169416939093179092558452606a8352818420815185529092529091204260139091015582519051611e6a9190612d9f565b6033546001600160a01b03163314612cd55760405162461bcd60e51b815260040161072890615ab5565b606880546001600160a01b0319166001600160a01b0392909216919091179055565b60718160038110610c6257600080fd5b6033546001600160a01b03163314612d315760405162461bcd60e51b815260040161072890615ab5565b6001600160a01b038116612d965760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610728565b61181b81613015565b60005b607054811015612f0f578260708281548110612dc057612dc0615aea565b906000526020600020906004020160000154148015612e0257508160708281548110612dee57612dee615aea565b906000526020600020906004020160010154145b15612efd5760708054612e1790600190615d8b565b81548110612e2757612e27615aea565b906000526020600020906004020160708281548110612e4857612e48615aea565b6000918252602090912082546004909202019081556001808301549082015560028083015490820180546001600160a01b03199081166001600160a01b039384161790915560039384015493909201805490921692169190911790556070805480612eb557612eb5615df5565b60008281526020812060046000199093019283020181815560018101919091556002810180546001600160a01b03199081169091556003909101805490911690559055612f0f565b80612f0781615c35565b915050612da2565b5060005b6000838152606c602052604090205481101561227e576000838152606c60205260409020805483919083908110612f4c57612f4c615aea565b90600052602060002001541415613003576000838152606c602052604090208054612f7990600190615d8b565b81548110612f8957612f89615aea565b9060005260206000200154606c60008581526020019081526020016000208281548110612fb857612fb8615aea565b9060005260206000200181905550606c6000848152602001908152602001600020805480612fe857612fe8615df5565b60019003818190600052602060002001600090559055505050565b8061300d81615c35565b915050612f13565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1661308e5760405162461bcd60e51b815260040161072890615e0b565b6116656145b7565b6066546000858152606a60209081526040808320878452825280832081516101e081018352815460ff161515815260018201549381019390935260028101548383015260038082015460608086019190915260048301546080860152600583015460a0860152600683015460c086015260078301546001600160a01b0390811660e087015260088401548116610100870152600984015461012087015284519182019485905290961695919261014085019291600a85019182845b8154815260200190600101908083116131515750505091835250506040805160608101909152602090910190600d830160036000835b828210156131cd57604080518082019182905290600284810287019182845b8154815260200190600101908083116131a657505050505081526020019060010190613187565b50505090825250601382015460208201526014820154604082015260159091015460ff16151560609182015281015181519192509061324e5760405162461bcd60e51b815260206004820152601860248201527f53657373696f6e206e6f206c6f6e6765722061637469766500000000000000006044820152606401610728565b6101808201516000906132646201518042615d8b565b10159050600061327489886145e7565b9050811561336d5760e084015160a085015160405163a9059cbb60e01b81526001600160a01b0388169263a9059cbb926132c4926004016001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156132e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133079190615c04565b508789600080516020615f5e8339815191528660e00151876101000151878960a00151600060405161333d959493929190615da2565b60405180910390a36000898152606a602090815260408083208b84529091529020601501805460ff191660011790555b816134ad5761337e89898989614700565b6133dc5760405162461bcd60e51b815260206004820152602960248201527f436f6d6d69746d656e7420696e636f72726563742c20706c6561736520646f206044820152681b9bdd0818da19585d60ba1b6064820152608401610728565b80156134ad5761010084015160a085015160405163a9059cbb60e01b81526001600160a01b0388169263a9059cbb9261342b926004016001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561344a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346e9190615c04565b508789600080516020615f5e8339815191528661010001518760e00151878960a0015160006040516134a4959493929190615da2565b60405180910390a35b6000821580156134bb575081155b15613abd576134cd858b8a8a8d614763565b156138ac57607960018661012001516134e69190615d8b565b600381106134f6576134f6615aea565b01548560a001516135079190615d8b565b61010086015160405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925087169063a9059cbb906044016020604051808303816000875af115801561355f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135839190615c04565b50856001600160a01b031663a9059cbb8660e00151607960018961012001516135ac9190615d8b565b600381106135bc576135bc615aea565b01546040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015613609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061362d9190615c04565b50846101200151600114156136ae576101008501516078546040516340c10f1960e01b81526001600160a01b0392831660048201526024810191909152908716906340c10f1990604401600060405180830381600087803b15801561369157600080fd5b505af11580156136a5573d6000803e3d6000fd5b5050505061372a565b8461012001516002141561372a576101008501516077546040516340c10f1960e01b81526001600160a01b0392831660048201526024810191909152908716906340c10f1990604401600060405180830381600087803b15801561371157600080fd5b505af1158015613725573d6000803e3d6000fd5b505050505b6068546040516308f0ed1960e41b8152600481018c905260006024820152604481018690526001600160a01b0390911690638f0ed19090606401600060405180830381600087803b15801561377e57600080fd5b505af1158015613792573d6000803e3d6000fd5b5050505060005b856101200151811015613849576068546101408701516001600160a01b0390911690638f0ed1909083600381106137d2576137d2615aea565b60200201516040516001600160e01b031960e084901b16815260048101919091526001602482015260448101889052606401600060405180830381600087803b15801561381e57600080fd5b505af1158015613832573d6000803e3d6000fd5b50505050808061384190615c35565b915050613799565b50888a600080516020615f5e8339815191528761010001518860e001518886607960018d610120015161387c9190615d8b565b6003811061388c5761388c615aea565b015460405161389f959493929190615da2565b60405180910390a3613abd565b60e085015160a086015160405163a9059cbb60e01b81526001600160a01b0389169263a9059cbb926138f4926004016001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015613913573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139379190615c04565b506068546040516308f0ed1960e41b8152600481018c905260016024820152604481018690526001600160a01b0390911690638f0ed19090606401600060405180830381600087803b15801561398c57600080fd5b505af11580156139a0573d6000803e3d6000fd5b5050505060005b856101200151811015613a57576068546101408701516001600160a01b0390911690638f0ed1909083600381106139e0576139e0615aea565b60200201516040516001600160e01b031960e084901b16815260048101919091526000602482015260448101889052606401600060405180830381600087803b158015613a2c57600080fd5b505af1158015613a40573d6000803e3d6000fd5b505050508080613a4f90615c35565b9150506139a7565b50888a600080516020615f5e8339815191528760e00151886101000151888a60a001516000604051613a8d959493929190615da2565b60405180910390a360008a8152606a602090815260408083208c84529091529020601501805460ff191660011790555b6116258a8a8760e001518861010001515b6000848152606a60209081526040808320868452825280832060058101849055805460ff191690556001600160a01b0385168352606d82528083208151808301909252878252818301879052805460018101825590845291909220613b3b926002928302909101916151f2565b506001600160a01b0381166000908152606d602090815260408083208151808301909252878252818301879052805460018101825590845291909220613b89926002928302909101916151f2565b50613b9582858561497b565b611e6a81858561497b565b6067546065546001600160a01b039182169116858414613bd25760405162461bcd60e51b815260040161072890615d60565b60038611801590613be257508515155b613c395760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920706c6179207769746820757020746f2033206275737465604482015261727360f01b6064820152608401610728565b336001600160a01b038316636352211e8989600081613c5a57613c5a615aea565b905060200201356040518263ffffffff1660e01b8152600401613c7f91815260200190565b6020604051808303816000875af1158015613c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc29190615b00565b6001600160a01b031614613ce85760405162461bcd60e51b815260040161072890615e56565b806001600160a01b03166394e5684788886000818110613d0a57613d0a615aea565b905060200201356040518263ffffffff1660e01b8152600401613d2f91815260200190565b61018060405180830381865afa158015613d4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d719190615b49565b5115613d8f5760405162461bcd60e51b815260040161072890615e8d565b613db18386866000818110613da657613da6615aea565b9050604002016145e7565b15613df45760405162461bcd60e51b8152602060048201526013602482015272189d5cdd195c8c481b9bdd081a5b989bdd5b99606a1b6044820152606401610728565b600286141561404857336001600160a01b038316636352211e89896001818110613e2057613e20615aea565b905060200201356040518263ffffffff1660e01b8152600401613e4591815260200190565b6020604051808303816000875af1158015613e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e889190615b00565b6001600160a01b031614613eae5760405162461bcd60e51b815260040161072890615e56565b806001600160a01b03166394e5684788886001818110613ed057613ed0615aea565b905060200201356040518263ffffffff1660e01b8152600401613ef591815260200190565b61018060405180830381865afa158015613f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f379190615b49565b5115613f555760405162461bcd60e51b815260040161072890615e8d565b613f8f85856000818110613f6b57613f6b615aea565b90506040020186866001818110613f8457613f84615aea565b905060400201614b7b565b613fe95760405162461bcd60e51b815260206004820152602560248201527f6275737465723120706f732063616e6e6f742062652073616d6520617320627560448201526439ba32b91960d91b6064820152608401610728565b6140008386866001818110613da657613da6615aea565b156140435760405162461bcd60e51b8152602060048201526013602482015272189d5cdd195c8c881b9bdd081a5b989bdd5b99606a1b6044820152606401610728565b614442565b600386141561444257336001600160a01b038316636352211e8989600181811061407457614074615aea565b905060200201356040518263ffffffff1660e01b815260040161409991815260200190565b6020604051808303816000875af11580156140b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140dc9190615b00565b6001600160a01b03161480156141835750336001600160a01b038316636352211e8989600281811061411057614110615aea565b905060200201356040518263ffffffff1660e01b815260040161413591815260200190565b6020604051808303816000875af1158015614154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141789190615b00565b6001600160a01b0316145b61419f5760405162461bcd60e51b815260040161072890615e56565b806001600160a01b03166394e56847888860018181106141c1576141c1615aea565b905060200201356040518263ffffffff1660e01b81526004016141e691815260200190565b61018060405180830381865afa158015614204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142289190615b49565b511580156142bd5750806001600160a01b03166394e568478888600281811061425357614253615aea565b905060200201356040518263ffffffff1660e01b815260040161427891815260200190565b61018060405180830381865afa158015614296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142ba9190615b49565b51155b6142d95760405162461bcd60e51b815260040161072890615e8d565b6142ef85856000818110613f6b57613f6b615aea565b801561432557506143258585600081811061430c5761430c615aea565b90506040020186866002818110613f8457613f84615aea565b801561434257506143428585600181811061430c5761430c615aea565b61438e5760405162461bcd60e51b815260206004820152601a60248201527f62757374657220706f732063616e6e6f742062652073616d65650000000000006044820152606401610728565b6143a58386866001818110613da657613da6615aea565b156143e85760405162461bcd60e51b8152602060048201526013602482015272189d5cdd195c8c881b9bdd081a5b989bdd5b99606a1b6044820152606401610728565b6143ff8386866002818110613da657613da6615aea565b156144425760405162461bcd60e51b8152602060048201526013602482015272189d5cdd195c8cc81b9bdd081a5b989bdd5b99606a1b6044820152606401610728565b50505050505050565b6065546000848152606a6020908152604080832086845290915281206008810180546001600160a01b031916331790556009018890556001600160a01b03909116905b87811015614556578888828181106144a8576144a8615aea565b6000888152606a602090815260408083208a845282529091209102929092013591600a01905082600381106144df576144df615aea565b01558686828181106144f3576144f3615aea565b905060400201606a60008781526020019081526020016000206000868152602001908152602001600020600d01826003811061453157614531615aea565b600202019060026145439291906153a4565b508061454e81615c35565b91505061448e565b505050505050505050565b6070546040805160609390931b6bffffffffffffffffffffffff191660208085018290523a6034860152426054860152607485019390935260948401528051608881850301815260a89093019052815191012090565b600054610100900460ff166145de5760405162461bcd60e51b815260040161072890615e0b565b61166533613015565b6065546040516320aeff8960e11b81526004810184905260009182916001600160a01b039091169063415dff1290602401610ce060405180830381865afa158015614636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061465a9190615c50565b80519091506020840135600a811061467457614674615aea565b60200201518335600a811061468b5761468b615aea565b60200201516001148061469f575060008335125b806146ba5750600181602001516146b69190615ec4565b8335135b806146c9575060006020840135125b806146e75750600181602001516146e09190615ec4565b6020840135135b156146f6576001915050610e71565b5060009392505050565b6000848152606a6020908152604080832086845282528083206006015481518084018990528635928101929092529185013560608201526080810184905260a001604051602081830303815290604052805190602001201490505b949350505050565b6066546000906001600160a01b0316815b87610120015181101561496b57614883886101600151826003811061479b5761479b615aea565b60200201516065546101408b01516001600160a01b03909116906394e568479085600381106147cc576147cc615aea565b60200201516040518263ffffffff1660e01b81526004016147ef91815260200190565b61018060405180830381865afa15801561480d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148319190615b49565b61012001516001600160401b03168a6101400151846003811061485657614856615aea565b6020020151604080518082018252908b906002908390839080828437600092019190915250614b9d915050565b80614949575061494988610160015182600381106148a3576148a3615aea565b602002015189610140015183600381106148bf576148bf615aea565b6020020151604080518082018252908a90600290839083908082843760009201919091525050506101608c015185156148f95760006148fc565b60025b60ff166003811061490f5761490f615aea565b60200201518c61016001518660011461492957600161492c565b60025b60ff166003811061493f5761493f615aea565b6020020151614d18565b1561495957600192505050614972565b8061496381615c35565b915050614774565b5060009150505b95945050505050565b60005b6001600160a01b0384166000908152606e6020526040902054811015611e6a576001600160a01b0384166000908152606e602052604090208054849190839081106149cb576149cb615aea565b906000526020600020906004020160000154148015614a2657506001600160a01b0384166000908152606e60205260409020805483919083908110614a1257614a12615aea565b906000526020600020906004020160010154145b15614b69576001600160a01b0384166000908152606e602052604090208054614a5190600190615d8b565b81548110614a6157614a61615aea565b9060005260206000209060040201606e6000866001600160a01b03166001600160a01b031681526020019081526020016000208281548110614aa557614aa5615aea565b6000918252602080832084546004909302019182556001808501549083015560028085015490830180546001600160a01b03199081166001600160a01b0393841617909155600395860154959093018054909316948116949094179091559186168152606e90915260409020805480614b2057614b20615df5565b60008281526020812060046000199093019283020181815560018101919091556002810180546001600160a01b0319908116909155600390910180549091169055905550505050565b80614b7381615c35565b91505061497e565b600082358235148015614b95575060208381013590830135145b159392505050565b600083614c25576000195b60018113614c1f576000195b60018113614c0c578651614bc9908390615f03565b8451148015614bea57506020870151614be3908290615f03565b6020850151145b15614bfa5760019250505061475b565b80614c0481615f44565b915050614bb4565b5080614c1781615f44565b915050614ba8565b50614d0d565b8360011415614ca7576001195b60028113614c1f5785518351148015614c5d57506020860151614c56908290615f03565b6020840151145b80614c8657508551614c70908290615f03565b8351148015614c86575060208087015190840151145b15614c9557600191505061475b565b80614c9f81615f44565b915050614c32565b8360021415614d0d576001195b60028113614d0b578551614cc9908290615f03565b8351148015614cea57506020860151614ce3908290615f03565b6020840151145b15614cf957600191505061475b565b80614d0381615f44565b915050614cb4565b505b506000949350505050565b6065546040516394e5684760e01b8152600481018690526000916001600160a01b03169081906394e568479060240161018060405180830381865afa158015614d65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d899190615b49565b61010001516001600160401b031660011415614dbf5786518560005b60200201511415614dba576001915050614972565b615115565b6040516394e5684760e01b8152600481018790526001600160a01b038216906394e568479060240161018060405180830381865afa158015614e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e299190615b49565b61010001516001600160401b031660021415614ec15783518751148015614e51575084518751145b80614e69575082518751148015614e69575084518751145b80614e8d575060208085015190880151148015614e8d575060208086015190880151145b80614eb2575060208084015190880151148015614eb257506020850151876001614da5565b15614dba576001915050614972565b6040516394e5684760e01b8152600481018790526001600160a01b038216906394e568479060240161018060405180830381865afa158015614f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f2b9190615b49565b61010001516001600160401b031660031415614f4e576020870151856001614da5565b6040516394e5684760e01b8152600481018790526001600160a01b038216906394e568479060240161018060405180830381865afa158015614f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fb89190615b49565b61010001516001600160401b03166004141561506f57614fd887856151a7565b80614fe85750614fe887846151a7565b15614dba576001195b60028113615069576001195b60028213615056578851615012908390615f03565b87511480156150335750602089015161502c908290615f03565b6020880151145b156150445760019350505050614972565b8161504e81615f44565b925050614ffd565b508061506181615f44565b915050614ff1565b50615115565b6040516394e5684760e01b8152600481018790526001600160a01b038216906394e568479060240161018060405180830381865afa1580156150b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150d99190615b49565b61010001516001600160401b03166005141561511557865185511480615106575060208088015190860151145b15615115576001915050614972565b5060009695505050505050565b6002811361519a576001195b60028213615187578751615143908390615f03565b86511480156151645750602088015161515d908290615f03565b6020870151145b15615175576001935050505061475b565b8161517f81615f44565b92505061512e565b508061519281615f44565b915050615122565b5050600095945050505050565b6020810151815160009182916151bd9190615f03565b602085015185516151ce9190615f03565b6151d89190615ec4565b90506001811315801561475b575060001913159392505050565b8260028101928215615220579160200282015b82811115615220578251825591602001919060010190615205565b5061522c9291506153d2565b5090565b604051806101e0016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000801916815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016152a16153e7565b81526020016152ae615405565b815260200160008152602001600081526020016000151581525090565b82600381019282156152205791602002820182811115615220578251825591602001919060010190615205565b8260038101928215615220579160200282015b82811115615220578251829068ffffffffffffffffff1690559160200191906001019061530b565b8260028101928215615220579160200282015b8281111561522057825182906001600160401b0316905591602001919060010190615346565b8260038101928215615220579160200282018281111561522057825182906001600160401b0316905591602001919060010190615346565b8260028101928215615220579160200282015b828111156152205782358255916020019190600101906153b7565b5b8082111561522c57600081556001016153d3565b60405180606001604052806003906020820280368337509192915050565b60405180606001604052806003905b61541c615432565b8152602001906001900390816154145790505090565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b038111828210171561548957615489615450565b60405290565b604051608081016001600160401b038111828210171561548957615489615450565b60405161014081016001600160401b038111828210171561548957615489615450565b6000604082840312156154e657600080fd5b82601f8301126154f557600080fd5b604051604081018181106001600160401b038211171561551757615517615450565b806040525080604084018581111561552e57600080fd5b845b81811015615548578035835260209283019201615530565b509195945050505050565b6001600160a01b038116811461181b57600080fd5b60006020828403121561557a57600080fd5b8135610d0081615553565b6000806040838503121561559857600080fd5b82356155a381615553565b946020939093013593505050565b60008083601f8401126155c357600080fd5b5081356001600160401b038111156155da57600080fd5b6020830191508360208260051b85010111156155f557600080fd5b9250929050565b6000806020838503121561560f57600080fd5b82356001600160401b0381111561562557600080fd5b615631858286016155b1565b90969095509350505050565b60006020828403121561564f57600080fd5b5035919050565b60008060006080848603121561566b57600080fd5b83359250606084018581111561568057600080fd5b60208501925080359150509250925092565b600080604083850312156156a557600080fd5b50508035926020909101359150565b8060005b6003811015611e6a5781518452602093840193909101906001016156b8565b806000805b600381101561572257825185835b60028110156157095782518252602092830192909101906001016156ea565b50505060409490940193602092909201916001016156dc565b5050505050565b8051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015161578560e08401826001600160a01b03169052565b50610100818101516001600160a01b0316908301526101208082015190830152610140808201516157b8828501826156b4565b50506101608101516101a06157cf818501836156d7565b610180830151610260850152820151610280840152506101c0015115156102a090910152565b6102c08101610e718284615729565b60006060828403121561581657600080fd5b82601f83011261582557600080fd5b604051606081018181106001600160401b038211171561584757615847615450565b60405280606084018581111561552e57600080fd5b60008060006040848603121561587157600080fd5b8335925060208401356001600160401b0381111561588e57600080fd5b61589a868287016155b1565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b818110156158ea576158d6838551615729565b928401926102c092909201916001016158c3565b50909695505050505050565b60008083601f84011261590857600080fd5b5081356001600160401b0381111561591f57600080fd5b6020830191508360208260061b85010111156155f557600080fd5b60008060008060008060006080888a03121561595557600080fd5b8735965060208801356001600160401b038082111561597357600080fd5b61597f8b838c016155b1565b909850965060408a013591508082111561599857600080fd5b6159a48b838c016158f6565b909650945060608a01359150808211156159bd57600080fd5b506159ca8a828b016155b1565b989b979a50959850939692959293505050565b6020808252825182820181905260009190848201906040850190845b818110156158ea578351835292840192918401916001016159f9565b600080600060608486031215615a2a57600080fd5b8335615a3581615553565b95602085013595506040909401359392505050565b60008060008060408587031215615a6057600080fd5b84356001600160401b0380821115615a7757600080fd5b615a83888389016155b1565b90965094506020870135915080821115615a9c57600080fd5b50615aa9878288016158f6565b95989497509550505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215615b1257600080fd5b8151610d0081615553565b80518015158114615b2d57600080fd5b919050565b80516001600160401b0381168114615b2d57600080fd5b60006101808284031215615b5c57600080fd5b615b64615466565b615b6d83615b1d565b81526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e0820152610100615bc3818501615b32565b90820152610120615bd5848201615b32565b90820152610140615be7848201615b32565b90820152610160615bf9848201615b32565b908201529392505050565b600060208284031215615c1657600080fd5b610d0082615b1d565b634e487b7160e01b600052601160045260246000fd5b6000600019821415615c4957615c49615c1f565b5060010190565b6000610ce08284031215615c6357600080fd5b615c6b61548f565b601f8481850112615c7b57600080fd5b615c836154b1565b80610c80860187811115615c9657600080fd5b865b81811015615cf9578885820112615caf5760008081fd5b615cb76154b1565b8061014083018b811115615ccb5760008081fd5b835b81811015615ce5578051845260209384019301615ccd565b505085525060209093019261014001615c98565b509084525160208401525050610ca08301516040820152615d1d610cc08401615b1d565b60608201529392505050565b60008219821115615d3c57615d3c615c1f565b500190565b6000816000190483118215151615615d5b57615d5b615c1f565b500290565b602080825260119082015270496e636f7272656374206c656e6774687360781b604082015260600190565b600082821015615d9d57615d9d615c1f565b500390565b6001600160a01b03958616815293909416602084015260408301919091526060820152608081019190915260a00190565b600082615df057634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052603160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6020808252601d908201527f4e6f74207374616b6564206f72206e6f7420796f757220627573746572000000604082015260600190565b6020808252601b908201527f596f752063616e277420706c6179207769746820612067686f73740000000000604082015260600190565b60008083128015600160ff1b850184121615615ee257615ee2615c1f565b6001600160ff1b0384018313811615615efd57615efd615c1f565b50500390565b600080821280156001600160ff1b0384900385131615615f2557615f25615c1f565b600160ff1b8390038412811615615f3e57615f3e615c1f565b50500190565b60006001600160ff1b03821415615c4957615c49615c1f56feb50a5330a1d22e4c86e141658e745abecd71401f198a58ce9385a2b74c615ef4a2646970667358221220d74863cbe4dff12e6406916949dc58742d10338ff7f51dea120ed21ecbffefa164736f6c634300080a0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.