Source Code
Overview
S Balance
0 S
More Info
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DuckRaceCommitReveal
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; /** * @title DuckRaceCommitReveal * @notice Demonstration of a single-race "commit-reveal" game: * - Each race: 1 minute commit phase, 1 minute reveal phase, then finalize winners. * - At least 2 unique addresses to have a valid race. * - Up to 100 players max. * - Each deposit must be a whole number of "Sonic" (1,2,3... ETH). * - Once race ends, 90% of the pot goes to the winner, 10% to the dev. * - If contract balance >= 60 ETH, automatically sends 50 ETH to dev (to minimize honeypot). * - 3-minute cooldown between races for better user experience. * * WARNING: * - Commit-reveal is still partially vulnerable if participants "refuse to reveal" or collude. * - Not audited. Thoroughly test before production. */ contract DuckRaceCommitReveal is ReentrancyGuard, Pausable, Ownable { // RACE timing constants uint256 public constant COMMIT_PHASE_DURATION = 60; // 1 minute commit uint256 public constant REVEAL_PHASE_DURATION = 60; // 1 minute reveal uint256 public constant COOLDOWN_DURATION = 180; // 3 minute wait between races // Participation constraints uint256 public constant MIN_PLAYERS = 2; uint256 public constant MAX_PLAYERS = 100; // Whole number deposit logic => 1 Sonic = 1 ETH in this example // Payout distribution uint256 public constant WINNER_PERCENT = 90; // 90% to winner uint256 public constant DEV_FEE_PERCENT = 10; // 10% to dev // Threshold logic uint256 public constant THRESHOLD_BALANCE = 60 ether; // if contract >= 60, uint256 public constant THRESHOLD_PAYOUT = 50 ether; // pay 50 to dev // Race phases enum RaceStatus { NotStarted, Commit, Reveal, Finished } struct PlayerData { // The hash the player committed (keccak256(seed, secretSalt, address, etc.)) bytes32 commitHash; // How many ETH (Sonic) deposited uint256 deposit; // The revealed seed (once they reveal) uint256 revealedSeed; // Has the player actually revealed? bool hasRevealed; } struct Race { uint256 raceId; RaceStatus status; uint256 commitEndTime; uint256 revealEndTime; address[] players; // list of participants mapping(address => PlayerData) playerInfo; bool isPaidOut; address winner; } mapping(uint256 => Race) public races; uint256 public currentRaceId; uint256 public lastRaceFinishTime; // for 3-min cooldown // ====================== // EVENTS // ====================== event RaceStarted(uint256 raceId, uint256 commitEndTime, uint256 revealEndTime); event RaceCommitted(uint256 raceId, address indexed player, bytes32 commitHash, uint256 deposit); event RaceRevealed(uint256 raceId, address indexed player, uint256 seed); event RaceFinalized(uint256 raceId, address winner, uint256 winnerPrize, uint256 devFee); event ThresholdPayout(address dev, uint256 amount); constructor() { currentRaceId = 0; lastRaceFinishTime = block.timestamp; } // ====================== // PUBLIC FUNCTIONS // ====================== /** * @dev Start a new race, can only be done if: * - The previous race is finished * - 3 minutes have passed since that race ended */ function startRace() external whenNotPaused { // Require cooldown require( block.timestamp >= lastRaceFinishTime + COOLDOWN_DURATION, "Wait 3-min cooldown" ); // Increment race ID currentRaceId++; Race storage r = races[currentRaceId]; r.raceId = currentRaceId; r.status = RaceStatus.Commit; r.commitEndTime = block.timestamp + COMMIT_PHASE_DURATION; r.revealEndTime = r.commitEndTime + REVEAL_PHASE_DURATION; emit RaceStarted(currentRaceId, r.commitEndTime, r.revealEndTime); } /** * @dev Commit your random seed hash + deposit (must be whole number of ETH). * The commit hash is typically keccak256(abi.encodePacked(seed, salt, msg.sender)). */ function commitSeed(bytes32 _commitHash) external payable whenNotPaused nonReentrant { Race storage r = races[currentRaceId]; require(r.status == RaceStatus.Commit, "Not in commit phase"); require(block.timestamp < r.commitEndTime, "Commit phase over"); // Must not already committed PlayerData storage pdata = r.playerInfo[msg.sender]; require(pdata.commitHash == 0, "Already committed"); // Check deposit is multiple of 1 ETH require(msg.value > 0 && (msg.value % 1 ether == 0), "Deposit must be whole Sonic"); // Check players not exceeding max require(r.players.length < MAX_PLAYERS, "Max 100 players reached"); // Store player info pdata.commitHash = _commitHash; pdata.deposit = msg.value; r.players.push(msg.sender); emit RaceCommitted(currentRaceId, msg.sender, _commitHash, msg.value); // Check threshold _checkContractThreshold(); } /** * @dev Reveal your seed in the reveal phase. The contract verifies your commit hash. * If you never reveal, you cannot win (your deposit remains in the pot anyway). */ function revealSeed(uint256 _seed) external whenNotPaused nonReentrant { Race storage r = races[currentRaceId]; require(r.status == RaceStatus.Commit || r.status == RaceStatus.Reveal, "Wrong phase"); require(block.timestamp >= r.commitEndTime, "Reveal not started"); require(block.timestamp < r.revealEndTime, "Reveal phase ended"); PlayerData storage pdata = r.playerInfo[msg.sender]; require(pdata.commitHash != 0, "No commit found for you"); require(!pdata.hasRevealed, "Already revealed"); // Recompute commit // We encourage players to do: keccak256(abi.encodePacked(seed, salt, msg.sender)) // so it's unique. But we only store the final hash, can't check the salt's presence. bytes32 checkHash = keccak256(abi.encodePacked(_seed, msg.sender)); require(checkHash == pdata.commitHash, "Hash mismatch. Wrong seed or salt?"); // Mark revealed pdata.hasRevealed = true; pdata.revealedSeed = _seed; // Race transitions to Reveal status if it was in Commit if (r.status == RaceStatus.Commit) { r.status = RaceStatus.Reveal; } emit RaceRevealed(currentRaceId, msg.sender, _seed); } /** * @dev Finalize the race after reveal phase ends, picking a winner from those who revealed. * If fewer than 2 players ended up revealing, we refund all deposits. */ function finalizeRace() external whenNotPaused nonReentrant { Race storage r = races[currentRaceId]; require(!r.isPaidOut, "Already paid out"); require(r.status == RaceStatus.Reveal, "Race not in reveal status"); require(block.timestamp >= r.revealEndTime, "Reveal phase not ended"); r.status = RaceStatus.Finished; lastRaceFinishTime = block.timestamp; // Gather all REVEALED players address[] memory revealedPlayers = _getRevealedPlayers(r); uint256 revealedCount = revealedPlayers.length; if (revealedCount < MIN_PLAYERS) { // Refund all players if not enough reveals _refundAll(r); return; } // 1) Calculate pot size = sum of *all* deposits (even from non-reveal players) uint256 pot = _sumAllDeposits(r); // 2) Aggregate seeds from revealed players bytes32 aggregator; for (uint256 i = 0; i < revealedPlayers.length; i++) { address p = revealedPlayers[i]; aggregator = bytes32(uint256(aggregator) ^ r.playerInfo[p].revealedSeed); } // 3) Turn aggregator into finalRand (keccak + block data) uint256 finalRand = uint256( keccak256( abi.encodePacked( aggregator, block.timestamp, block.prevrandao, pot, revealedCount ) ) ); // 4) Pick winner index uint256 winnerIndex = finalRand % revealedCount; address winnerAddr = revealedPlayers[winnerIndex]; r.winner = winnerAddr; // 5) Pay out: 90% to winner, 10% dev uint256 devFee = (pot * DEV_FEE_PERCENT) / 100; uint256 winnerPrize = pot - devFee; // Transfer (bool wsuccess, ) = winnerAddr.call{value: winnerPrize}(""); require(wsuccess, "Winner transfer failed"); (bool dsuccess, ) = owner().call{value: devFee}(""); require(dsuccess, "Dev fee transfer failed"); r.isPaidOut = true; emit RaceFinalized(currentRaceId, winnerAddr, winnerPrize, devFee); } // ====================== // INTERNAL LOGIC // ====================== /** * @dev If the contract balance >= 60, auto-sends 50 to dev for security/honeypot minimization. */ function _checkContractThreshold() internal { uint256 bal = address(this).balance; if (bal >= THRESHOLD_BALANCE) { (bool success, ) = owner().call{value: THRESHOLD_PAYOUT}(""); require(success, "Threshold dev payout failed"); emit ThresholdPayout(owner(), THRESHOLD_PAYOUT); } } /** * @dev Refunds all deposits (both revealed and non-revealed) if the race is invalid (not enough reveals). */ function _refundAll(Race storage r) internal { // Anyone who committed deposit gets it back uint256 len = r.players.length; for (uint256 i = 0; i < len; i++) { address player = r.players[i]; uint256 depositAmt = r.playerInfo[player].deposit; if (depositAmt > 0) { r.playerInfo[player].deposit = 0; // zero it out to avoid re-entrancy (bool success, ) = player.call{value: depositAmt}(""); require(success, "Refund failed"); } } r.isPaidOut = true; } /** * @dev Returns an array of all players who revealed. */ function _getRevealedPlayers(Race storage r) internal view returns (address[] memory) { address[] memory pl = r.players; // Count how many revealed uint256 count; for (uint256 i = 0; i < pl.length; i++) { if (r.playerInfo[pl[i]].hasRevealed) { count++; } } // Build a smaller array address[] memory revealed = new address[](count); uint256 idx; for (uint256 i = 0; i < pl.length; i++) { if (r.playerInfo[pl[i]].hasRevealed) { revealed[idx] = pl[i]; idx++; } } return revealed; } /** * @dev Sums deposit from all players (revealed or not). */ function _sumAllDeposits(Race storage r) internal view returns (uint256) { uint256 total; address[] memory pl = r.players; for (uint256 i = 0; i < pl.length; i++) { total += r.playerInfo[pl[i]].deposit; } return total; } // ====================== // GETTERS // ====================== function getPlayers(uint256 _raceId) external view returns (address[] memory) { return races[_raceId].players; } function getRaceStatus(uint256 _raceId) external view returns (RaceStatus) { return races[_raceId].status; } function getCurrentRaceTimes() external view returns ( uint256 commitEnd, uint256 revealEnd ) { Race storage r = races[currentRaceId]; commitEnd = r.commitEndTime; revealEnd = r.revealEndTime; } // ====================== // OWNER / ADMIN // ====================== /** * @dev Pause the contract (stop commits, reveals, new race starts). */ function pause() external onlyOwner { _pause(); } /** * @dev Unpause the contract */ function unpause() external onlyOwner { _unpause(); } /** * @dev Emergency withdraw (owner can take entire balance). * This overrides normal game flow, used only if something goes really wrong. */ function emergencyWithdrawAll() external onlyOwner { uint256 bal = address(this).balance; (bool success, ) = owner().call{value: bal}(""); require(success, "Emergency withdraw failed"); } // Accept direct ETH (Sonic) deposits receive() external payable { // If random ETH is sent, add it to the contract. Then check threshold. _checkContractThreshold(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @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; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"raceId","type":"uint256"},{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"bytes32","name":"commitHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"}],"name":"RaceCommitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"raceId","type":"uint256"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"winnerPrize","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"devFee","type":"uint256"}],"name":"RaceFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"raceId","type":"uint256"},{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"seed","type":"uint256"}],"name":"RaceRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"raceId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"commitEndTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"revealEndTime","type":"uint256"}],"name":"RaceStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dev","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ThresholdPayout","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"COMMIT_PHASE_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COOLDOWN_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEV_FEE_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PLAYERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_PLAYERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_PHASE_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"THRESHOLD_BALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"THRESHOLD_PAYOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WINNER_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_commitHash","type":"bytes32"}],"name":"commitSeed","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"currentRaceId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalizeRace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentRaceTimes","outputs":[{"internalType":"uint256","name":"commitEnd","type":"uint256"},{"internalType":"uint256","name":"revealEnd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raceId","type":"uint256"}],"name":"getPlayers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raceId","type":"uint256"}],"name":"getRaceStatus","outputs":[{"internalType":"enum DuckRaceCommitReveal.RaceStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRaceFinishTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"races","outputs":[{"internalType":"uint256","name":"raceId","type":"uint256"},{"internalType":"enum DuckRaceCommitReveal.RaceStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"commitEndTime","type":"uint256"},{"internalType":"uint256","name":"revealEndTime","type":"uint256"},{"internalType":"bool","name":"isPaidOut","type":"bool"},{"internalType":"address","name":"winner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seed","type":"uint256"}],"name":"revealSeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startRace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052348015600f57600080fd5b5060016000819055805460ff191690556026336033565b600060035542600455608d565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611aac8061009c6000396000f3fe6080604052600436106101855760003560e01c8063715018a6116100d15780639ad9d5011161008a578063d8d97a8711610064578063d8d97a8714610475578063dd19171914610492578063f113ebcc146104a7578063f2fde38b146104bc57600080fd5b80639ad9d50114610449578063c54c40941461045f578063c988fb261461020257600080fd5b8063715018a6146103445780637bbc469e146103595780637c14a733146103cc5780638456cb59146103e957806385f07bbe146103fe5780638da5cb5b1461041357600080fd5b80633ffc6f9c1161013e5780635c975abb116101185780635c975abb146102e25780635e6a645e146103055780635ec775b01461031a5780636ad7ed471461032f57600080fd5b80633ffc6f9c1461028d5780634411b3eb146102a0578063460e2049146102b557600080fd5b80630116538f146101995780630413a0f0146101e25780630d3c15cc1461020257806311fa883f1461022557806321695796146102635780633f4ba83a1461027857600080fd5b36610194576101926104dc565b005b600080fd5b3480156101a557600080fd5b506101cc6101b4366004611889565b60009081526002602052604090206001015460ff1690565b6040516101d991906118da565b60405180910390f35b3480156101ee57600080fd5b506101926101fd366004611889565b610604565b34801561020e57600080fd5b50610217603c81565b6040519081526020016101d9565b34801561023157600080fd5b5060038054600090815260026020819052604090912090810154910154604080519283526020830191909152016101d9565b34801561026f57600080fd5b50610192610910565b34801561028457600080fd5b50610192610d46565b61019261029b366004611889565b610d56565b3480156102ac57600080fd5b50610217606481565b3480156102c157600080fd5b506102d56102d0366004611889565b610fc5565b6040516101d991906118ee565b3480156102ee57600080fd5b5060015460ff1660405190151581526020016101d9565b34801561031157600080fd5b50610217600a81565b34801561032657600080fd5b5061021760b481565b34801561033b57600080fd5b50610192611034565b34801561035057600080fd5b5061019261113a565b34801561036557600080fd5b506103ba610374366004611889565b600260208190526000918252604090912080546001820154928201546003830154600690930154919360ff9081169391929081169061010090046001600160a01b031686565b6040516101d99695949392919061192f565b3480156103d857600080fd5b506102176802b5e3af16b188000081565b3480156103f557600080fd5b5061019261114c565b34801561040a57600080fd5b50610217600281565b34801561041f57600080fd5b5060015461010090046001600160a01b03166040516001600160a01b0390911681526020016101d9565b34801561045557600080fd5b5061021760035481565b34801561046b57600080fd5b5061021760045481565b34801561048157600080fd5b50610217680340aad21b3b70000081565b34801561049e57600080fd5b5061019261115c565b3480156104b357600080fd5b50610217605a81565b3480156104c857600080fd5b506101926104d7366004611970565b611223565b47680340aad21b3b70000081106106015760015460405160009161010090046001600160a01b0316906802b5e3af16b1880000908381818185875af1925050503d8060008114610548576040519150601f19603f3d011682016040523d82523d6000602084013e61054d565b606091505b50509050806105a35760405162461bcd60e51b815260206004820152601b60248201527f5468726573686f6c6420646576207061796f7574206661696c6564000000000060448201526064015b60405180910390fd5b6001547fa495aa4e22929f551585a0efb54c850b026e190916d732bfe223a0dfa200ace89061010090046001600160a01b0316604080516001600160a01b0390921682526802b5e3af16b188000060208301520160405180910390a1505b50565b61060c611299565b6106146112df565b600354600090815260026020526040902060018082015460ff16600381111561063f5761063f6118a2565b148061066357506002600182015460ff166003811115610661576106616118a2565b145b61069d5760405162461bcd60e51b815260206004820152600b60248201526a57726f6e6720706861736560a81b604482015260640161059a565b80600201544210156106e65760405162461bcd60e51b815260206004820152601260248201527114995d99585b081b9bdd081cdd185c9d195960721b604482015260640161059a565b8060030154421061072e5760405162461bcd60e51b815260206004820152601260248201527114995d99585b081c1a185cd948195b99195960721b604482015260640161059a565b336000908152600582016020526040812080549091036107905760405162461bcd60e51b815260206004820152601760248201527f4e6f20636f6d6d697420666f756e6420666f7220796f75000000000000000000604482015260640161059a565b600381015460ff16156107d85760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c995d99585b195960821b604482015260640161059a565b6000833360405160200161080892919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b6040516020818303038152906040528051906020012090508160000154811461087e5760405162461bcd60e51b815260206004820152602260248201527f48617368206d69736d617463682e2057726f6e672073656564206f722073616c604482015261743f60f01b606482015260840161059a565b60038201805460ff1916600190811790915560028301859055600184015460ff1660038111156108b0576108b06118a2565b036108c55760018301805460ff191660021790555b600354604080519182526020820186905233917f2bbe56a3027f253b18c8114a268a2da090b2b0a82a15b630b5c7d6c0f26b8dfa910160405180910390a25050506106016001600055565b610918611299565b6109206112df565b6003546000908152600260205260409020600681015460ff16156109795760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c185a59081bdd5d60821b604482015260640161059a565b6002600182015460ff166003811115610994576109946118a2565b146109e15760405162461bcd60e51b815260206004820152601960248201527f52616365206e6f7420696e2072657665616c2073746174757300000000000000604482015260640161059a565b8060030154421015610a2e5760405162461bcd60e51b815260206004820152601660248201527514995d99585b081c1a185cd9481b9bdd08195b99195960521b604482015260640161059a565b60018101805460ff19166003179055426004556000610a4c82611338565b80519091506002811015610a6b57610a638361150a565b505050610d3a565b6000610a7684611627565b90506000805b8451811015610ad0576000858281518110610a9957610a996119a0565b6020908102919091018101516001600160a01b03166000908152600589019091526040902060020154929092189150600101610a7c565b5060408051602080820184905242828401524460608301526080820185905260a08083018790528351808403909101815260c090920190925280519101206000610b1a85836119cc565b90506000868281518110610b3057610b306119a0565b6020908102919091010151600689018054610100600160a81b0319166101006001600160a01b03841602179055905060006064610b6e600a886119f6565b610b789190611a0d565b90506000610b868288611a21565b90506000836001600160a01b03168260405160006040518083038185875af1925050503d8060008114610bd5576040519150601f19603f3d011682016040523d82523d6000602084013e610bda565b606091505b5050905080610c245760405162461bcd60e51b815260206004820152601660248201527515da5b9b995c881d1c985b9cd9995c8819985a5b195960521b604482015260640161059a565b60015460405160009161010090046001600160a01b03169085908381818185875af1925050503d8060008114610c76576040519150601f19603f3d011682016040523d82523d6000602084013e610c7b565b606091505b5050905080610ccc5760405162461bcd60e51b815260206004820152601760248201527f44657620666565207472616e73666572206661696c6564000000000000000000604482015260640161059a565b60068c01805460ff19166001179055600354604080519182526001600160a01b03871660208301528101849052606081018590527ff47e7176d5f194180e7eab0073b743f9280f029421bb13c6169e7f10c486feb99060800160405180910390a15050505050505050505050505b610d446001600055565b565b610d4e6116f9565b610d44611759565b610d5e611299565b610d666112df565b600354600090815260026020526040902060018082015460ff166003811115610d9157610d916118a2565b14610dd45760405162461bcd60e51b81526020600482015260136024820152724e6f7420696e20636f6d6d697420706861736560681b604482015260640161059a565b80600201544210610e1b5760405162461bcd60e51b815260206004820152601160248201527021b7b6b6b4ba10383430b9b29037bb32b960791b604482015260640161059a565b3360009081526005820160205260409020805415610e6f5760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e4818dbdb5b5a5d1d1959607a1b604482015260640161059a565b600034118015610e8e5750610e8c670de0b6b3a7640000346119cc565b155b610eda5760405162461bcd60e51b815260206004820152601b60248201527f4465706f736974206d7573742062652077686f6c6520536f6e69630000000000604482015260640161059a565b6004820154606411610f2e5760405162461bcd60e51b815260206004820152601760248201527f4d61782031303020706c61796572732072656163686564000000000000000000604482015260640161059a565b82815534600180830182905560048401805491820181556000908152602090200180546001600160a01b0319163390811790915560035460405191927ff0bd9919d7f10aebb53d46c6ca3adb0ea51aff0475d576154682adfed6f2da4492610fa9929188919283526020830191909152604082015260600190565b60405180910390a2610fb96104dc565b50506106016001600055565b60008181526002602090815260409182902060040180548351818402810184019094528084526060939283018282801561102857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161100a575b50505050509050919050565b61103c611299565b60b460045461104b9190611a34565b4210156110905760405162461bcd60e51b81526020600482015260136024820152722bb0b4ba101996b6b4b71031b7b7b63237bbb760691b604482015260640161059a565b600380549060006110a083611a47565b909155505060035460008181526002602052604090209081556001808201805460ff191690911790556110d4603c42611a34565b600282018190556110e790603c90611a34565b60038281018290555460028301546040805192835260208301919091528101919091527fc70247c5a48255c09f8dec14606e5fdba6c5a547468f3258b5c298d68d6b5cd09060600160405180910390a150565b6111426116f9565b610d4460006117ab565b6111546116f9565b610d44611805565b6111646116f9565b47600061117f6001546001600160a01b036101009091041690565b6001600160a01b03168260405160006040518083038185875af1925050503d80600081146111c9576040519150601f19603f3d011682016040523d82523d6000602084013e6111ce565b606091505b505090508061121f5760405162461bcd60e51b815260206004820152601960248201527f456d657267656e6379207769746864726177206661696c656400000000000000604482015260640161059a565b5050565b61122b6116f9565b6001600160a01b0381166112905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161059a565b610601816117ab565b60015460ff1615610d445760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161059a565b6002600054036113315760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161059a565b6002600055565b606060008260040180548060200260200160405190810160405280929190818152602001828054801561139457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611376575b50505050509050600080600090505b8251811015611409578460050160008483815181106113c4576113c46119a0565b6020908102919091018101516001600160a01b031682528101919091526040016000206003015460ff161561140157816113fd81611a47565b9250505b6001016113a3565b5060008167ffffffffffffffff81111561142557611425611a60565b60405190808252806020026020018201604052801561144e578160200160208202803683370190505b5090506000805b84518110156114ff57866005016000868381518110611476576114766119a0565b6020908102919091018101516001600160a01b031682528101919091526040016000206003015460ff16156114f7578481815181106114b7576114b76119a0565b60200260200101518383815181106114d1576114d16119a0565b6001600160a01b0390921660209283029190910190910152816114f381611a47565b9250505b600101611455565b509095945050505050565b600481015460005b81811015611615576000836004018281548110611531576115316119a0565b60009182526020808320909101546001600160a01b031680835260058701909152604090912060010154909150801561160b576001600160a01b03821660008181526005870160205260408082206001018290555190919083908381818185875af1925050503d80600081146115c3576040519150601f19603f3d011682016040523d82523d6000602084013e6115c8565b606091505b50509050806116095760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b604482015260640161059a565b505b5050600101611512565b5050600601805460ff19166001179055565b60008060008360040180548060200260200160405190810160405280929190818152602001828054801561168457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611666575b5050505050905060005b81518110156116f0578460050160008383815181106116af576116af6119a0565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060010154836116e69190611a34565b925060010161168e565b50909392505050565b6001546001600160a01b03610100909104163314610d445760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161059a565b611761611840565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61180d611299565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583361178e565b60015460ff16610d445760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161059a565b60006020828403121561189b57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b600481106118d657634e487b7160e01b600052602160045260246000fd5b9052565b602081016118e882846118b8565b92915050565b602080825282518282018190526000918401906040840190835b818110156114ff5783516001600160a01b0316835260209384019390920191600101611908565b86815260c0810161194360208301886118b8565b6040820195909552606081019390935290151560808301526001600160a01b031660a09091015292915050565b60006020828403121561198257600080fd5b81356001600160a01b038116811461199957600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826119db576119db6119b6565b500690565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176118e8576118e86119e0565b600082611a1c57611a1c6119b6565b500490565b818103818111156118e8576118e86119e0565b808201808211156118e8576118e86119e0565b600060018201611a5957611a596119e0565b5060010190565b634e487b7160e01b600052604160045260246000fdfea2646970667358221220e6d0cca51186be28a9bca5e3d86bad95383e588508e05300e9df2471caa157d164736f6c634300081c0033
Deployed Bytecode
0x6080604052600436106101855760003560e01c8063715018a6116100d15780639ad9d5011161008a578063d8d97a8711610064578063d8d97a8714610475578063dd19171914610492578063f113ebcc146104a7578063f2fde38b146104bc57600080fd5b80639ad9d50114610449578063c54c40941461045f578063c988fb261461020257600080fd5b8063715018a6146103445780637bbc469e146103595780637c14a733146103cc5780638456cb59146103e957806385f07bbe146103fe5780638da5cb5b1461041357600080fd5b80633ffc6f9c1161013e5780635c975abb116101185780635c975abb146102e25780635e6a645e146103055780635ec775b01461031a5780636ad7ed471461032f57600080fd5b80633ffc6f9c1461028d5780634411b3eb146102a0578063460e2049146102b557600080fd5b80630116538f146101995780630413a0f0146101e25780630d3c15cc1461020257806311fa883f1461022557806321695796146102635780633f4ba83a1461027857600080fd5b36610194576101926104dc565b005b600080fd5b3480156101a557600080fd5b506101cc6101b4366004611889565b60009081526002602052604090206001015460ff1690565b6040516101d991906118da565b60405180910390f35b3480156101ee57600080fd5b506101926101fd366004611889565b610604565b34801561020e57600080fd5b50610217603c81565b6040519081526020016101d9565b34801561023157600080fd5b5060038054600090815260026020819052604090912090810154910154604080519283526020830191909152016101d9565b34801561026f57600080fd5b50610192610910565b34801561028457600080fd5b50610192610d46565b61019261029b366004611889565b610d56565b3480156102ac57600080fd5b50610217606481565b3480156102c157600080fd5b506102d56102d0366004611889565b610fc5565b6040516101d991906118ee565b3480156102ee57600080fd5b5060015460ff1660405190151581526020016101d9565b34801561031157600080fd5b50610217600a81565b34801561032657600080fd5b5061021760b481565b34801561033b57600080fd5b50610192611034565b34801561035057600080fd5b5061019261113a565b34801561036557600080fd5b506103ba610374366004611889565b600260208190526000918252604090912080546001820154928201546003830154600690930154919360ff9081169391929081169061010090046001600160a01b031686565b6040516101d99695949392919061192f565b3480156103d857600080fd5b506102176802b5e3af16b188000081565b3480156103f557600080fd5b5061019261114c565b34801561040a57600080fd5b50610217600281565b34801561041f57600080fd5b5060015461010090046001600160a01b03166040516001600160a01b0390911681526020016101d9565b34801561045557600080fd5b5061021760035481565b34801561046b57600080fd5b5061021760045481565b34801561048157600080fd5b50610217680340aad21b3b70000081565b34801561049e57600080fd5b5061019261115c565b3480156104b357600080fd5b50610217605a81565b3480156104c857600080fd5b506101926104d7366004611970565b611223565b47680340aad21b3b70000081106106015760015460405160009161010090046001600160a01b0316906802b5e3af16b1880000908381818185875af1925050503d8060008114610548576040519150601f19603f3d011682016040523d82523d6000602084013e61054d565b606091505b50509050806105a35760405162461bcd60e51b815260206004820152601b60248201527f5468726573686f6c6420646576207061796f7574206661696c6564000000000060448201526064015b60405180910390fd5b6001547fa495aa4e22929f551585a0efb54c850b026e190916d732bfe223a0dfa200ace89061010090046001600160a01b0316604080516001600160a01b0390921682526802b5e3af16b188000060208301520160405180910390a1505b50565b61060c611299565b6106146112df565b600354600090815260026020526040902060018082015460ff16600381111561063f5761063f6118a2565b148061066357506002600182015460ff166003811115610661576106616118a2565b145b61069d5760405162461bcd60e51b815260206004820152600b60248201526a57726f6e6720706861736560a81b604482015260640161059a565b80600201544210156106e65760405162461bcd60e51b815260206004820152601260248201527114995d99585b081b9bdd081cdd185c9d195960721b604482015260640161059a565b8060030154421061072e5760405162461bcd60e51b815260206004820152601260248201527114995d99585b081c1a185cd948195b99195960721b604482015260640161059a565b336000908152600582016020526040812080549091036107905760405162461bcd60e51b815260206004820152601760248201527f4e6f20636f6d6d697420666f756e6420666f7220796f75000000000000000000604482015260640161059a565b600381015460ff16156107d85760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c995d99585b195960821b604482015260640161059a565b6000833360405160200161080892919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b6040516020818303038152906040528051906020012090508160000154811461087e5760405162461bcd60e51b815260206004820152602260248201527f48617368206d69736d617463682e2057726f6e672073656564206f722073616c604482015261743f60f01b606482015260840161059a565b60038201805460ff1916600190811790915560028301859055600184015460ff1660038111156108b0576108b06118a2565b036108c55760018301805460ff191660021790555b600354604080519182526020820186905233917f2bbe56a3027f253b18c8114a268a2da090b2b0a82a15b630b5c7d6c0f26b8dfa910160405180910390a25050506106016001600055565b610918611299565b6109206112df565b6003546000908152600260205260409020600681015460ff16156109795760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c185a59081bdd5d60821b604482015260640161059a565b6002600182015460ff166003811115610994576109946118a2565b146109e15760405162461bcd60e51b815260206004820152601960248201527f52616365206e6f7420696e2072657665616c2073746174757300000000000000604482015260640161059a565b8060030154421015610a2e5760405162461bcd60e51b815260206004820152601660248201527514995d99585b081c1a185cd9481b9bdd08195b99195960521b604482015260640161059a565b60018101805460ff19166003179055426004556000610a4c82611338565b80519091506002811015610a6b57610a638361150a565b505050610d3a565b6000610a7684611627565b90506000805b8451811015610ad0576000858281518110610a9957610a996119a0565b6020908102919091018101516001600160a01b03166000908152600589019091526040902060020154929092189150600101610a7c565b5060408051602080820184905242828401524460608301526080820185905260a08083018790528351808403909101815260c090920190925280519101206000610b1a85836119cc565b90506000868281518110610b3057610b306119a0565b6020908102919091010151600689018054610100600160a81b0319166101006001600160a01b03841602179055905060006064610b6e600a886119f6565b610b789190611a0d565b90506000610b868288611a21565b90506000836001600160a01b03168260405160006040518083038185875af1925050503d8060008114610bd5576040519150601f19603f3d011682016040523d82523d6000602084013e610bda565b606091505b5050905080610c245760405162461bcd60e51b815260206004820152601660248201527515da5b9b995c881d1c985b9cd9995c8819985a5b195960521b604482015260640161059a565b60015460405160009161010090046001600160a01b03169085908381818185875af1925050503d8060008114610c76576040519150601f19603f3d011682016040523d82523d6000602084013e610c7b565b606091505b5050905080610ccc5760405162461bcd60e51b815260206004820152601760248201527f44657620666565207472616e73666572206661696c6564000000000000000000604482015260640161059a565b60068c01805460ff19166001179055600354604080519182526001600160a01b03871660208301528101849052606081018590527ff47e7176d5f194180e7eab0073b743f9280f029421bb13c6169e7f10c486feb99060800160405180910390a15050505050505050505050505b610d446001600055565b565b610d4e6116f9565b610d44611759565b610d5e611299565b610d666112df565b600354600090815260026020526040902060018082015460ff166003811115610d9157610d916118a2565b14610dd45760405162461bcd60e51b81526020600482015260136024820152724e6f7420696e20636f6d6d697420706861736560681b604482015260640161059a565b80600201544210610e1b5760405162461bcd60e51b815260206004820152601160248201527021b7b6b6b4ba10383430b9b29037bb32b960791b604482015260640161059a565b3360009081526005820160205260409020805415610e6f5760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e4818dbdb5b5a5d1d1959607a1b604482015260640161059a565b600034118015610e8e5750610e8c670de0b6b3a7640000346119cc565b155b610eda5760405162461bcd60e51b815260206004820152601b60248201527f4465706f736974206d7573742062652077686f6c6520536f6e69630000000000604482015260640161059a565b6004820154606411610f2e5760405162461bcd60e51b815260206004820152601760248201527f4d61782031303020706c61796572732072656163686564000000000000000000604482015260640161059a565b82815534600180830182905560048401805491820181556000908152602090200180546001600160a01b0319163390811790915560035460405191927ff0bd9919d7f10aebb53d46c6ca3adb0ea51aff0475d576154682adfed6f2da4492610fa9929188919283526020830191909152604082015260600190565b60405180910390a2610fb96104dc565b50506106016001600055565b60008181526002602090815260409182902060040180548351818402810184019094528084526060939283018282801561102857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161100a575b50505050509050919050565b61103c611299565b60b460045461104b9190611a34565b4210156110905760405162461bcd60e51b81526020600482015260136024820152722bb0b4ba101996b6b4b71031b7b7b63237bbb760691b604482015260640161059a565b600380549060006110a083611a47565b909155505060035460008181526002602052604090209081556001808201805460ff191690911790556110d4603c42611a34565b600282018190556110e790603c90611a34565b60038281018290555460028301546040805192835260208301919091528101919091527fc70247c5a48255c09f8dec14606e5fdba6c5a547468f3258b5c298d68d6b5cd09060600160405180910390a150565b6111426116f9565b610d4460006117ab565b6111546116f9565b610d44611805565b6111646116f9565b47600061117f6001546001600160a01b036101009091041690565b6001600160a01b03168260405160006040518083038185875af1925050503d80600081146111c9576040519150601f19603f3d011682016040523d82523d6000602084013e6111ce565b606091505b505090508061121f5760405162461bcd60e51b815260206004820152601960248201527f456d657267656e6379207769746864726177206661696c656400000000000000604482015260640161059a565b5050565b61122b6116f9565b6001600160a01b0381166112905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161059a565b610601816117ab565b60015460ff1615610d445760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161059a565b6002600054036113315760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161059a565b6002600055565b606060008260040180548060200260200160405190810160405280929190818152602001828054801561139457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611376575b50505050509050600080600090505b8251811015611409578460050160008483815181106113c4576113c46119a0565b6020908102919091018101516001600160a01b031682528101919091526040016000206003015460ff161561140157816113fd81611a47565b9250505b6001016113a3565b5060008167ffffffffffffffff81111561142557611425611a60565b60405190808252806020026020018201604052801561144e578160200160208202803683370190505b5090506000805b84518110156114ff57866005016000868381518110611476576114766119a0565b6020908102919091018101516001600160a01b031682528101919091526040016000206003015460ff16156114f7578481815181106114b7576114b76119a0565b60200260200101518383815181106114d1576114d16119a0565b6001600160a01b0390921660209283029190910190910152816114f381611a47565b9250505b600101611455565b509095945050505050565b600481015460005b81811015611615576000836004018281548110611531576115316119a0565b60009182526020808320909101546001600160a01b031680835260058701909152604090912060010154909150801561160b576001600160a01b03821660008181526005870160205260408082206001018290555190919083908381818185875af1925050503d80600081146115c3576040519150601f19603f3d011682016040523d82523d6000602084013e6115c8565b606091505b50509050806116095760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b604482015260640161059a565b505b5050600101611512565b5050600601805460ff19166001179055565b60008060008360040180548060200260200160405190810160405280929190818152602001828054801561168457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611666575b5050505050905060005b81518110156116f0578460050160008383815181106116af576116af6119a0565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060010154836116e69190611a34565b925060010161168e565b50909392505050565b6001546001600160a01b03610100909104163314610d445760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161059a565b611761611840565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61180d611299565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583361178e565b60015460ff16610d445760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161059a565b60006020828403121561189b57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b600481106118d657634e487b7160e01b600052602160045260246000fd5b9052565b602081016118e882846118b8565b92915050565b602080825282518282018190526000918401906040840190835b818110156114ff5783516001600160a01b0316835260209384019390920191600101611908565b86815260c0810161194360208301886118b8565b6040820195909552606081019390935290151560808301526001600160a01b031660a09091015292915050565b60006020828403121561198257600080fd5b81356001600160a01b038116811461199957600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6000826119db576119db6119b6565b500690565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176118e8576118e86119e0565b600082611a1c57611a1c6119b6565b500490565b818103818111156118e8576118e86119e0565b808201808211156118e8576118e86119e0565b600060018201611a5957611a596119e0565b5060010190565b634e487b7160e01b600052604160045260246000fdfea2646970667358221220e6d0cca51186be28a9bca5e3d86bad95383e588508e05300e9df2471caa157d164736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.