Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 104,629 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Play With Deposi... | 139001194 | 19 days ago | IN | 0 ETH | 0.0000171 | ||||
Play With Deposi... | 139001190 | 19 days ago | IN | 0 ETH | 0.00002223 | ||||
Play With Deposi... | 139001187 | 19 days ago | IN | 0 ETH | 0.00002223 | ||||
Play With Deposi... | 139001182 | 19 days ago | IN | 0 ETH | 0.0000171 | ||||
Play With Deposi... | 139001178 | 19 days ago | IN | 0 ETH | 0.00002223 | ||||
Play With Deposi... | 139001175 | 19 days ago | IN | 0 ETH | 0.00001709 | ||||
Play With Deposi... | 139001171 | 19 days ago | IN | 0 ETH | 0.00001709 | ||||
Play With Deposi... | 139001167 | 19 days ago | IN | 0 ETH | 0.00002194 | ||||
Start Game | 139001158 | 19 days ago | IN | 0 ETH | 0.00002037 | ||||
Finalize Game | 139001125 | 19 days ago | IN | 0 ETH | 0.00005546 | ||||
Set Starting Pri... | 139000768 | 19 days ago | IN | 0 ETH | 0.0000421 | ||||
Play With Deposi... | 139000429 | 19 days ago | IN | 0 ETH | 0.0000171 | ||||
Play With Deposi... | 139000425 | 19 days ago | IN | 0 ETH | 0.0000171 | ||||
Play With Deposi... | 139000422 | 19 days ago | IN | 0 ETH | 0.00002223 | ||||
Play With Deposi... | 139000418 | 19 days ago | IN | 0 ETH | 0.0000171 | ||||
Play With Deposi... | 139000412 | 19 days ago | IN | 0 ETH | 0.00002222 | ||||
Play With Deposi... | 139000408 | 19 days ago | IN | 0 ETH | 0.0000171 | ||||
Play With Deposi... | 139000404 | 19 days ago | IN | 0 ETH | 0.00002223 | ||||
Play With Deposi... | 139000400 | 19 days ago | IN | 0 ETH | 0.00002195 | ||||
Start Game | 139000390 | 19 days ago | IN | 0 ETH | 0.00002037 | ||||
Finalize Game | 139000360 | 19 days ago | IN | 0 ETH | 0.00005291 | ||||
Set Starting Pri... | 139000001 | 19 days ago | IN | 0 ETH | 0.0000423 | ||||
Play With Deposi... | 138999660 | 19 days ago | IN | 0 ETH | 0.0000171 | ||||
Play With Deposi... | 138999657 | 19 days ago | IN | 0 ETH | 0.0000171 | ||||
Play With Deposi... | 138999653 | 19 days ago | IN | 0 ETH | 0.00001709 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Race
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.24; import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; import {ITreasury} from "./interfaces/ITreasury.sol"; import {IDataStreamsVerifier} from "./interfaces/IDataStreamsVerifier.sol"; contract Race is AccessControl { event NewAssetCap(uint256 newMinAssetAmount, uint256 newMaxAssetAmount); event NewMaxPlayersAmount(uint256 newMax); event NewFee(uint256 newFee); event NewTreasury(address newTreasury); event RaceCreated( uint256 startTime, uint32 stopPredictAt, uint32 endTime, uint8[] feedNumbers, bytes32 gameId, address token, uint256 minDepositAmount ); event RaceNewPlayer( address player, uint256 depositAmount, uint256 depositId, bytes32 gameId, uint8 feedNumberIndex, uint256 rakeback, address token ); event RaceStarted( int192[] startingPrices, uint32[] priceTimestamps, bytes32 gameId ); event RaceFinalized( int192[] finalPrice, int256[] priceDiffs, uint32[] priceTimestamps, uint8[] feedNumbers, uint256 wonFeedNumber, bytes32 gameId ); event RaceCancelled(bytes32 gameId); event RaceDraw(bytes32 gameId); struct GameInfo { uint256 startTime; uint256 endTime; uint256 stopPredictAt; uint256 depositId; } struct AssetData { address[] players; uint256[] depositIds; uint256 totalDeposits; uint256 totalRakeback; int192 startingPrice; } uint256 packedData; bytes32 public constant GAME_MASTER_ROLE = keccak256("GAME_MASTER_ROLE"); uint256 constant timeGap = 30 seconds; mapping(uint8 => mapping(address => uint256)) public depositAmounts; mapping(uint8 => AssetData) public assetData; bytes32 public currentGameId; uint8[] public assetFeedNumber; address public treasury; uint256 public minDepositAmount; uint256 public maxPlayers = 100; uint256 public fee = 1000; uint256 public minAssetAmount = 2; uint256 public maxAssetAmount = 5; constructor() { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); } /** * Creates race game * @param endTime when the game will end * @param stopPredictAt time when players can't enter the game * @param depositAmount amount to enter the game * @param token token for game deposits * @param feedNumbers token position in array of Chainlink DataStreams feed IDs */ function startGame( uint32 endTime, uint32 stopPredictAt, uint256 depositAmount, address token, uint8[] memory feedNumbers ) public onlyRole(GAME_MASTER_ROLE) { require( depositAmount >= ITreasury(treasury).minDepositAmount(token), "Wrong deposit amount" ); require( feedNumbers.length >= minAssetAmount && feedNumbers.length <= maxAssetAmount, "Wrong asset length" ); require(packedData == 0, "Finish previous game first"); require(stopPredictAt - block.timestamp >= timeGap, "Wrong stop time"); require( endTime - stopPredictAt >= timeGap, "Timeframe gap must be higher" ); for (uint i = 0; i < feedNumbers.length; i++) { require( IDataStreamsVerifier(ITreasury(treasury).upkeep()).assetId( feedNumbers[i] ) != bytes32(0), "Wrong feed number" ); } packedData = (block.timestamp | (uint256(stopPredictAt) << 32) | (uint256(endTime) << 64)); currentGameId = keccak256( abi.encodePacked( endTime, stopPredictAt, depositAmount, block.timestamp, address(this) ) ); assetFeedNumber = feedNumbers; ITreasury(treasury).setGameToken(currentGameId, token); minDepositAmount = depositAmount; emit RaceCreated( block.timestamp, stopPredictAt, endTime, feedNumbers, currentGameId, token, depositAmount ); } /** * Take a participation in coin race game and deposit funds * @param depositAmount amount to deposit * @param feedNumberIndex coind id of choise */ function play(uint256 depositAmount, uint8 feedNumberIndex) public { require(depositAmount >= minDepositAmount, "Wrong deposit amount"); require(feedNumberIndex < assetFeedNumber.length, "Wrong asset number"); uint8 assetNumber = assetFeedNumber[feedNumberIndex]; require( depositAmounts[assetNumber][msg.sender] == 0, "Already participating" ); //проверять ассет айди на валидный GameInfo memory game = decodeData(); require(game.depositId + 1 <= maxPlayers, "Max player amount reached"); require( game.stopPredictAt > block.timestamp, "Game is closed for new players" ); depositAmounts[assetNumber][msg.sender] = depositAmount; uint256 rakeback = ITreasury(treasury).depositAndLock( depositAmount, msg.sender, currentGameId, game.depositId ); assetData[assetNumber].totalDeposits += depositAmount; assetData[assetNumber].totalRakeback += rakeback; assetData[assetNumber].players.push(msg.sender); assetData[assetNumber].depositIds.push(game.depositId); emit RaceNewPlayer( msg.sender, depositAmount, game.depositId, currentGameId, assetNumber, rakeback, ITreasury(treasury).gameToken(currentGameId) ); packedData = (packedData & ~(uint256(0xFFFFFFFF) << 96)) | ((game.depositId + 1) << 96); } /** * Take a participation in coin race game and deposit funds * @param depositAmount amount to deposit * @param feedNumberIndex coind id of choise */ function playWithDeposit( uint256 depositAmount, uint8 feedNumberIndex ) public { require(depositAmount >= minDepositAmount, "Wrong deposit amount"); require(feedNumberIndex < assetFeedNumber.length, "Wrong asset number"); uint8 assetNumber = assetFeedNumber[feedNumberIndex]; require( depositAmounts[assetNumber][msg.sender] == 0, "Already participating" ); //проверять ассет айди на валидный GameInfo memory game = decodeData(); require(game.depositId + 1 <= maxPlayers, "Max player amount reached"); require( game.stopPredictAt > block.timestamp, "Game is closed for new players" ); depositAmounts[assetNumber][msg.sender] = depositAmount; uint256 rakeback = ITreasury(treasury).lock( depositAmount, msg.sender, game.depositId, currentGameId ); assetData[assetNumber].totalDeposits += depositAmount; assetData[assetNumber].totalRakeback += rakeback; assetData[assetNumber].players.push(msg.sender); assetData[assetNumber].depositIds.push(game.depositId); emit RaceNewPlayer( msg.sender, depositAmount, game.depositId, currentGameId, assetNumber, rakeback, ITreasury(treasury).gameToken(currentGameId) ); packedData = (packedData & ~(uint256(0xFFFFFFFF) << 96)) | ((game.depositId + 1) << 96); } /** * Take a participation in coin race game and deposit funds * @param depositAmount amount to deposit * @param feedNumberIndex coind id of choise */ function playWithPermit( uint256 depositAmount, uint8 feedNumberIndex, ITreasury.PermitData calldata permitData ) public { require(depositAmount >= minDepositAmount, "Wrong deposit amount"); require(feedNumberIndex < assetFeedNumber.length, "Wrong asset number"); uint8 assetNumber = assetFeedNumber[feedNumberIndex]; require( depositAmounts[assetNumber][msg.sender] == 0, "Already participating" ); GameInfo memory game = decodeData(); require(game.depositId + 1 <= maxPlayers, "Max player amount reached"); require( game.stopPredictAt > block.timestamp, "Game is closed for new players" ); depositAmounts[assetNumber][msg.sender] = depositAmount; uint256 rakeback = ITreasury(treasury).depositAndLockWithPermit( depositAmount, msg.sender, currentGameId, game.depositId, permitData.deadline, permitData.v, permitData.r, permitData.s ); assetData[assetNumber].totalDeposits += depositAmount; assetData[assetNumber].totalRakeback += rakeback; assetData[assetNumber].players.push(msg.sender); assetData[assetNumber].depositIds.push(game.depositId); emit RaceNewPlayer( msg.sender, depositAmount, game.depositId, currentGameId, assetNumber, rakeback, ITreasury(treasury).gameToken(currentGameId) ); packedData = (packedData & ~(uint256(0xFFFFFFFF) << 96)) | ((game.depositId + 1) << 96); } /** * Sets starting price wich will be used to compare with final prices * @param unverifiedReports an array of Chainlink DataStreams reports */ function setStartingPrice( bytes[] memory unverifiedReports ) public onlyRole(GAME_MASTER_ROLE) { GameInfo memory game = decodeData(); require(block.timestamp >= game.stopPredictAt, "Too early"); require(hasEnoughPlayers(), "Not enough players"); address upkeep = ITreasury(treasury).upkeep(); int192[] memory assetPrices = new int192[](unverifiedReports.length); require( unverifiedReports.length == assetFeedNumber.length, "Wrong reports length" ); uint32[] memory priceTimestamps = new uint32[]( unverifiedReports.length ); for (uint i; i < unverifiedReports.length; i++) { (int192 priceData, uint32 priceTimestamp) = IDataStreamsVerifier( upkeep ).verifyReportWithTimestamp( unverifiedReports[i], assetFeedNumber[i] ); require( priceTimestamp - game.stopPredictAt <= 10 seconds, "Old chainlink report" ); require( assetData[assetFeedNumber[i]].startingPrice == 0, "Starting price already set" ); assetData[assetFeedNumber[i]].startingPrice = priceData; assetPrices[i] = priceData; priceTimestamps[i] = priceTimestamp; } emit RaceStarted(assetPrices, priceTimestamps, currentGameId); } /** * Finalizes race game and distributes rewards to players * @param unverifiedReports Chainlink DataStreams report */ function finalizeGame( bytes[] memory unverifiedReports ) public onlyRole(GAME_MASTER_ROLE) { GameInfo memory game = decodeData(); require(packedData != 0, "Start the game first"); require(block.timestamp >= game.endTime, "Too early to finish"); if (!hasEnoughPlayers()) { closeGame(); return; } address upkeep = ITreasury(treasury).upkeep(); int256[] memory finalPricesDiff = new int256[]( unverifiedReports.length ); int192[] memory finalPrices = new int192[](unverifiedReports.length); uint32[] memory finalTimestamps = new uint32[]( unverifiedReports.length ); int256 topDiff = type(int256).min; uint256 topIndex = 0; require( unverifiedReports.length == assetFeedNumber.length, "Wrong reports length" ); for (uint i; i < unverifiedReports.length; i++) { (int192 priceData, uint32 priceTimestamp) = IDataStreamsVerifier( upkeep ).verifyReportWithTimestamp( unverifiedReports[i], assetFeedNumber[i] ); require( priceTimestamp - game.endTime <= 10 seconds, "Old chainlink report" ); finalTimestamps[i] = priceTimestamp; require( assetData[assetFeedNumber[i]].startingPrice != 0, "Starting price not set" ); finalPricesDiff[i] = ((priceData - assetData[assetFeedNumber[i]].startingPrice) * 10000) / assetData[assetFeedNumber[i]].startingPrice; if ( finalPricesDiff[i] > topDiff && assetData[assetFeedNumber[i]].players.length != 0 ) { topDiff = finalPricesDiff[i]; topIndex = i; } finalPrices[i] = priceData; } uint256 counter; for (uint i; i < unverifiedReports.length; i++) { if (finalPricesDiff[i] == topDiff) { if (assetData[assetFeedNumber[i]].players.length != 0) { counter++; } if (counter == 2) { emit RaceDraw(currentGameId); closeGame(); return; } } } uint256 totalLostDeposits; uint256 totalLostRakeback; for (uint i; i < assetFeedNumber.length; i++) { if (i != topIndex) { totalLostDeposits += assetData[assetFeedNumber[i]] .totalDeposits; totalLostRakeback += assetData[assetFeedNumber[i]] .totalRakeback; } } ITreasury(treasury).withdrawGameFee( totalLostDeposits, fee, currentGameId ); uint256 finalRate = ITreasury(treasury).calculateRate( assetData[assetFeedNumber[topIndex]].totalDeposits, totalLostRakeback, currentGameId ); for ( uint i; i < assetData[assetFeedNumber[topIndex]].players.length; i++ ) { ITreasury(treasury).universalDistribute( assetData[assetFeedNumber[topIndex]].players[i], depositAmounts[assetFeedNumber[topIndex]][ assetData[assetFeedNumber[topIndex]].players[i] ], currentGameId, assetData[assetFeedNumber[topIndex]].depositIds[i], finalRate ); } emit RaceFinalized( finalPrices, finalPricesDiff, finalTimestamps, assetFeedNumber, topIndex, currentGameId ); ITreasury(treasury).setGameFinished(currentGameId); for (uint i; i < assetFeedNumber.length; i++) { for ( uint k; k < assetData[assetFeedNumber[i]].players.length; k++ ) { delete depositAmounts[assetFeedNumber[i]][ assetData[assetFeedNumber[i]].players[k] ]; } delete assetData[assetFeedNumber[i]]; } packedData = 0; currentGameId = bytes32(0); delete assetFeedNumber; } /** * Closes game and refunds tokens */ function closeGame() public onlyRole(GAME_MASTER_ROLE) { require(currentGameId != bytes32(0), "Game not started"); for (uint i; i < assetFeedNumber.length; i++) { for ( uint k; k < assetData[assetFeedNumber[i]].players.length; k++ ) { ITreasury(treasury).refund( depositAmounts[assetFeedNumber[i]][ assetData[assetFeedNumber[i]].players[k] ], assetData[assetFeedNumber[i]].players[k], currentGameId, assetData[assetFeedNumber[i]].depositIds[k] ); delete depositAmounts[assetFeedNumber[i]][ assetData[assetFeedNumber[i]].players[k] ]; } delete assetData[assetFeedNumber[i]]; } emit RaceCancelled(currentGameId); packedData = 0; currentGameId = bytes32(0); delete assetFeedNumber; } /** * Returns decoded game data */ function decodeData() public view returns (GameInfo memory data) { data.startTime = uint256(uint32(packedData)); data.stopPredictAt = uint256(uint32(packedData >> 32)); data.endTime = uint256(uint32(packedData >> 64)); data.depositId = uint256(uint160(packedData >> 96)); } function getGameData() public view returns (GameInfo memory, bytes32, uint8[] memory, uint256[] memory) { uint256[] memory players = new uint256[](assetFeedNumber.length); for (uint i; i < assetFeedNumber.length; i++) { players[i] = assetData[assetFeedNumber[i]].players.length; } return (decodeData(), currentGameId, assetFeedNumber, players); } function hasEnoughPlayers() public view returns (bool) { uint256 playersSufficient; for (uint i; i < assetFeedNumber.length; i++) { if (assetData[assetFeedNumber[i]].players.length != 0) { playersSufficient += 1; } } return playersSufficient <= 1 ? false : true; } /** * Change maximum players number * @param newMax new maximum number */ function setMaxPlayers(uint256 newMax) public onlyRole(DEFAULT_ADMIN_ROLE) { maxPlayers = newMax; emit NewMaxPlayersAmount(newMax); } /** * Changes asset gap * @param newMinAssetAmount new minimal asset amount * @param newMaxAssetAmount new maximum asset amount */ function setAssetAmount( uint256 newMinAssetAmount, uint256 newMaxAssetAmount ) public onlyRole(DEFAULT_ADMIN_ROLE) { require(newMinAssetAmount <= newMaxAssetAmount, "Wrong new amounts"); minAssetAmount = newMinAssetAmount; maxAssetAmount = newMaxAssetAmount; emit NewAssetCap(newMinAssetAmount, newMaxAssetAmount); } /** * Change treasury address * @param newTreasury new treasury address */ function setTreasury( address newTreasury ) public onlyRole(DEFAULT_ADMIN_ROLE) { require(newTreasury != address(0), "Zero address"); treasury = newTreasury; emit NewTreasury(newTreasury); } /** * Change fee * @param newFee new fee in bp */ function setFee(uint256 newFee) public onlyRole(DEFAULT_ADMIN_ROLE) { require(newFee <= 3000, "Fee exceeds the cap"); fee = newFee; emit NewFee(newFee); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) pragma solidity ^0.8.20; import {IAccessControl} from "./IAccessControl.sol"; import {Context} from "../utils/Context.sol"; import {ERC165} from "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (access/IAccessControl.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC-165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @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[ERC 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 pragma solidity ^0.8.24; interface IDataStreamsVerifier { function lastRetrievedPrice() external view returns (int192); function getPrice() external view returns (int192); function verifyReportWithTimestamp( bytes memory unverifiedReport, uint8 feedNumber ) external returns (int192, uint32); function assetId(uint8 index) external view returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; interface ITreasury { struct PermitData { uint256 deadline; uint8 v; bytes32 r; bytes32 s; } function DISTRIBUTOR_ROLE() external view returns (bytes32); function grantRole(bytes32 role, address account) external; function gameToken(bytes32 gameId) external view returns (address); function lockedRakeback( bytes32 gameId, address player, uint256 depositId ) external returns (uint256); function depositAndLock( uint256 amount, address from, bytes32 gameId, uint256 depositId ) external returns (uint256); function depositAndLock( uint256 amount, address from, bytes32 gameId, bool isRakeback ) external returns (uint256 rakeback); function depositAndLockWithPermit( uint256 amount, address from, bytes32 gameId, uint256 depositId, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 rakeback); function depositAndLockWithPermit( uint256 amount, address from, bytes32 gameId, bool isRakeback, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 rakeback); function lock( uint256 amount, address from, uint256 depositId, bytes32 gameId ) external returns (uint256 rakeback); function lock( uint256 amount, address from, bytes32 gameId, bool isRakeback ) external returns (uint256 rakeback); function upkeep() external view returns (address); function bullseyeResetLockedAmount(bytes32 gameId) external; function distributeBullseye( uint256 rate, uint256 lostTeamRakeback, address to, bytes32 gameId, uint256 depositId ) external; function approvedTokens(address token) external returns (bool); function refund(uint256 amount, address to, bytes32 gameId) external; function refund( uint256 amount, address to, bytes32 gameId, uint256 depositId ) external; function refundWithFees( uint256 amount, address to, uint256 refundFee, bytes32 gameId ) external; function refundWithFees( uint256 amount, address to, uint256 refundFee, bytes32 gameId, uint256 depositId ) external; function universalDistribute( address to, uint256 initialDeposit, bytes32 gameId, uint256 rate ) external; function universalDistribute( address to, uint256 initialDeposit, bytes32 gameId, uint256 depositId, uint256 rate ) external; function withdrawGameFee( uint256 lostTeamDeposits, uint256 gameFee, bytes32 gameId ) external returns (uint256 withdrawnFees); function calculateRate( uint256 wonTeamTotal, uint256 lostTeamRakeback, bytes32 gameId ) external returns (uint256); function withdrawInitiatorFee( uint256 lostTeamDeposits, uint256 wonTeamDeposits, uint256 initiatorFee, address initiator, bytes32 gameId ) external returns (uint256 withdrawnFees); function calculateRakebackAmount( address target, uint256 initialDeposit ) external; function setGameFinished(bytes32 gameId) external; function withdrawRakebackSetup(bytes32 gameId, address target) external; function setGameToken(bytes32 gameId, address token) external; function minDepositAmount(address token) external returns (uint256 amount); }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinAssetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxAssetAmount","type":"uint256"}],"name":"NewAssetCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"NewFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"NewMaxPlayersAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newTreasury","type":"address"}],"name":"NewTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"gameId","type":"bytes32"}],"name":"RaceCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"stopPredictAt","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"endTime","type":"uint32"},{"indexed":false,"internalType":"uint8[]","name":"feedNumbers","type":"uint8[]"},{"indexed":false,"internalType":"bytes32","name":"gameId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"minDepositAmount","type":"uint256"}],"name":"RaceCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"gameId","type":"bytes32"}],"name":"RaceDraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int192[]","name":"finalPrice","type":"int192[]"},{"indexed":false,"internalType":"int256[]","name":"priceDiffs","type":"int256[]"},{"indexed":false,"internalType":"uint32[]","name":"priceTimestamps","type":"uint32[]"},{"indexed":false,"internalType":"uint8[]","name":"feedNumbers","type":"uint8[]"},{"indexed":false,"internalType":"uint256","name":"wonFeedNumber","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"gameId","type":"bytes32"}],"name":"RaceFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"gameId","type":"bytes32"},{"indexed":false,"internalType":"uint8","name":"feedNumberIndex","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"rakeback","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"RaceNewPlayer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int192[]","name":"startingPrices","type":"int192[]"},{"indexed":false,"internalType":"uint32[]","name":"priceTimestamps","type":"uint32[]"},{"indexed":false,"internalType":"bytes32","name":"gameId","type":"bytes32"}],"name":"RaceStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GAME_MASTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"assetData","outputs":[{"internalType":"uint256","name":"totalDeposits","type":"uint256"},{"internalType":"uint256","name":"totalRakeback","type":"uint256"},{"internalType":"int192","name":"startingPrice","type":"int192"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"assetFeedNumber","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentGameId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decodeData","outputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"stopPredictAt","type":"uint256"},{"internalType":"uint256","name":"depositId","type":"uint256"}],"internalType":"struct Race.GameInfo","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"depositAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"unverifiedReports","type":"bytes[]"}],"name":"finalizeGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getGameData","outputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"stopPredictAt","type":"uint256"},{"internalType":"uint256","name":"depositId","type":"uint256"}],"internalType":"struct Race.GameInfo","name":"","type":"tuple"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint8[]","name":"","type":"uint8[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasEnoughPlayers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAssetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPlayers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAssetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDepositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint8","name":"feedNumberIndex","type":"uint8"}],"name":"play","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint8","name":"feedNumberIndex","type":"uint8"}],"name":"playWithDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint8","name":"feedNumberIndex","type":"uint8"},{"components":[{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ITreasury.PermitData","name":"permitData","type":"tuple"}],"name":"playWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinAssetAmount","type":"uint256"},{"internalType":"uint256","name":"newMaxAssetAmount","type":"uint256"}],"name":"setAssetAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxPlayers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"unverifiedReports","type":"bytes[]"}],"name":"setStartingPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"endTime","type":"uint32"},{"internalType":"uint32","name":"stopPredictAt","type":"uint32"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint8[]","name":"feedNumbers","type":"uint8[]"}],"name":"startGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260646008556103e86009556002600a556005600b553480156200002657600080fd5b50620000346000336200003b565b50620000ea565b6000828152602081815260408083206001600160a01b038516845290915281205460ff16620000e0576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055620000973390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001620000e4565b5060005b92915050565b6140c580620000fa6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806387b9f1a21161010f578063af4e99de116100a2578063ddca3f4311610071578063ddca3f431461047f578063ef8c523614610488578063f0f4426014610491578063f87dbc2d146104a457600080fd5b8063af4e99de1461042c578063ca09efb514610444578063ce07b07514610457578063d547741f1461046c57600080fd5b8063a79325ad116100de578063a79325ad146103c6578063a8b62a3a146103f1578063aac99ae614610404578063ad1def1e1461041757600080fd5b806387b9f1a21461037e57806391d14854146103a3578063a217fddf146103b6578063a6fc7abb146103be57600080fd5b8063536a3ddc1161018757806361d027b31161015657806361d027b31461032f578063645006ca1461035a57806369fe0e2d14610363578063786b844b1461037657600080fd5b8063536a3ddc146102f7578063578f0563146103005780635cd7692e14610309578063609a88131461031c57600080fd5b806336568abe116101c357806336568abe1461027657806340a1b635146102895780634c2412a2146102db578063520936b1146102e457600080fd5b806301ffc9a7146101f5578063248a9ca31461021d578063288dee3b1461024e5780632f2ff15d14610263575b600080fd5b610208610203366004613106565b6104b7565b60405190151581526020015b60405180910390f35b61024061022b366004613137565b60009081526020819052604090206001015490565b604051908152602001610214565b61026161025c366004613137565b6104ee565b005b610261610271366004613165565b610536565b610261610284366004613165565b610561565b6102bd6102973660046131ab565b600360208190526000918252604090912060028101549181015460049091015460170b83565b60408051938452602084019290925260170b90820152606001610214565b61024060085481565b6102616102f23660046131c6565b610599565b61024060045481565b610240600a5481565b6102616103173660046131c6565b6108f9565b61026161032a36600461325d565b610a7a565b600654610342906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b61024060075481565b610261610371366004613137565b611884565b61026161190c565b61039161038c366004613137565b611da5565b60405160ff9091168152602001610214565b6102086103b1366004613165565b611dd9565b610240600081565b610208611e02565b6102406103d436600461336a565b600260209081526000928352604080842090915290825290205481565b6102616103ff366004613396565b611e8a565b6102616104123660046133de565b61222f565b61024060008051602061407083398151915281565b6104346122c6565b604051610214949392919061343f565b6102616104523660046134d4565b612447565b61045f6128f9565b60405161021491906135b0565b61026161047a366004613165565b612957565b61024060095481565b610240600b5481565b61026161049f3660046135db565b61297c565b6102616104b236600461325d565b612a1a565b60006001600160e01b03198216637965db0b60e01b14806104e857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006104f981612ec8565b60088290556040518281527f6c31254b0e0eb7c0dc776ffcdc449905584ed6806f9504cb4fdb3dc1578e613a906020015b60405180910390a15050565b60008281526020819052604090206001015461055181612ec8565b61055b8383612ed2565b50505050565b6001600160a01b038116331461058a5760405163334bd91960e11b815260040160405180910390fd5b6105948282612f64565b505050565b6007548210156105c45760405162461bcd60e51b81526004016105bb906135f8565b60405180910390fd5b60055460ff8216106105e85760405162461bcd60e51b81526004016105bb90613626565b600060058260ff168154811061060057610600613652565b600091825260208083208183040154601f9092166101000a90910460ff16808352600282526040808420338552909252912054909150156106535760405162461bcd60e51b81526004016105bb90613668565b600061065d6128f9565b90506008548160600151600161067391906136ad565b11156106915760405162461bcd60e51b81526004016105bb906136c0565b428160400151116106b45760405162461bcd60e51b81526004016105bb906136f7565b60ff8216600090815260026020908152604080832033808552925280832087905560065460608501516004805493516317acb94360e11b81529081018a90526024810194909452604484015260648301919091526001600160a01b031690632f597286906084015b6020604051808303816000875af115801561073b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075f919061372e565b60ff84166000908152600360205260408120600201805492935087929091906107899084906136ad565b909155505060ff8316600090815260036020819052604082200180548392906107b39084906136ad565b909155505060ff8316600081815260036020908152604080832080546001818101835582865284862090910180546001600160a01b0319163390811790915595855260608801805192820180549283018155865293909420909301929092555160048054600654935163888f7a7560e01b81527f6b7ebc4753f1ddf06ee210cdef87de81c4ccd066c672f525505068635418db7a95948b94938a9289926001600160a01b03169163888f7a75916108709187910190815260200190565b602060405180830381865afa15801561088d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b19190613747565b6040516108c49796959493929190613764565b60405180910390a16060828101516108dd9060016136ad565b6001805463ffffffff60601b19169190921b1790555050505050565b60075482101561091b5760405162461bcd60e51b81526004016105bb906135f8565b60055460ff82161061093f5760405162461bcd60e51b81526004016105bb90613626565b600060058260ff168154811061095757610957613652565b600091825260208083208183040154601f9092166101000a90910460ff16808352600282526040808420338552909252912054909150156109aa5760405162461bcd60e51b81526004016105bb90613668565b60006109b46128f9565b9050600854816060015160016109ca91906136ad565b11156109e85760405162461bcd60e51b81526004016105bb906136c0565b42816040015111610a0b5760405162461bcd60e51b81526004016105bb906136f7565b60ff821660009081526002602090815260408083203380855292528083208790556006546004805460608701519351633a6f4ebd60e21b81529182018a90526024820194909452604481019390935260648301919091526001600160a01b03169063e9bd3af49060840161071c565b600080516020614070833981519152610a9281612ec8565b6000610a9c6128f9565b9050600154600003610ae75760405162461bcd60e51b815260206004820152601460248201527314dd185c9d081d1a194819d85b5948199a5c9cdd60621b60448201526064016105bb565b8060200151421015610b315760405162461bcd60e51b81526020600482015260136024820152720a8dede40cac2e4d8f240e8de40ccd2dcd2e6d606b1b60448201526064016105bb565b610b39611e02565b610b455761059461190c565b6006546040805163167a382560e11b815290516000926001600160a01b031691632cf4704a9160048083019260209291908290030181865afa158015610b8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb39190613747565b90506000845167ffffffffffffffff811115610bd157610bd16131f2565b604051908082528060200260200182016040528015610bfa578160200160208202803683370190505b5090506000855167ffffffffffffffff811115610c1957610c196131f2565b604051908082528060200260200182016040528015610c42578160200160208202803683370190505b5090506000865167ffffffffffffffff811115610c6157610c616131f2565b604051908082528060200260200182016040528015610c8a578160200160208202803683370190505b506005548851919250600160ff1b9160009114610ce05760405162461bcd60e51b81526020600482015260146024820152730aee4dedcce40e4cae0dee4e8e640d8cadccee8d60631b60448201526064016105bb565b60005b895181101561106057600080886001600160a01b031663d369dc618d8581518110610d1057610d10613652565b602002602001015160058681548110610d2b57610d2b613652565b90600052602060002090602091828204019190069054906101000a900460ff166040518363ffffffff1660e01b8152600401610d689291906137a4565b60408051808303816000875af1158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa91906137fc565b91509150600a8a602001518263ffffffff16610dc69190613831565b1115610e0b5760405162461bcd60e51b815260206004820152601460248201527313db190818da185a5b9b1a5b9ac81c995c1bdc9d60621b60448201526064016105bb565b80868481518110610e1e57610e1e613652565b602002602001019063ffffffff16908163ffffffff16815250506003600060058581548110610e4f57610e4f613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400181206004015460170b9003610ec85760405162461bcd60e51b815260206004820152601660248201527514dd185c9d1a5b99c81c1c9a58d9481b9bdd081cd95d60521b60448201526064016105bb565b6003600060058581548110610edf57610edf613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040018120600401546005805460179290920b9260039290919087908110610f2f57610f2f613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902060040154610f6b9060170b84613844565b610f7790612710613871565b610f81919061389f565b60170b888481518110610f9657610f96613652565b60200260200101818152505084888481518110610fb557610fb5613652565b602002602001015113801561100b57506003600060058581548110610fdc57610fdc613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190205415155b156110305787838151811061102257611022613652565b602002602001015194508293505b8187848151811061104357611043613652565b60179290920b602092830291909101909101525050600101610ce3565b506000805b8a51811015611144578387828151811061108157611081613652565b60200260200101510361113c5760036000600583815481106110a5576110a5613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902054156110e457816110e0816138eb565b9250505b8160020361113c577ffcc86dce1b30e3fc1afe5b35c776e9095231ddd3b664213f7f1d0c83101c714360045460405161111f91815260200190565b60405180910390a161112f61190c565b5050505050505050505050565b600101611065565b5060008060005b6005548110156112095784811461120157600360006005838154811061117357611173613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020600201546111ac90846136ad565b925060036000600583815481106111c5576111c5613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020600301546111fe90836136ad565b91505b60010161114b565b5060065460095460048054604051637b85343760e11b8152918201869052602482019290925260448101919091526001600160a01b039091169063f70a686e906064016020604051808303816000875af115801561126b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128f919061372e565b50600654600580546000926001600160a01b03169163a2b173dc9160039185918a9081106112bf576112bf613652565b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff16815260200190815260200160002060020154846004546040518463ffffffff1660e01b815260040161132a939291909283526020830191909152604082015260600190565b6020604051808303816000875af1158015611349573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136d919061372e565b905060005b600360006005888154811061138957611389613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190205481101561160b57600654600580546001600160a01b039092169163eb934f7191600391600091908b9081106113ec576113ec613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902080548490811061142957611429613652565b9060005260206000200160009054906101000a90046001600160a01b03166002600060058b8154811061145e5761145e613652565b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff16815260200190815260200160002060006003600060058d815481106114ab576114ab613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190208054879081106114e8576114e8613652565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020546004546003600060058d8154811061154157611541613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902060010180548790811061158157611581613652565b6000918252602090912001546040516001600160e01b031960e087901b1681526001600160a01b0390941660048501526024840192909252604483015260648201526084810185905260a401600060405180830381600087803b1580156115e757600080fd5b505af11580156115fb573d6000803e3d6000fd5b5050600190920191506113729050565b507f319bdd306c29ee5c352c0a85c5556133166bc22f9760cbf2a457cc21256bd798888a896005896004546040516116489695949392919061396f565b60405180910390a160065460048054604051634f0644ef60e01b8152918201526001600160a01b0390911690634f0644ef90602401600060405180830381600087803b15801561169757600080fd5b505af11580156116ab573d6000803e3d6000fd5b5050505060005b60055481101561185b5760005b60036000600584815481106116d6576116d6613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020548110156117d757600260006005848154811061172057611720613652565b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff1681526020019081526020016000206000600360006005868154811061176d5761176d613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190208054849081106117aa576117aa613652565b60009182526020808320909101546001600160a01b031683528201929092526040018120556001016116bf565b5060036000600583815481106117ef576117ef613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040018120906118258282613008565b611833600183016000613008565b50600060028201819055600382015560040180546001600160c01b03191690556001016116b2565b5060006001819055600481905561187490600590613026565b50505050505050505050505b5050565b600061188f81612ec8565b610bb88211156118d75760405162461bcd60e51b815260206004820152601360248201527204665652065786365656473207468652063617606c1b60448201526064016105bb565b60098290556040518281527f63fe946ed58429ac3c5e64d4356ff92c26d7fa1e73586515df8ba9f059ab54a59060200161052a565b60008051602061407083398151915261192481612ec8565b6004546119665760405162461bcd60e51b815260206004820152601060248201526f11d85b59481b9bdd081cdd185c9d195960821b60448201526064016105bb565b60005b600554811015611d4e5760005b600360006005848154811061198d5761198d613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902054811015611cca57600654600580546001600160a01b039092169163fb4789d69160029160009190879081106119f0576119f0613652565b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff16815260200190815260200160002060006003600060058881548110611a3d57611a3d613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020805486908110611a7a57611a7a613652565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020546003600060058781548110611ad057611ad0613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020805485908110611b0d57611b0d613652565b9060005260206000200160009054906101000a90046001600160a01b03166004546003600060058981548110611b4557611b45613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020600101805487908110611b8557611b85613652565b6000918252602090912001546040516001600160e01b031960e087901b16815260048101949094526001600160a01b03909216602484015260448301526064820152608401600060405180830381600087803b158015611be457600080fd5b505af1158015611bf8573d6000803e3d6000fd5b505050506002600060058481548110611c1357611c13613652565b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff16815260200190815260200160002060006003600060058681548110611c6057611c60613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020805484908110611c9d57611c9d613652565b60009182526020808320909101546001600160a01b03168352820192909252604001812055600101611976565b506003600060058381548110611ce257611ce2613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001812090611d188282613008565b611d26600183016000613008565b50600060028201819055600382015560040180546001600160c01b0319169055600101611969565b507f3f3669b11af9b00fb2a95f8ded36a79a2e1d5374efbc5ec6b2b5b96ceaf9ac6a600454604051611d8291815260200190565b60405180910390a1600060018190556004819055611da290600590613026565b50565b60058181548110611db557600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008060005b600554811015611e70576003600060058381548110611e2957611e29613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190205415611e6857611e656001836136ad565b91505b600101611e08565b506001811115611e81576001611e84565b60005b91505090565b600754831015611eac5760405162461bcd60e51b81526004016105bb906135f8565b60055460ff831610611ed05760405162461bcd60e51b81526004016105bb90613626565b600060058360ff1681548110611ee857611ee8613652565b600091825260208083208183040154601f9092166101000a90910460ff1680835260028252604080842033855290925291205490915015611f3b5760405162461bcd60e51b81526004016105bb90613668565b6000611f456128f9565b905060085481606001516001611f5b91906136ad565b1115611f795760405162461bcd60e51b81526004016105bb906136c0565b42816040015111611f9c5760405162461bcd60e51b81526004016105bb906136f7565b60ff821660009081526002602090815260408083203380855290835281842089905560065460045460608701516001600160a01b0390921694634efb8649948c9493918b3591611ff191908d01908d016131ab565b604080516001600160e01b031960e08a901b16815260048101979097526001600160a01b03909516602487015260448601939093526064850191909152608484015260ff1660a483015287013560c4820152606087013560e4820152610104016020604051808303816000875af1158015612070573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612094919061372e565b60ff84166000908152600360205260408120600201805492935088929091906120be9084906136ad565b909155505060ff8316600090815260036020819052604082200180548392906120e89084906136ad565b909155505060ff8316600081815260036020908152604080832080546001818101835582865284862090910180546001600160a01b0319163390811790915595855260608801805192820180549283018155865293909420909301929092555160048054600654935163888f7a7560e01b81527f6b7ebc4753f1ddf06ee210cdef87de81c4ccd066c672f525505068635418db7a95948c94938a9289926001600160a01b03169163888f7a75916121a59187910190815260200190565b602060405180830381865afa1580156121c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e69190613747565b6040516121f99796959493929190613764565b60405180910390a16060828101516122129060016136ad565b6001805463ffffffff60601b19169190921b179055505050505050565b600061223a81612ec8565b8183111561227e5760405162461bcd60e51b815260206004820152601160248201527057726f6e67206e657720616d6f756e747360781b60448201526064016105bb565b600a839055600b82905560408051848152602081018490527f243a9df63d9ea74b55da88adcd8fc523bf6a8443f524a3295d07219b69e1ca9a910160405180910390a1505050565b6122f16040518060800160405280600081526020016000815260200160008152602001600081525090565b6000606080600060058054905067ffffffffffffffff811115612316576123166131f2565b60405190808252806020026020018201604052801561233f578160200160208202803683370190505b50905060005b6005548110156123b957600360006005838154811061236657612366613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190205482518390839081106123a6576123a6613652565b6020908102919091010152600101612345565b506123c26128f9565b6004546005838180548060200260200160405190810160405280929190818152602001828054801561243157602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116124025790505b5050505050915094509450945094505090919293565b60008051602061407083398151915261245f81612ec8565b60065460405163722ec76f60e01b81526001600160a01b0385811660048301529091169063722ec76f906024016020604051808303816000875af11580156124ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cf919061372e565b8410156124ee5760405162461bcd60e51b81526004016105bb906135f8565b600a548251101580156125045750600b54825111155b6125455760405162461bcd60e51b81526020600482015260126024820152710aee4dedcce40c2e6e6cae840d8cadccee8d60731b60448201526064016105bb565b600154156125955760405162461bcd60e51b815260206004820152601a60248201527f46696e6973682070726576696f75732067616d6520666972737400000000000060448201526064016105bb565b601e6125a74263ffffffff8816613831565b10156125e75760405162461bcd60e51b815260206004820152600f60248201526e57726f6e672073746f702074696d6560881b60448201526064016105bb565b601e6125f38688613fbe565b63ffffffff1610156126475760405162461bcd60e51b815260206004820152601c60248201527f54696d656672616d6520676170206d757374206265206869676865720000000060448201526064016105bb565b60005b8251811015612798576006546040805163167a382560e11b815290516000926001600160a01b031691632cf4704a9160048083019260209291908290030181865afa15801561269d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c19190613747565b6001600160a01b031663ae82b5c98584815181106126e1576126e1613652565b60200260200101516040518263ffffffff1660e01b815260040161270e919060ff91909116815260200190565b602060405180830381865afa15801561272b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274f919061372e565b036127905760405162461bcd60e51b81526020600482015260116024820152702bb937b733903332b2b210373ab6b132b960791b60448201526064016105bb565b60010161264a565b50604086811b6bffffffff000000000000000016602087811b67ffffffff00000000164290811792909217600155915160e089811b6001600160e01b03199081169483019490945288901b90921660248301526028820186905260488201523060601b6bffffffffffffffffffffffff19166068820152607c0160408051601f198184030181529190528051602091820120600455825161283f916005919085019061304b565b506006546004805460405163039279d760e61b8152918201526001600160a01b0385811660248301529091169063e49e75c090604401600060405180830381600087803b15801561288f57600080fd5b505af11580156128a3573d6000803e3d6000fd5b5050506007859055506004546040517f0551302fbd9463e6b52652e611db38321a859aca2fb835de2c7f9ce91c218522916128e991429189918b9188918a908c90613fe2565b60405180910390a1505050505050565b6129246040518060800160405280600081526020016000815260200160008152602001600081525090565b60015463ffffffff8082168352602082811c821660408086019190915283901c90911690830152606090811c9082015290565b60008281526020819052604090206001015461297281612ec8565b61055b8383612f64565b600061298781612ec8565b6001600160a01b0382166129cc5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064016105bb565b600680546001600160a01b0319166001600160a01b0384169081179091556040519081527fafa147634b29e2c7bd53ce194256b9f41cfb9ba3036f2b822fdd1d965beea0869060200161052a565b600080516020614070833981519152612a3281612ec8565b6000612a3c6128f9565b90508060400151421015612a7e5760405162461bcd60e51b8152602060048201526009602482015268546f6f206561726c7960b81b60448201526064016105bb565b612a86611e02565b612ac75760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820706c617965727360701b60448201526064016105bb565b6006546040805163167a382560e11b815290516000926001600160a01b031691632cf4704a9160048083019260209291908290030181865afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190613747565b90506000845167ffffffffffffffff811115612b5357612b536131f2565b604051908082528060200260200182016040528015612b7c578160200160208202803683370190505b50600554865191925014612bc95760405162461bcd60e51b81526020600482015260146024820152730aee4dedcce40e4cae0dee4e8e640d8cadccee8d60631b60448201526064016105bb565b6000855167ffffffffffffffff811115612be557612be56131f2565b604051908082528060200260200182016040528015612c0e578160200160208202803683370190505b50905060005b8651811015612e9257600080856001600160a01b031663d369dc618a8581518110612c4157612c41613652565b602002602001015160058681548110612c5c57612c5c613652565b90600052602060002090602091828204019190069054906101000a900460ff166040518363ffffffff1660e01b8152600401612c999291906137a4565b60408051808303816000875af1158015612cb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cdb91906137fc565b91509150600a87604001518263ffffffff16612cf79190613831565b1115612d3c5760405162461bcd60e51b815260206004820152601460248201527313db190818da185a5b9b1a5b9ac81c995c1bdc9d60621b60448201526064016105bb565b6003600060058581548110612d5357612d53613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190206004015460170b15612dd25760405162461bcd60e51b815260206004820152601a60248201527f5374617274696e6720707269636520616c72656164792073657400000000000060448201526064016105bb565b816003600060058681548110612dea57612dea613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902060040180546001600160c01b0319166001600160c01b039290921691909117905584518290869085908110612e4c57612e4c613652565b602002602001019060170b908160170b8152505080848481518110612e7357612e73613652565b63ffffffff909216602092830291909101909101525050600101612c14565b507fcf8aa1c5af7a9205f2116cfd8827ed91ac4a32da9752b24c4af091d85b92324782826004546040516128e993929190614039565b611da28133612fcf565b6000612ede8383611dd9565b612f5c576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055612f143390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016104e8565b5060006104e8565b6000612f708383611dd9565b15612f5c576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016104e8565b612fd98282611dd9565b6118805760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016105bb565b5080546000825590600052602060002090810190611da291906130f1565b50805460008255601f016020900490600052602060002090810190611da291906130f1565b82805482825590600052602060002090601f016020900481019282156130e15791602002820160005b838211156130b257835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302613074565b80156130df5782816101000a81549060ff02191690556001016020816000010492830192600103026130b2565b505b506130ed9291506130f1565b5090565b5b808211156130ed57600081556001016130f2565b60006020828403121561311857600080fd5b81356001600160e01b03198116811461313057600080fd5b9392505050565b60006020828403121561314957600080fd5b5035919050565b6001600160a01b0381168114611da257600080fd5b6000806040838503121561317857600080fd5b82359150602083013561318a81613150565b809150509250929050565b803560ff811681146131a657600080fd5b919050565b6000602082840312156131bd57600080fd5b61313082613195565b600080604083850312156131d957600080fd5b823591506131e960208401613195565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613231576132316131f2565b604052919050565b600067ffffffffffffffff821115613253576132536131f2565b5060051b60200190565b6000602080838503121561327057600080fd5b823567ffffffffffffffff8082111561328857600080fd5b8185019150601f86601f84011261329e57600080fd5b82356132b16132ac82613239565b613208565b81815260059190911b840185019085810190898311156132d057600080fd5b8686015b8381101561335c578035868111156132ec5760008081fd5b8701603f81018c136132fe5760008081fd5b88810135604088821115613314576133146131f2565b613325828901601f19168c01613208565b8281528e8284860101111561333a5760008081fd5b828285018d83013760009281018c0192909252508452509187019187016132d4565b509998505050505050505050565b6000806040838503121561337d57600080fd5b61338683613195565b9150602083013561318a81613150565b600080600083850360c08112156133ac57600080fd5b843593506133bc60208601613195565b92506080603f19820112156133d057600080fd5b506040840190509250925092565b600080604083850312156133f157600080fd5b50508035926020909101359150565b60008151808452602080850194506020840160005b8381101561343457815160ff1687529582019590820190600101613415565b509495945050505050565b8451815260208086015190820152604080860151908201526060808601519082015283608082015260e060a0820152600061347d60e0830185613400565b82810360c084015283518082526020808601928101919060005b828110156134b357845184529381019392810192600101613497565b50919998505050505050505050565b63ffffffff81168114611da257600080fd5b600080600080600060a086880312156134ec57600080fd5b85356134f7816134c2565b9450602086810135613508816134c2565b945060408701359350606087013561351f81613150565b9250608087013567ffffffffffffffff81111561353b57600080fd5b8701601f8101891361354c57600080fd5b803561355a6132ac82613239565b81815260059190911b8201830190838101908b83111561357957600080fd5b928401925b8284101561359e5761358f84613195565b8252928401929084019061357e565b80955050505050509295509295909350565b81518152602080830151908201526040808301519082015260608083015190820152608081016104e8565b6000602082840312156135ed57600080fd5b813561313081613150565b60208082526014908201527315dc9bdb99c819195c1bdcda5d08185b5bdd5b9d60621b604082015260600190565b6020808252601290820152712bb937b7339030b9b9b2ba10373ab6b132b960711b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260159082015274416c72656164792070617274696369706174696e6760581b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156104e8576104e8613697565b60208082526019908201527f4d617820706c6179657220616d6f756e74207265616368656400000000000000604082015260600190565b6020808252601e908201527f47616d6520697320636c6f73656420666f72206e657720706c61796572730000604082015260600190565b60006020828403121561374057600080fd5b5051919050565b60006020828403121561375957600080fd5b815161313081613150565b6001600160a01b03978816815260208101969096526040860194909452606085019290925260ff16608084015260a083015290911660c082015260e00190565b604081526000835180604084015260005b818110156137d257602081870181015160608684010152016137b5565b506000606082850101526060601f19601f83011684010191505060ff831660208301529392505050565b6000806040838503121561380f57600080fd5b82518060170b811461382057600080fd5b602084015190925061318a816134c2565b818103818111156104e8576104e8613697565b601782810b9082900b036001600160bf1b031981126001600160bf1b03821317156104e8576104e8613697565b60008160170b8360170b80820260170b9250818305811482151761389757613897613697565b505092915050565b60008160170b8360170b806138c457634e487b7160e01b600052601260045260246000fd5b6001600160bf1b03198214600019821416156138e2576138e2613697565b90059392505050565b6000600182016138fd576138fd613697565b5060010190565b60008151808452602080850194506020840160005b8381101561343457815160170b87529582019590820190600101613919565b60008151808452602080850194506020840160005b8381101561343457815163ffffffff168752958201959082019060010161394d565b60c08152600061398260c0830189613904565b82810360208481019190915288518083528982019282019060005b818110156139b95784518352938301939183019160010161399d565b50506040925084810360408601526139d1818a613938565b9050606085820360608701528189546139ee818590815260200190565b60008c81526020812095509092505b81601f82011015613c6657845460ff8082168552600882901c811688860152601082901c811689860152601882901c8116868601526080613a4681870183858c1c1660ff169052565b60a0613a5b818801848660281c1660ff169052565b613a6f60c08801848660301c1660ff169052565b60e0613a84818901858760381c1660ff169052565b60ff858d1c851616610100890152613aa76101208901858760481c1660ff169052565b613abc6101408901858760501c1660ff169052565b613ad16101608901858760581c1660ff169052565b60ff858a1c851616610180890152613af46101a08901858760681c1660ff169052565b613b096101c08901858760701c1660ff169052565b613b1e6101e08901858760781c1660ff169052565b60ff85841c851616610200890152613b416102208901858760881c1660ff169052565b613b566102408901858760901c1660ff169052565b613b6b6102608901858760981c1660ff169052565b60ff85831c851616610280890152613b8e6102a08901858760a81c1660ff169052565b613ba36102c08901858760b01c1660ff169052565b613bb86102e08901858760b81c1660ff169052565b613bcd6103008901858760c01c1660ff169052565b613be26103208901858760c81c1660ff169052565b613bf76103408901858760d01c1660ff169052565b613c0c6103608901858760d81c1660ff169052565b60ff85821c851616610380890152505050613c326103a08601828460e81c1660ff169052565b613c476103c08601828460f01c1660ff169052565b5060f81c6103e0840152600194909401936104009092019185016139fd565b8454965081811015613c805760ff87168352918501916001015b81811015613c9a57600887901c60ff168352918501916001015b81811015613cb457601087901c60ff168352918501916001015b81811015613cce57601887901c60ff168352918501916001015b81811015613ce65786861c60ff168352918501916001015b81811015613d0057602887901c60ff168352918501916001015b81811015613d1a57603087901c60ff168352918501916001015b81811015613d3457603887901c60ff168352918501916001015b81811015613d4e57604087901c60ff168352918501916001015b81811015613d6857604887901c60ff168352918501916001015b81811015613d8257605087901c60ff168352918501916001015b81811015613d9c57605887901c60ff168352918501916001015b81811015613db657606087901c60ff168352918501916001015b81811015613dd057606887901c60ff168352918501916001015b81811015613dea57607087901c60ff168352918501916001015b81811015613e0457607887901c60ff168352918501916001015b81811015613e1e57608087901c60ff168352918501916001015b81811015613e3857608887901c60ff168352918501916001015b81811015613e5257609087901c60ff168352918501916001015b81811015613e6c57609887901c60ff168352918501916001015b81811015613e865760a087901c60ff168352918501916001015b81811015613ea05760a887901c60ff168352918501916001015b81811015613eba5760b087901c60ff168352918501916001015b81811015613ed45760b887901c60ff168352918501916001015b81811015613eee5760c087901c60ff168352918501916001015b81811015613f085760c887901c60ff168352918501916001015b81811015613f225760d087901c60ff168352918501916001015b81811015613f3c5760d887901c60ff168352918501916001015b81811015613f565760e087901c60ff168352918501916001015b81811015613f705760e887901c60ff168352918501916001015b81811015613f8a5760f087901c60ff168352918501916001015b81811015613f9e5760f887901c8352918501915b505060808701989098525050505060a09091019190915250949350505050565b63ffffffff828116828216039080821115613fdb57613fdb613697565b5092915050565b878152600063ffffffff808916602084015280881660408401525060e0606083015261401160e0830187613400565b6080830195909552506001600160a01b039290921660a083015260c090910152949350505050565b60608152600061404c6060830186613904565b828103602084015261405e8186613938565b91505082604083015294935050505056fe1d93c87416ca7b54f0fb8323167b72760e8e2ec93d48660953897a150f97a8b4a2646970667358221220ca9d7986e359d28482c557f44e35cb9e4adb2d9c9051e15f79d68274f27b711d64736f6c63430008180033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806387b9f1a21161010f578063af4e99de116100a2578063ddca3f4311610071578063ddca3f431461047f578063ef8c523614610488578063f0f4426014610491578063f87dbc2d146104a457600080fd5b8063af4e99de1461042c578063ca09efb514610444578063ce07b07514610457578063d547741f1461046c57600080fd5b8063a79325ad116100de578063a79325ad146103c6578063a8b62a3a146103f1578063aac99ae614610404578063ad1def1e1461041757600080fd5b806387b9f1a21461037e57806391d14854146103a3578063a217fddf146103b6578063a6fc7abb146103be57600080fd5b8063536a3ddc1161018757806361d027b31161015657806361d027b31461032f578063645006ca1461035a57806369fe0e2d14610363578063786b844b1461037657600080fd5b8063536a3ddc146102f7578063578f0563146103005780635cd7692e14610309578063609a88131461031c57600080fd5b806336568abe116101c357806336568abe1461027657806340a1b635146102895780634c2412a2146102db578063520936b1146102e457600080fd5b806301ffc9a7146101f5578063248a9ca31461021d578063288dee3b1461024e5780632f2ff15d14610263575b600080fd5b610208610203366004613106565b6104b7565b60405190151581526020015b60405180910390f35b61024061022b366004613137565b60009081526020819052604090206001015490565b604051908152602001610214565b61026161025c366004613137565b6104ee565b005b610261610271366004613165565b610536565b610261610284366004613165565b610561565b6102bd6102973660046131ab565b600360208190526000918252604090912060028101549181015460049091015460170b83565b60408051938452602084019290925260170b90820152606001610214565b61024060085481565b6102616102f23660046131c6565b610599565b61024060045481565b610240600a5481565b6102616103173660046131c6565b6108f9565b61026161032a36600461325d565b610a7a565b600654610342906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b61024060075481565b610261610371366004613137565b611884565b61026161190c565b61039161038c366004613137565b611da5565b60405160ff9091168152602001610214565b6102086103b1366004613165565b611dd9565b610240600081565b610208611e02565b6102406103d436600461336a565b600260209081526000928352604080842090915290825290205481565b6102616103ff366004613396565b611e8a565b6102616104123660046133de565b61222f565b61024060008051602061407083398151915281565b6104346122c6565b604051610214949392919061343f565b6102616104523660046134d4565b612447565b61045f6128f9565b60405161021491906135b0565b61026161047a366004613165565b612957565b61024060095481565b610240600b5481565b61026161049f3660046135db565b61297c565b6102616104b236600461325d565b612a1a565b60006001600160e01b03198216637965db0b60e01b14806104e857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006104f981612ec8565b60088290556040518281527f6c31254b0e0eb7c0dc776ffcdc449905584ed6806f9504cb4fdb3dc1578e613a906020015b60405180910390a15050565b60008281526020819052604090206001015461055181612ec8565b61055b8383612ed2565b50505050565b6001600160a01b038116331461058a5760405163334bd91960e11b815260040160405180910390fd5b6105948282612f64565b505050565b6007548210156105c45760405162461bcd60e51b81526004016105bb906135f8565b60405180910390fd5b60055460ff8216106105e85760405162461bcd60e51b81526004016105bb90613626565b600060058260ff168154811061060057610600613652565b600091825260208083208183040154601f9092166101000a90910460ff16808352600282526040808420338552909252912054909150156106535760405162461bcd60e51b81526004016105bb90613668565b600061065d6128f9565b90506008548160600151600161067391906136ad565b11156106915760405162461bcd60e51b81526004016105bb906136c0565b428160400151116106b45760405162461bcd60e51b81526004016105bb906136f7565b60ff8216600090815260026020908152604080832033808552925280832087905560065460608501516004805493516317acb94360e11b81529081018a90526024810194909452604484015260648301919091526001600160a01b031690632f597286906084015b6020604051808303816000875af115801561073b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075f919061372e565b60ff84166000908152600360205260408120600201805492935087929091906107899084906136ad565b909155505060ff8316600090815260036020819052604082200180548392906107b39084906136ad565b909155505060ff8316600081815260036020908152604080832080546001818101835582865284862090910180546001600160a01b0319163390811790915595855260608801805192820180549283018155865293909420909301929092555160048054600654935163888f7a7560e01b81527f6b7ebc4753f1ddf06ee210cdef87de81c4ccd066c672f525505068635418db7a95948b94938a9289926001600160a01b03169163888f7a75916108709187910190815260200190565b602060405180830381865afa15801561088d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b19190613747565b6040516108c49796959493929190613764565b60405180910390a16060828101516108dd9060016136ad565b6001805463ffffffff60601b19169190921b1790555050505050565b60075482101561091b5760405162461bcd60e51b81526004016105bb906135f8565b60055460ff82161061093f5760405162461bcd60e51b81526004016105bb90613626565b600060058260ff168154811061095757610957613652565b600091825260208083208183040154601f9092166101000a90910460ff16808352600282526040808420338552909252912054909150156109aa5760405162461bcd60e51b81526004016105bb90613668565b60006109b46128f9565b9050600854816060015160016109ca91906136ad565b11156109e85760405162461bcd60e51b81526004016105bb906136c0565b42816040015111610a0b5760405162461bcd60e51b81526004016105bb906136f7565b60ff821660009081526002602090815260408083203380855292528083208790556006546004805460608701519351633a6f4ebd60e21b81529182018a90526024820194909452604481019390935260648301919091526001600160a01b03169063e9bd3af49060840161071c565b600080516020614070833981519152610a9281612ec8565b6000610a9c6128f9565b9050600154600003610ae75760405162461bcd60e51b815260206004820152601460248201527314dd185c9d081d1a194819d85b5948199a5c9cdd60621b60448201526064016105bb565b8060200151421015610b315760405162461bcd60e51b81526020600482015260136024820152720a8dede40cac2e4d8f240e8de40ccd2dcd2e6d606b1b60448201526064016105bb565b610b39611e02565b610b455761059461190c565b6006546040805163167a382560e11b815290516000926001600160a01b031691632cf4704a9160048083019260209291908290030181865afa158015610b8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb39190613747565b90506000845167ffffffffffffffff811115610bd157610bd16131f2565b604051908082528060200260200182016040528015610bfa578160200160208202803683370190505b5090506000855167ffffffffffffffff811115610c1957610c196131f2565b604051908082528060200260200182016040528015610c42578160200160208202803683370190505b5090506000865167ffffffffffffffff811115610c6157610c616131f2565b604051908082528060200260200182016040528015610c8a578160200160208202803683370190505b506005548851919250600160ff1b9160009114610ce05760405162461bcd60e51b81526020600482015260146024820152730aee4dedcce40e4cae0dee4e8e640d8cadccee8d60631b60448201526064016105bb565b60005b895181101561106057600080886001600160a01b031663d369dc618d8581518110610d1057610d10613652565b602002602001015160058681548110610d2b57610d2b613652565b90600052602060002090602091828204019190069054906101000a900460ff166040518363ffffffff1660e01b8152600401610d689291906137a4565b60408051808303816000875af1158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa91906137fc565b91509150600a8a602001518263ffffffff16610dc69190613831565b1115610e0b5760405162461bcd60e51b815260206004820152601460248201527313db190818da185a5b9b1a5b9ac81c995c1bdc9d60621b60448201526064016105bb565b80868481518110610e1e57610e1e613652565b602002602001019063ffffffff16908163ffffffff16815250506003600060058581548110610e4f57610e4f613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400181206004015460170b9003610ec85760405162461bcd60e51b815260206004820152601660248201527514dd185c9d1a5b99c81c1c9a58d9481b9bdd081cd95d60521b60448201526064016105bb565b6003600060058581548110610edf57610edf613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040018120600401546005805460179290920b9260039290919087908110610f2f57610f2f613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902060040154610f6b9060170b84613844565b610f7790612710613871565b610f81919061389f565b60170b888481518110610f9657610f96613652565b60200260200101818152505084888481518110610fb557610fb5613652565b602002602001015113801561100b57506003600060058581548110610fdc57610fdc613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190205415155b156110305787838151811061102257611022613652565b602002602001015194508293505b8187848151811061104357611043613652565b60179290920b602092830291909101909101525050600101610ce3565b506000805b8a51811015611144578387828151811061108157611081613652565b60200260200101510361113c5760036000600583815481106110a5576110a5613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902054156110e457816110e0816138eb565b9250505b8160020361113c577ffcc86dce1b30e3fc1afe5b35c776e9095231ddd3b664213f7f1d0c83101c714360045460405161111f91815260200190565b60405180910390a161112f61190c565b5050505050505050505050565b600101611065565b5060008060005b6005548110156112095784811461120157600360006005838154811061117357611173613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020600201546111ac90846136ad565b925060036000600583815481106111c5576111c5613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020600301546111fe90836136ad565b91505b60010161114b565b5060065460095460048054604051637b85343760e11b8152918201869052602482019290925260448101919091526001600160a01b039091169063f70a686e906064016020604051808303816000875af115801561126b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128f919061372e565b50600654600580546000926001600160a01b03169163a2b173dc9160039185918a9081106112bf576112bf613652565b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff16815260200190815260200160002060020154846004546040518463ffffffff1660e01b815260040161132a939291909283526020830191909152604082015260600190565b6020604051808303816000875af1158015611349573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136d919061372e565b905060005b600360006005888154811061138957611389613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190205481101561160b57600654600580546001600160a01b039092169163eb934f7191600391600091908b9081106113ec576113ec613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902080548490811061142957611429613652565b9060005260206000200160009054906101000a90046001600160a01b03166002600060058b8154811061145e5761145e613652565b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff16815260200190815260200160002060006003600060058d815481106114ab576114ab613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190208054879081106114e8576114e8613652565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020546004546003600060058d8154811061154157611541613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902060010180548790811061158157611581613652565b6000918252602090912001546040516001600160e01b031960e087901b1681526001600160a01b0390941660048501526024840192909252604483015260648201526084810185905260a401600060405180830381600087803b1580156115e757600080fd5b505af11580156115fb573d6000803e3d6000fd5b5050600190920191506113729050565b507f319bdd306c29ee5c352c0a85c5556133166bc22f9760cbf2a457cc21256bd798888a896005896004546040516116489695949392919061396f565b60405180910390a160065460048054604051634f0644ef60e01b8152918201526001600160a01b0390911690634f0644ef90602401600060405180830381600087803b15801561169757600080fd5b505af11580156116ab573d6000803e3d6000fd5b5050505060005b60055481101561185b5760005b60036000600584815481106116d6576116d6613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020548110156117d757600260006005848154811061172057611720613652565b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff1681526020019081526020016000206000600360006005868154811061176d5761176d613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190208054849081106117aa576117aa613652565b60009182526020808320909101546001600160a01b031683528201929092526040018120556001016116bf565b5060036000600583815481106117ef576117ef613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040018120906118258282613008565b611833600183016000613008565b50600060028201819055600382015560040180546001600160c01b03191690556001016116b2565b5060006001819055600481905561187490600590613026565b50505050505050505050505b5050565b600061188f81612ec8565b610bb88211156118d75760405162461bcd60e51b815260206004820152601360248201527204665652065786365656473207468652063617606c1b60448201526064016105bb565b60098290556040518281527f63fe946ed58429ac3c5e64d4356ff92c26d7fa1e73586515df8ba9f059ab54a59060200161052a565b60008051602061407083398151915261192481612ec8565b6004546119665760405162461bcd60e51b815260206004820152601060248201526f11d85b59481b9bdd081cdd185c9d195960821b60448201526064016105bb565b60005b600554811015611d4e5760005b600360006005848154811061198d5761198d613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902054811015611cca57600654600580546001600160a01b039092169163fb4789d69160029160009190879081106119f0576119f0613652565b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff16815260200190815260200160002060006003600060058881548110611a3d57611a3d613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020805486908110611a7a57611a7a613652565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020546003600060058781548110611ad057611ad0613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020805485908110611b0d57611b0d613652565b9060005260206000200160009054906101000a90046001600160a01b03166004546003600060058981548110611b4557611b45613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020600101805487908110611b8557611b85613652565b6000918252602090912001546040516001600160e01b031960e087901b16815260048101949094526001600160a01b03909216602484015260448301526064820152608401600060405180830381600087803b158015611be457600080fd5b505af1158015611bf8573d6000803e3d6000fd5b505050506002600060058481548110611c1357611c13613652565b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff16815260200190815260200160002060006003600060058681548110611c6057611c60613652565b600091825260208083208183040154601f9092166101000a90910460ff1683528201929092526040019020805484908110611c9d57611c9d613652565b60009182526020808320909101546001600160a01b03168352820192909252604001812055600101611976565b506003600060058381548110611ce257611ce2613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001812090611d188282613008565b611d26600183016000613008565b50600060028201819055600382015560040180546001600160c01b0319169055600101611969565b507f3f3669b11af9b00fb2a95f8ded36a79a2e1d5374efbc5ec6b2b5b96ceaf9ac6a600454604051611d8291815260200190565b60405180910390a1600060018190556004819055611da290600590613026565b50565b60058181548110611db557600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008060005b600554811015611e70576003600060058381548110611e2957611e29613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190205415611e6857611e656001836136ad565b91505b600101611e08565b506001811115611e81576001611e84565b60005b91505090565b600754831015611eac5760405162461bcd60e51b81526004016105bb906135f8565b60055460ff831610611ed05760405162461bcd60e51b81526004016105bb90613626565b600060058360ff1681548110611ee857611ee8613652565b600091825260208083208183040154601f9092166101000a90910460ff1680835260028252604080842033855290925291205490915015611f3b5760405162461bcd60e51b81526004016105bb90613668565b6000611f456128f9565b905060085481606001516001611f5b91906136ad565b1115611f795760405162461bcd60e51b81526004016105bb906136c0565b42816040015111611f9c5760405162461bcd60e51b81526004016105bb906136f7565b60ff821660009081526002602090815260408083203380855290835281842089905560065460045460608701516001600160a01b0390921694634efb8649948c9493918b3591611ff191908d01908d016131ab565b604080516001600160e01b031960e08a901b16815260048101979097526001600160a01b03909516602487015260448601939093526064850191909152608484015260ff1660a483015287013560c4820152606087013560e4820152610104016020604051808303816000875af1158015612070573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612094919061372e565b60ff84166000908152600360205260408120600201805492935088929091906120be9084906136ad565b909155505060ff8316600090815260036020819052604082200180548392906120e89084906136ad565b909155505060ff8316600081815260036020908152604080832080546001818101835582865284862090910180546001600160a01b0319163390811790915595855260608801805192820180549283018155865293909420909301929092555160048054600654935163888f7a7560e01b81527f6b7ebc4753f1ddf06ee210cdef87de81c4ccd066c672f525505068635418db7a95948c94938a9289926001600160a01b03169163888f7a75916121a59187910190815260200190565b602060405180830381865afa1580156121c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e69190613747565b6040516121f99796959493929190613764565b60405180910390a16060828101516122129060016136ad565b6001805463ffffffff60601b19169190921b179055505050505050565b600061223a81612ec8565b8183111561227e5760405162461bcd60e51b815260206004820152601160248201527057726f6e67206e657720616d6f756e747360781b60448201526064016105bb565b600a839055600b82905560408051848152602081018490527f243a9df63d9ea74b55da88adcd8fc523bf6a8443f524a3295d07219b69e1ca9a910160405180910390a1505050565b6122f16040518060800160405280600081526020016000815260200160008152602001600081525090565b6000606080600060058054905067ffffffffffffffff811115612316576123166131f2565b60405190808252806020026020018201604052801561233f578160200160208202803683370190505b50905060005b6005548110156123b957600360006005838154811061236657612366613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190205482518390839081106123a6576123a6613652565b6020908102919091010152600101612345565b506123c26128f9565b6004546005838180548060200260200160405190810160405280929190818152602001828054801561243157602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116124025790505b5050505050915094509450945094505090919293565b60008051602061407083398151915261245f81612ec8565b60065460405163722ec76f60e01b81526001600160a01b0385811660048301529091169063722ec76f906024016020604051808303816000875af11580156124ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cf919061372e565b8410156124ee5760405162461bcd60e51b81526004016105bb906135f8565b600a548251101580156125045750600b54825111155b6125455760405162461bcd60e51b81526020600482015260126024820152710aee4dedcce40c2e6e6cae840d8cadccee8d60731b60448201526064016105bb565b600154156125955760405162461bcd60e51b815260206004820152601a60248201527f46696e6973682070726576696f75732067616d6520666972737400000000000060448201526064016105bb565b601e6125a74263ffffffff8816613831565b10156125e75760405162461bcd60e51b815260206004820152600f60248201526e57726f6e672073746f702074696d6560881b60448201526064016105bb565b601e6125f38688613fbe565b63ffffffff1610156126475760405162461bcd60e51b815260206004820152601c60248201527f54696d656672616d6520676170206d757374206265206869676865720000000060448201526064016105bb565b60005b8251811015612798576006546040805163167a382560e11b815290516000926001600160a01b031691632cf4704a9160048083019260209291908290030181865afa15801561269d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c19190613747565b6001600160a01b031663ae82b5c98584815181106126e1576126e1613652565b60200260200101516040518263ffffffff1660e01b815260040161270e919060ff91909116815260200190565b602060405180830381865afa15801561272b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274f919061372e565b036127905760405162461bcd60e51b81526020600482015260116024820152702bb937b733903332b2b210373ab6b132b960791b60448201526064016105bb565b60010161264a565b50604086811b6bffffffff000000000000000016602087811b67ffffffff00000000164290811792909217600155915160e089811b6001600160e01b03199081169483019490945288901b90921660248301526028820186905260488201523060601b6bffffffffffffffffffffffff19166068820152607c0160408051601f198184030181529190528051602091820120600455825161283f916005919085019061304b565b506006546004805460405163039279d760e61b8152918201526001600160a01b0385811660248301529091169063e49e75c090604401600060405180830381600087803b15801561288f57600080fd5b505af11580156128a3573d6000803e3d6000fd5b5050506007859055506004546040517f0551302fbd9463e6b52652e611db38321a859aca2fb835de2c7f9ce91c218522916128e991429189918b9188918a908c90613fe2565b60405180910390a1505050505050565b6129246040518060800160405280600081526020016000815260200160008152602001600081525090565b60015463ffffffff8082168352602082811c821660408086019190915283901c90911690830152606090811c9082015290565b60008281526020819052604090206001015461297281612ec8565b61055b8383612f64565b600061298781612ec8565b6001600160a01b0382166129cc5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b60448201526064016105bb565b600680546001600160a01b0319166001600160a01b0384169081179091556040519081527fafa147634b29e2c7bd53ce194256b9f41cfb9ba3036f2b822fdd1d965beea0869060200161052a565b600080516020614070833981519152612a3281612ec8565b6000612a3c6128f9565b90508060400151421015612a7e5760405162461bcd60e51b8152602060048201526009602482015268546f6f206561726c7960b81b60448201526064016105bb565b612a86611e02565b612ac75760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820706c617965727360701b60448201526064016105bb565b6006546040805163167a382560e11b815290516000926001600160a01b031691632cf4704a9160048083019260209291908290030181865afa158015612b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b359190613747565b90506000845167ffffffffffffffff811115612b5357612b536131f2565b604051908082528060200260200182016040528015612b7c578160200160208202803683370190505b50600554865191925014612bc95760405162461bcd60e51b81526020600482015260146024820152730aee4dedcce40e4cae0dee4e8e640d8cadccee8d60631b60448201526064016105bb565b6000855167ffffffffffffffff811115612be557612be56131f2565b604051908082528060200260200182016040528015612c0e578160200160208202803683370190505b50905060005b8651811015612e9257600080856001600160a01b031663d369dc618a8581518110612c4157612c41613652565b602002602001015160058681548110612c5c57612c5c613652565b90600052602060002090602091828204019190069054906101000a900460ff166040518363ffffffff1660e01b8152600401612c999291906137a4565b60408051808303816000875af1158015612cb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cdb91906137fc565b91509150600a87604001518263ffffffff16612cf79190613831565b1115612d3c5760405162461bcd60e51b815260206004820152601460248201527313db190818da185a5b9b1a5b9ac81c995c1bdc9d60621b60448201526064016105bb565b6003600060058581548110612d5357612d53613652565b600091825260208083208183040154601f9092166101000a90910460ff16835282019290925260400190206004015460170b15612dd25760405162461bcd60e51b815260206004820152601a60248201527f5374617274696e6720707269636520616c72656164792073657400000000000060448201526064016105bb565b816003600060058681548110612dea57612dea613652565b600091825260208083208183040154601f9092166101000a90910460ff168352820192909252604001902060040180546001600160c01b0319166001600160c01b039290921691909117905584518290869085908110612e4c57612e4c613652565b602002602001019060170b908160170b8152505080848481518110612e7357612e73613652565b63ffffffff909216602092830291909101909101525050600101612c14565b507fcf8aa1c5af7a9205f2116cfd8827ed91ac4a32da9752b24c4af091d85b92324782826004546040516128e993929190614039565b611da28133612fcf565b6000612ede8383611dd9565b612f5c576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055612f143390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016104e8565b5060006104e8565b6000612f708383611dd9565b15612f5c576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016104e8565b612fd98282611dd9565b6118805760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016105bb565b5080546000825590600052602060002090810190611da291906130f1565b50805460008255601f016020900490600052602060002090810190611da291906130f1565b82805482825590600052602060002090601f016020900481019282156130e15791602002820160005b838211156130b257835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302613074565b80156130df5782816101000a81549060ff02191690556001016020816000010492830192600103026130b2565b505b506130ed9291506130f1565b5090565b5b808211156130ed57600081556001016130f2565b60006020828403121561311857600080fd5b81356001600160e01b03198116811461313057600080fd5b9392505050565b60006020828403121561314957600080fd5b5035919050565b6001600160a01b0381168114611da257600080fd5b6000806040838503121561317857600080fd5b82359150602083013561318a81613150565b809150509250929050565b803560ff811681146131a657600080fd5b919050565b6000602082840312156131bd57600080fd5b61313082613195565b600080604083850312156131d957600080fd5b823591506131e960208401613195565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613231576132316131f2565b604052919050565b600067ffffffffffffffff821115613253576132536131f2565b5060051b60200190565b6000602080838503121561327057600080fd5b823567ffffffffffffffff8082111561328857600080fd5b8185019150601f86601f84011261329e57600080fd5b82356132b16132ac82613239565b613208565b81815260059190911b840185019085810190898311156132d057600080fd5b8686015b8381101561335c578035868111156132ec5760008081fd5b8701603f81018c136132fe5760008081fd5b88810135604088821115613314576133146131f2565b613325828901601f19168c01613208565b8281528e8284860101111561333a5760008081fd5b828285018d83013760009281018c0192909252508452509187019187016132d4565b509998505050505050505050565b6000806040838503121561337d57600080fd5b61338683613195565b9150602083013561318a81613150565b600080600083850360c08112156133ac57600080fd5b843593506133bc60208601613195565b92506080603f19820112156133d057600080fd5b506040840190509250925092565b600080604083850312156133f157600080fd5b50508035926020909101359150565b60008151808452602080850194506020840160005b8381101561343457815160ff1687529582019590820190600101613415565b509495945050505050565b8451815260208086015190820152604080860151908201526060808601519082015283608082015260e060a0820152600061347d60e0830185613400565b82810360c084015283518082526020808601928101919060005b828110156134b357845184529381019392810192600101613497565b50919998505050505050505050565b63ffffffff81168114611da257600080fd5b600080600080600060a086880312156134ec57600080fd5b85356134f7816134c2565b9450602086810135613508816134c2565b945060408701359350606087013561351f81613150565b9250608087013567ffffffffffffffff81111561353b57600080fd5b8701601f8101891361354c57600080fd5b803561355a6132ac82613239565b81815260059190911b8201830190838101908b83111561357957600080fd5b928401925b8284101561359e5761358f84613195565b8252928401929084019061357e565b80955050505050509295509295909350565b81518152602080830151908201526040808301519082015260608083015190820152608081016104e8565b6000602082840312156135ed57600080fd5b813561313081613150565b60208082526014908201527315dc9bdb99c819195c1bdcda5d08185b5bdd5b9d60621b604082015260600190565b6020808252601290820152712bb937b7339030b9b9b2ba10373ab6b132b960711b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260159082015274416c72656164792070617274696369706174696e6760581b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156104e8576104e8613697565b60208082526019908201527f4d617820706c6179657220616d6f756e74207265616368656400000000000000604082015260600190565b6020808252601e908201527f47616d6520697320636c6f73656420666f72206e657720706c61796572730000604082015260600190565b60006020828403121561374057600080fd5b5051919050565b60006020828403121561375957600080fd5b815161313081613150565b6001600160a01b03978816815260208101969096526040860194909452606085019290925260ff16608084015260a083015290911660c082015260e00190565b604081526000835180604084015260005b818110156137d257602081870181015160608684010152016137b5565b506000606082850101526060601f19601f83011684010191505060ff831660208301529392505050565b6000806040838503121561380f57600080fd5b82518060170b811461382057600080fd5b602084015190925061318a816134c2565b818103818111156104e8576104e8613697565b601782810b9082900b036001600160bf1b031981126001600160bf1b03821317156104e8576104e8613697565b60008160170b8360170b80820260170b9250818305811482151761389757613897613697565b505092915050565b60008160170b8360170b806138c457634e487b7160e01b600052601260045260246000fd5b6001600160bf1b03198214600019821416156138e2576138e2613697565b90059392505050565b6000600182016138fd576138fd613697565b5060010190565b60008151808452602080850194506020840160005b8381101561343457815160170b87529582019590820190600101613919565b60008151808452602080850194506020840160005b8381101561343457815163ffffffff168752958201959082019060010161394d565b60c08152600061398260c0830189613904565b82810360208481019190915288518083528982019282019060005b818110156139b95784518352938301939183019160010161399d565b50506040925084810360408601526139d1818a613938565b9050606085820360608701528189546139ee818590815260200190565b60008c81526020812095509092505b81601f82011015613c6657845460ff8082168552600882901c811688860152601082901c811689860152601882901c8116868601526080613a4681870183858c1c1660ff169052565b60a0613a5b818801848660281c1660ff169052565b613a6f60c08801848660301c1660ff169052565b60e0613a84818901858760381c1660ff169052565b60ff858d1c851616610100890152613aa76101208901858760481c1660ff169052565b613abc6101408901858760501c1660ff169052565b613ad16101608901858760581c1660ff169052565b60ff858a1c851616610180890152613af46101a08901858760681c1660ff169052565b613b096101c08901858760701c1660ff169052565b613b1e6101e08901858760781c1660ff169052565b60ff85841c851616610200890152613b416102208901858760881c1660ff169052565b613b566102408901858760901c1660ff169052565b613b6b6102608901858760981c1660ff169052565b60ff85831c851616610280890152613b8e6102a08901858760a81c1660ff169052565b613ba36102c08901858760b01c1660ff169052565b613bb86102e08901858760b81c1660ff169052565b613bcd6103008901858760c01c1660ff169052565b613be26103208901858760c81c1660ff169052565b613bf76103408901858760d01c1660ff169052565b613c0c6103608901858760d81c1660ff169052565b60ff85821c851616610380890152505050613c326103a08601828460e81c1660ff169052565b613c476103c08601828460f01c1660ff169052565b5060f81c6103e0840152600194909401936104009092019185016139fd565b8454965081811015613c805760ff87168352918501916001015b81811015613c9a57600887901c60ff168352918501916001015b81811015613cb457601087901c60ff168352918501916001015b81811015613cce57601887901c60ff168352918501916001015b81811015613ce65786861c60ff168352918501916001015b81811015613d0057602887901c60ff168352918501916001015b81811015613d1a57603087901c60ff168352918501916001015b81811015613d3457603887901c60ff168352918501916001015b81811015613d4e57604087901c60ff168352918501916001015b81811015613d6857604887901c60ff168352918501916001015b81811015613d8257605087901c60ff168352918501916001015b81811015613d9c57605887901c60ff168352918501916001015b81811015613db657606087901c60ff168352918501916001015b81811015613dd057606887901c60ff168352918501916001015b81811015613dea57607087901c60ff168352918501916001015b81811015613e0457607887901c60ff168352918501916001015b81811015613e1e57608087901c60ff168352918501916001015b81811015613e3857608887901c60ff168352918501916001015b81811015613e5257609087901c60ff168352918501916001015b81811015613e6c57609887901c60ff168352918501916001015b81811015613e865760a087901c60ff168352918501916001015b81811015613ea05760a887901c60ff168352918501916001015b81811015613eba5760b087901c60ff168352918501916001015b81811015613ed45760b887901c60ff168352918501916001015b81811015613eee5760c087901c60ff168352918501916001015b81811015613f085760c887901c60ff168352918501916001015b81811015613f225760d087901c60ff168352918501916001015b81811015613f3c5760d887901c60ff168352918501916001015b81811015613f565760e087901c60ff168352918501916001015b81811015613f705760e887901c60ff168352918501916001015b81811015613f8a5760f087901c60ff168352918501916001015b81811015613f9e5760f887901c8352918501915b505060808701989098525050505060a09091019190915250949350505050565b63ffffffff828116828216039080821115613fdb57613fdb613697565b5092915050565b878152600063ffffffff808916602084015280881660408401525060e0606083015261401160e0830187613400565b6080830195909552506001600160a01b039290921660a083015260c090910152949350505050565b60608152600061404c6060830186613904565b828103602084015261405e8186613938565b91505082604083015294935050505056fe1d93c87416ca7b54f0fb8323167b72760e8e2ec93d48660953897a150f97a8b4a2646970667358221220ca9d7986e359d28482c557f44e35cb9e4adb2d9c9051e15f79d68274f27b711d64736f6c63430008180033
Loading...
Loading
Loading...
Loading
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.