More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 149 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 13246736 | 5 mins ago | IN | 0 S | 0.00586329 | ||||
Deposit | 13243490 | 24 mins ago | IN | 0 S | 0.00654971 | ||||
Deposit | 13241982 | 35 mins ago | IN | 0 S | 0.00929276 | ||||
Deposit | 13241473 | 39 mins ago | IN | 0 S | 0.00341475 | ||||
Deposit | 13241466 | 39 mins ago | IN | 0 S | 0.00505716 | ||||
Withdraw | 13241451 | 39 mins ago | IN | 0 S | 0.0068483 | ||||
Deposit | 13241429 | 39 mins ago | IN | 0 S | 0.0034119 | ||||
Withdraw | 13241401 | 39 mins ago | IN | 0 S | 0.006849 | ||||
Deposit | 13241358 | 40 mins ago | IN | 0 S | 0.00341141 | ||||
Withdraw | 13241340 | 40 mins ago | IN | 0 S | 0.008555 | ||||
Deposit | 13241008 | 41 mins ago | IN | 0 S | 0.00721266 | ||||
Harvest All Rewa... | 13240859 | 42 mins ago | IN | 0 S | 0.02554048 | ||||
Withdraw | 13240628 | 44 mins ago | IN | 0 S | 0.00674901 | ||||
Withdraw | 13240568 | 44 mins ago | IN | 0 S | 0.00675011 | ||||
Deposit | 13240488 | 45 mins ago | IN | 0 S | 0.00593851 | ||||
Deposit | 13240445 | 45 mins ago | IN | 0 S | 0.00593966 | ||||
Withdraw | 13240417 | 45 mins ago | IN | 0 S | 0.00991846 | ||||
Harvest All Rewa... | 13240381 | 45 mins ago | IN | 0 S | 0.01225783 | ||||
Deposit | 13240207 | 46 mins ago | IN | 0 S | 0.00954966 | ||||
Set Pool Allocat... | 13240169 | 47 mins ago | IN | 0 S | 0.01354782 | ||||
Set Pool Allocat... | 13240149 | 47 mins ago | IN | 0 S | 0.01354782 | ||||
Deposit | 13239905 | 48 mins ago | IN | 0 S | 0.00593966 | ||||
Withdraw | 13239881 | 49 mins ago | IN | 0 S | 0.00898349 | ||||
Deposit | 13239798 | 49 mins ago | IN | 0 S | 0.00593851 | ||||
Withdraw | 13239701 | 50 mins ago | IN | 0 S | 0.01036167 |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
GenesisRewardsPool
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.28; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; // Note that this pool has no minter key. contract GenesisRewardsPool is ReentrancyGuard { using SafeERC20 for IERC20; // governance address public operator; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IERC20 token; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. fHOGs to distribute in the pool. uint256 lastRewardTime; // Last time that fHOGs distribution occurred. uint256 accRewardPerShare; // Accumulated fHOGs per share, times 1e18. See below. bool isStarted; // if lastRewardTime has passed } IERC20 public fogHOG; IERC20 public fogSNAKE; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 private _totalAllocPoint; // The time when fogHOG mining starts. uint256 public poolStartTime; uint256 public poolEndTime; uint256 public poolRewardDuration; uint256 public totalFHogReward; uint256 public rewardPerSecond; uint256 private constant REWARD_RATE_DENOMINATION = 10000; uint256 public constant REWARD_RATE_FSNAKE = 15000; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); event RewardPaid(address indexed user, uint256 fogHogAmt, uint256 fogSnakeAmt); constructor(address _fogHOG, address _fogSNAKE, uint256 _poolStartTime) { require(block.timestamp < _poolStartTime, "late"); fogHOG = IERC20(_fogHOG); fogSNAKE = IERC20(_fogSNAKE); poolRewardDuration = 7 days; totalFHogReward = 70000 gwei; // 70K fogHOG (decimals 9) rewardPerSecond = totalFHogReward / poolRewardDuration; // e.g. 0.11574074074 fogHOG/second poolStartTime = _poolStartTime; poolEndTime = _poolStartTime + poolRewardDuration; operator = msg.sender; } modifier onlyOperator() { require(operator == msg.sender, "GenesisRewardPool: caller is not the operator"); _; } function reward() external view returns (address) { return address(fogHOG); } function multiRewardLength() external pure returns (uint256) { return 2; } function multiRewards() external view returns (address[] memory _rewards) { _rewards = new address[](2); _rewards[0] = address(fogHOG); _rewards[1] = address(fogSNAKE); } function totalAllocPoint() external view returns (uint256) { return _totalAllocPoint; } function poolLength() external view returns (uint256) { return poolInfo.length; } function getPoolInfo(uint256 _pid) external view returns (address _lp, uint256 _allocPoint) { PoolInfo memory pool = poolInfo[_pid]; _lp = address(pool.token); _allocPoint = pool.allocPoint; } // HOG reward per second function getRewardPerSecond() public view returns (uint256) { return (block.timestamp <= poolStartTime || block.timestamp > poolEndTime) ? 0 : rewardPerSecond; } function getMultiRewardPerSecond() external view returns (uint256[] memory _rewardPerSecondArr) { _rewardPerSecondArr = new uint256[](2); _rewardPerSecondArr[0] = getRewardPerSecond(); _rewardPerSecondArr[1] = _rewardPerSecondArr[0] * REWARD_RATE_FSNAKE / REWARD_RATE_DENOMINATION; } function checkPoolDuplicate(IERC20 _token) internal view { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { require(poolInfo[pid].token != _token, "rewardPool: existing pool?"); } } // Add a new token to the pool. Can only be called by the owner. function add(uint256 _allocPoint, IERC20 _token, uint256 _lastRewardTime) public onlyOperator { checkPoolDuplicate(_token); massUpdatePools(); if (block.timestamp < poolStartTime) { // chef is sleeping if (_lastRewardTime < poolStartTime) { _lastRewardTime = poolStartTime; } } else { // chef is cooking if (_lastRewardTime == 0 || _lastRewardTime < block.timestamp) { _lastRewardTime = block.timestamp; } } bool _isStarted = (_lastRewardTime <= poolStartTime) || (_lastRewardTime <= block.timestamp); poolInfo.push(PoolInfo({token: _token, allocPoint: _allocPoint, lastRewardTime: _lastRewardTime, accRewardPerShare: 0, isStarted: _isStarted})); if (_isStarted) { _totalAllocPoint += _allocPoint; } } // Update the given pool's fogHOG allocation point. Can only be called by the owner. function setPoolAllocation(uint256 _pid, uint256 _allocPoint) public onlyOperator { massUpdatePools(); PoolInfo storage pool = poolInfo[_pid]; if (pool.isStarted) { _totalAllocPoint = _totalAllocPoint - pool.allocPoint + _allocPoint; } pool.allocPoint = _allocPoint; } // Return accumulate rewards over the given _fromTime to _toTime. function getGeneratedReward(uint256 _fromTime, uint256 _toTime) public view returns (uint256) { if (_toTime <= poolStartTime || _fromTime >= poolEndTime) return 0; if (_toTime > poolEndTime) _toTime = poolEndTime; if (_fromTime < poolStartTime) _fromTime = poolStartTime; return (_toTime - _fromTime) * rewardPerSecond; } function pendingReward(uint256 _pid, address _user) public view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accRewardPerShare = pool.accRewardPerShare; uint256 tokenSupply = pool.token.balanceOf(address(this)); if (block.timestamp > pool.lastRewardTime && tokenSupply != 0) { uint256 _generatedReward = getGeneratedReward(pool.lastRewardTime, block.timestamp); uint256 _fogSNAKEReward = _generatedReward * pool.allocPoint / _totalAllocPoint; accRewardPerShare += (_fogSNAKEReward * 1e18 / tokenSupply); } return (user.amount * accRewardPerShare / 1e18) - user.rewardDebt; } function pendingMultiRewards(uint256 _pid, address _user) public view returns (uint256[] memory _pendingMultiRewardArr) { uint256 _fogSNAKEReward = pendingReward(_pid, _user); _pendingMultiRewardArr = new uint256[](2); _pendingMultiRewardArr[0] = _fogSNAKEReward; _pendingMultiRewardArr[1] = _fogSNAKEReward * REWARD_RATE_FSNAKE / REWARD_RATE_DENOMINATION; } function pendingAllRewards(address _user) public view returns (uint256 _total) { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { _total = _total + pendingReward(pid, _user); } } function pendingAllMultiRewards(address _user) external view returns (uint256[] memory _totalMultiRewardArr) { uint256 _fogSNAKETotalReward = pendingAllRewards(_user); _totalMultiRewardArr = new uint256[](2); _totalMultiRewardArr[0] = _fogSNAKETotalReward; _totalMultiRewardArr[1] = _fogSNAKETotalReward * REWARD_RATE_FSNAKE / REWARD_RATE_DENOMINATION; } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTime) { return; } uint256 tokenSupply = pool.token.balanceOf(address(this)); if (tokenSupply == 0) { pool.lastRewardTime = block.timestamp; return; } if (!pool.isStarted) { pool.isStarted = true; _totalAllocPoint += pool.allocPoint; } if (_totalAllocPoint > 0) { uint256 _generatedReward = getGeneratedReward(pool.lastRewardTime, block.timestamp); uint256 _fogSNAKEReward = (_generatedReward * pool.allocPoint) / _totalAllocPoint; pool.accRewardPerShare += (_fogSNAKEReward * 1e18 / tokenSupply); } pool.lastRewardTime = block.timestamp; } // Deposit LP tokens. function deposit(uint256 _pid, uint256 _amount) external nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { uint256 _pending = (user.amount * pool.accRewardPerShare / 1e18) - user.rewardDebt; if (_pending > 0) { _claimReward(msg.sender, _pending); } } if (_amount > 0) { pool.token.safeTransferFrom(msg.sender, address(this), _amount); user.amount += _amount; } user.rewardDebt = (user.amount * pool.accRewardPerShare) / 1e18; emit Deposit(msg.sender, _pid, _amount); } function withdraw(uint256 _pid, uint256 _amount) external nonReentrant { _withdraw(msg.sender, _pid, _amount); } // Withdraw LP tokens. function _withdraw(address _account, uint256 _pid, uint256 _amount) internal { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_account]; require(user.amount >= _amount, "withdraw: not good"); updatePool(_pid); uint256 _pending = (user.amount * pool.accRewardPerShare / 1e18) - user.rewardDebt; if (_pending > 0) { _claimReward(_account, _pending); } if (_amount > 0) { user.amount -= _amount; pool.token.safeTransfer(_account, _amount); } user.rewardDebt = user.amount * pool.accRewardPerShare / 1e18; emit Withdraw(_account, _pid, _amount); } function withdrawAll(uint256 _pid) external nonReentrant { _withdraw(msg.sender, _pid, userInfo[_pid][msg.sender].amount); } function harvestAllRewards() external nonReentrant { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { if (userInfo[pid][msg.sender].amount > 0) { _withdraw(msg.sender, pid, 0); } } } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 _amount = user.amount; user.amount = 0; user.rewardDebt = 0; pool.token.safeTransfer(msg.sender, _amount); emit EmergencyWithdraw(msg.sender, _pid, _amount); } function _claimReward(address _account, uint256 _fogHogAmt) internal { uint256 _fogSnakeAmt = _fogHogAmt * REWARD_RATE_FSNAKE / REWARD_RATE_DENOMINATION; _safeTokenTransfer(fogHOG, _account, _fogHogAmt); _safeTokenTransfer(fogSNAKE, _account, _fogSnakeAmt); emit RewardPaid(_account, _fogHogAmt, _fogSnakeAmt); } // Safe fogHOG transfer function, just in case if rounding error causes pool to not have enough fHOGs. function _safeTokenTransfer(IERC20 _token, address _to, uint256 _amount) internal { uint256 _tokenBal = _token.balanceOf(address(this)); if (_tokenBal > 0) { if (_amount > _tokenBal) { _token.safeTransfer(_to, _tokenBal); } else { _token.safeTransfer(_to, _amount); } } } function setOperator(address _operator) external onlyOperator { operator = _operator; } function governanceRecoverUnsupported(IERC20 _token, uint256 amount, address to) external onlyOperator { if (block.timestamp < poolEndTime + 30 days) { // do not allow to drain token if less than 30 days after farming ends. require(_token != fogSNAKE && _token != fogHOG, "reward"); uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { PoolInfo storage pool = poolInfo[pid]; require(_token != pool.token, "!pool.token"); } } _token.safeTransfer(to, amount); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @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 EIP-1153 (transient storage) is available on the chain you're deploying at, * consider using {ReentrancyGuardTransient} instead. * * 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; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); 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 if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // 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 v5.2.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC1363} from "../../../interfaces/IERC1363.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC-20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { /** * @dev An operation with an ERC-20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. * * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being * set here. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { safeTransfer(token, to, value); } else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferFromAndCallRelaxed( IERC1363 token, address from, address to, uint256 value, bytes memory data ) internal { if (to.code.length == 0) { safeTransferFrom(token, from, to, value); } else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}. * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall} * once without retrying, and relies on the returned value to be true. * * Reverts if the returned value is other than `true`. */ function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { forceApprove(token, to, value); } else if (!token.approveAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements. */ function _callOptionalReturn(IERC20 token, bytes memory data) private { uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) // bubble errors if iszero(success) { let ptr := mload(0x40) returndatacopy(ptr, 0, returndatasize()) revert(ptr, returndatasize()) } returnSize := returndatasize() returnValue := mload(0) } if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { bool success; uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) returnSize := returndatasize() returnValue := mload(0) } return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol) pragma solidity ^0.8.20; import {IERC20} from "./IERC20.sol"; import {IERC165} from "./IERC165.sol"; /** * @title IERC1363 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. * * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction. */ interface IERC1363 is IERC20, IERC165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @param data Additional data with no specified format, sent in call to `spender`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "../utils/introspection/IERC165.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../token/ERC20/IERC20.sol";
// 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); }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "remappings": [] }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_fogHOG","type":"address"},{"internalType":"address","name":"_fogSNAKE","type":"address"},{"internalType":"uint256","name":"_poolStartTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"fogHogAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fogSnakeAmt","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"REWARD_RATE_FSNAKE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_lastRewardTime","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fogHOG","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fogSNAKE","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromTime","type":"uint256"},{"internalType":"uint256","name":"_toTime","type":"uint256"}],"name":"getGeneratedReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMultiRewardPerSecond","outputs":[{"internalType":"uint256[]","name":"_rewardPerSecondArr","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolInfo","outputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestAllRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"multiRewardLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"multiRewards","outputs":[{"internalType":"address[]","name":"_rewards","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingAllMultiRewards","outputs":[{"internalType":"uint256[]","name":"_totalMultiRewardArr","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingAllRewards","outputs":[{"internalType":"uint256","name":"_total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingMultiRewards","outputs":[{"internalType":"uint256[]","name":"_pendingMultiRewardArr","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"bool","name":"isStarted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolRewardDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"setPoolAllocation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFHogReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f5ffd5b5060405161207838038061207883398101604081905261002e9161010f565b60015f554281116100735760405162461bcd60e51b815260040161006a906020808252600490820152636c61746560e01b604082015260600190565b60405180910390fd5b600280546001600160a01b038086166001600160a01b031992831617909255600380549285169290911691909117905562093a806009819055653faa25226000600a8190556100c29190610148565b600b5560078190556009546100d79082610167565b6008555050600180546001600160a01b031916331790555061018c565b80516001600160a01b038116811461010a575f5ffd5b919050565b5f5f5f60608486031215610121575f5ffd5b61012a846100f4565b9250610138602085016100f4565b9150604084015190509250925092565b5f8261016257634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111561018657634e487b7160e01b5f52601160045260245ffd5b92915050565b611edf806101995f395ff3fe608060405234801561000f575f5ffd5b5060043610610235575f3560e01c806367a7232b1161013d578063b9955e39116100b8578063e2bbb15811610088578063e4c26d961161006e578063e4c26d9614610539578063f72e7bda14610541578063fcc052ba14610548575f5ffd5b8063e2bbb15814610513578063e2bff2b714610526575f5ffd5b8063b9955e39146104cf578063c6a57fc6146104e2578063c9cc8bed14610502578063da5b4ee71461050b575f5ffd5b806393f1a40b1161010d57806398969e82116100f357806398969e8214610496578063ad0f2a85146104a9578063b3ab15fb146104bc575f5ffd5b806393f1a40b1461043d578063958e2d3114610483575f5ffd5b806367a7232b1461040f5780636e271dd5146104185780638e09136f146104215780638f10369a14610434575f5ffd5b8063433efbc6116101cd5780635312ea8e1161019d578063570ca73511610183578063570ca735146103de5780635f96dc11146103fe578063630b5ba114610407575f5ffd5b80635312ea8e146103b857806354575af4146103cb575f5ffd5b8063433efbc614610372578063441a3e7014610387578063504a04001461039c57806351eb05a6146103a5575f5ffd5b8063228cb73311610208578063228cb733146102c1578063231f0c6a146103005780632f380b351461031357806341811c0814610352575f5ffd5b8063081e3eda146102395780631526fe271461025057806317caf6f1146102a45780631f9c175e146102ac575b5f5ffd5b6004545b6040519081526020015b60405180910390f35b61026361025e366004611c18565b61055b565b6040805173ffffffffffffffffffffffffffffffffffffffff909616865260208601949094529284019190915260608301521515608082015260a001610247565b60065461023d565b6102b46105b4565b6040516102479190611c2f565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610247565b61023d61030e366004611c71565b610650565b610326610321366004611c18565b6106b0565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610247565b6002546102db9073ffffffffffffffffffffffffffffffffffffffff1681565b61037a61073a565b6040516102479190611c91565b61039a610395366004611c71565b610801565b005b61023d600a5481565b61039a6103b3366004611c18565b610821565b61039a6103c6366004611c18565b6109c6565b61039a6103d9366004611cff565b610a70565b6001546102db9073ffffffffffffffffffffffffffffffffffffffff1681565b61023d60075481565b61039a610cc8565b61023d60095481565b61023d60085481565b61023d61042f366004611d3e565b610ce6565b61023d600b5481565b61046e61044b366004611d60565b600560209081525f92835260408084209091529082529020805460019091015482565b60408051928352602083019190915201610247565b61039a610491366004611c18565b610d1a565b61023d6104a4366004611d60565b610d54565b61039a6104b7366004611c71565b610edb565b61039a6104ca366004611d3e565b610fe5565b61039a6104dd366004611d8e565b6110d3565b6003546102db9073ffffffffffffffffffffffffffffffffffffffff1681565b61023d613a9881565b61023d611360565b61039a610521366004611c71565b611383565b6102b4610534366004611d60565b6114cd565b61039a61155a565b600261023d565b6102b4610556366004611d3e565b6115ad565b6004818154811061056a575f80fd5b5f9182526020909120600590910201805460018201546002830154600384015460049094015473ffffffffffffffffffffffffffffffffffffffff90931694509092909160ff1685565b60408051600280825260608083018452926020830190803683370190505090506105dc611360565b815f815181106105ee576105ee611dc3565b602002602001018181525050612710613a98825f8151811061061257610612611dc3565b60200260200101516106249190611e1d565b61062e9190611e34565b8160018151811061064157610641611dc3565b60200260200101818152505090565b5f6007548211158061066457506008548310155b1561067057505f6106aa565b6008548211156106805760085491505b6007548310156106905760075492505b600b5461069d8484611e6c565b6106a79190611e1d565b90505b92915050565b5f5f5f600484815481106106c6576106c6611dc3565b5f9182526020918290206040805160a0810182526005909302909101805473ffffffffffffffffffffffffffffffffffffffff168084526001820154948401859052600282015492840192909252600381015460608401526004015460ff1615156080909201919091529590945092505050565b60408051600280825260608083018452926020830190803683375050600254825192935073ffffffffffffffffffffffffffffffffffffffff16918391505f9061078657610786611dc3565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526003548251911690829060019081106107c4576107c4611dc3565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b610809611638565b610814338383611679565b61081d60015f55565b5050565b5f6004828154811061083557610835611dc3565b905f5260205f209060050201905080600201544211610852575050565b80546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156108bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108e19190611e7f565b9050805f036108f557504260029091015550565b600482015460ff1661094b576004820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155820154600680545f90610945908490611e96565b90915550505b600654156109bb575f610962836002015442610650565b90505f6006548460010154836109789190611e1d565b6109829190611e34565b90508261099782670de0b6b3a7640000611e1d565b6109a19190611e34565b846003015f8282546109b39190611e96565b909155505050505b504260029091015550565b5f600482815481106109da576109da611dc3565b5f9182526020808320858452600580835260408086203380885294528520805486825560018201969096559302018054909450919291610a339173ffffffffffffffffffffffffffffffffffffffff9091169083611846565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a350505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f47656e65736973526577617264506f6f6c3a2063616c6c6572206973206e6f7460448201527f20746865206f70657261746f720000000000000000000000000000000000000060648201526084015b60405180910390fd5b600854610b2c9062278d00611e96565b421015610ca25760035473ffffffffffffffffffffffffffffffffffffffff848116911614801590610b79575060025473ffffffffffffffffffffffffffffffffffffffff848116911614155b610bdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f72657761726400000000000000000000000000000000000000000000000000006044820152606401610b13565b6004545f5b81811015610c9f575f60048281548110610c0057610c00611dc3565b5f9182526020909120600590910201805490915073ffffffffffffffffffffffffffffffffffffffff90811690871603610c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f21706f6f6c2e746f6b656e0000000000000000000000000000000000000000006044820152606401610b13565b50600101610be4565b50505b610cc373ffffffffffffffffffffffffffffffffffffffff84168284611846565b505050565b6004545f5b8181101561081d57610cde81610821565b600101610ccd565b6004545f90815b81811015610d1357610cff8185610d54565b610d099084611e96565b9250600101610ced565b5050919050565b610d22611638565b5f81815260056020908152604080832033808552925290912054610d4891908390611679565b610d5160015f55565b50565b5f5f60048481548110610d6957610d69611dc3565b5f91825260208083208784526005808352604080862073ffffffffffffffffffffffffffffffffffffffff8a811688529452808620949091029091016003810154815492517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291965093949291909116906370a0823190602401602060405180830381865afa158015610e06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2a9190611e7f565b9050836002015442118015610e3e57508015155b15610ea0575f610e52856002015442610650565b90505f600654866001015483610e689190611e1d565b610e729190611e34565b905082610e8782670de0b6b3a7640000611e1d565b610e919190611e34565b610e9b9085611e96565b935050505b60018301548354670de0b6b3a764000090610ebc908590611e1d565b610ec69190611e34565b610ed09190611e6c565b979650505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f47656e65736973526577617264506f6f6c3a2063616c6c6572206973206e6f7460448201527f20746865206f70657261746f72000000000000000000000000000000000000006064820152608401610b13565b610f8a610cc8565b5f60048381548110610f9e57610f9e611dc3565b5f9182526020909120600590910201600481015490915060ff1615610fde57818160010154600654610fd09190611e6c565b610fda9190611e96565b6006555b6001015550565b60015473ffffffffffffffffffffffffffffffffffffffff16331461108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f47656e65736973526577617264506f6f6c3a2063616c6c6572206973206e6f7460448201527f20746865206f70657261746f72000000000000000000000000000000000000006064820152608401610b13565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff16331461117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f47656e65736973526577617264506f6f6c3a2063616c6c6572206973206e6f7460448201527f20746865206f70657261746f72000000000000000000000000000000000000006064820152608401610b13565b611183826118c7565b61118b610cc8565b6007544210156111a9576007548110156111a457506007545b6111bd565b8015806111b557504281105b156111bd5750425b5f600754821115806111cf5750428211155b6040805160a08101825273ffffffffffffffffffffffffffffffffffffffff8681168252602082018881529282018681525f60608401818152861580156080870190815260048054600181018255945295517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b600590940293840180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919096161790945594517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c82015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d82015592517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e84015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f90920180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169215159290921790915590915061135a578360065f8282546113549190611e96565b90915550505b50505050565b5f60075442111580611373575060085442115b61137e5750600b5490565b505f90565b61138b611638565b5f6004838154811061139f5761139f611dc3565b5f91825260208083208684526005808352604080862033875290935291909320910290910191506113cf84610821565b805415611420575f8160010154670de0b6b3a76400008460030154845f01546113f89190611e1d565b6114029190611e34565b61140c9190611e6c565b9050801561141e5761141e3382611993565b505b821561146257815461144a9073ffffffffffffffffffffffffffffffffffffffff16333086611a4e565b82815f015f82825461145c9190611e96565b90915550505b60038201548154670de0b6b3a76400009161147c91611e1d565b6114869190611e34565b6001820155604051838152849033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a3505061081d60015f55565b60605f6114da8484610d54565b604080516002808252606082018352929350919060208301908036833701905050915080825f8151811061151057611510611dc3565b602090810291909101015261271061152a613a9883611e1d565b6115349190611e34565b8260018151811061154757611547611dc3565b6020026020010181815250505092915050565b611562611638565b6004545f5b818110156115a0575f818152600560209081526040808320338452909152902054156115985761159833825f611679565b600101611567565b50506115ab60015f55565b565b60605f6115b983610ce6565b604080516002808252606082018352929350919060208301908036833701905050915080825f815181106115ef576115ef611dc3565b6020908102919091010152612710611609613a9883611e1d565b6116139190611e34565b8260018151811061162657611626611dc3565b60200260200101818152505050919050565b60025f5403611673576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b5f6004838154811061168d5761168d611dc3565b5f91825260208083208684526005808352604080862073ffffffffffffffffffffffffffffffffffffffff8b168752909352919093208054929091029092019250831115611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f77697468647261773a206e6f7420676f6f6400000000000000000000000000006044820152606401610b13565b61174084610821565b5f8160010154670de0b6b3a76400008460030154845f01546117629190611e1d565b61176c9190611e34565b6117769190611e6c565b90508015611788576117888682611993565b83156117c85783825f015f8282546117a09190611e6c565b909155505082546117c89073ffffffffffffffffffffffffffffffffffffffff168786611846565b60038301548254670de0b6b3a7640000916117e291611e1d565b6117ec9190611e34565b6001830155604051848152859073ffffffffffffffffffffffffffffffffffffffff8816907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff838116602483015260448201839052610cc391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611a94565b6004545f5b81811015610cc3578273ffffffffffffffffffffffffffffffffffffffff16600482815481106118fe576118fe611dc3565b5f91825260209091206005909102015473ffffffffffffffffffffffffffffffffffffffff160361198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f726577617264506f6f6c3a206578697374696e6720706f6f6c3f0000000000006044820152606401610b13565b6001016118cc565b5f6127106119a3613a9884611e1d565b6119ad9190611e34565b6002549091506119d49073ffffffffffffffffffffffffffffffffffffffff168484611b33565b6003546119f89073ffffffffffffffffffffffffffffffffffffffff168483611b33565b604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8516917fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f51910160405180910390a2505050565b60405173ffffffffffffffffffffffffffffffffffffffff848116602483015283811660448301526064820183905261135a9186918216906323b872dd90608401611880565b5f5f60205f8451602086015f885af180611ab3576040513d5f823e3d81fd5b50505f513d91508115611aca578060011415611ae4565b73ffffffffffffffffffffffffffffffffffffffff84163b155b1561135a576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610b13565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015611b9d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc19190611e7f565b9050801561135a5780821115611bf757611bf273ffffffffffffffffffffffffffffffffffffffff85168483611846565b61135a565b61135a73ffffffffffffffffffffffffffffffffffffffff85168484611846565b5f60208284031215611c28575f5ffd5b5035919050565b602080825282518282018190525f918401906040840190835b81811015611c66578351835260209384019390920191600101611c48565b509095945050505050565b5f5f60408385031215611c82575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b81811015611c6657835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101611caa565b73ffffffffffffffffffffffffffffffffffffffff81168114610d51575f5ffd5b5f5f5f60608486031215611d11575f5ffd5b8335611d1c81611cde565b9250602084013591506040840135611d3381611cde565b809150509250925092565b5f60208284031215611d4e575f5ffd5b8135611d5981611cde565b9392505050565b5f5f60408385031215611d71575f5ffd5b823591506020830135611d8381611cde565b809150509250929050565b5f5f5f60608486031215611da0575f5ffd5b833592506020840135611db281611cde565b929592945050506040919091013590565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176106aa576106aa611df0565b5f82611e67577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b818103818111156106aa576106aa611df0565b5f60208284031215611e8f575f5ffd5b5051919050565b808201808211156106aa576106aa611df056fea2646970667358221220d086c686d5b9567311aab2065606a2fb0d65543d0ba6001a4fe40d9c835fec3764736f6c634300081c0033000000000000000000000000afde634d6f38fc59cf94fb9e24a91e31ee6aa5e000000000000000000000000011f5cd8ae75c2f498de4b874058c489ae473e4880000000000000000000000000000000000000000000000000000000067d17740
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610235575f3560e01c806367a7232b1161013d578063b9955e39116100b8578063e2bbb15811610088578063e4c26d961161006e578063e4c26d9614610539578063f72e7bda14610541578063fcc052ba14610548575f5ffd5b8063e2bbb15814610513578063e2bff2b714610526575f5ffd5b8063b9955e39146104cf578063c6a57fc6146104e2578063c9cc8bed14610502578063da5b4ee71461050b575f5ffd5b806393f1a40b1161010d57806398969e82116100f357806398969e8214610496578063ad0f2a85146104a9578063b3ab15fb146104bc575f5ffd5b806393f1a40b1461043d578063958e2d3114610483575f5ffd5b806367a7232b1461040f5780636e271dd5146104185780638e09136f146104215780638f10369a14610434575f5ffd5b8063433efbc6116101cd5780635312ea8e1161019d578063570ca73511610183578063570ca735146103de5780635f96dc11146103fe578063630b5ba114610407575f5ffd5b80635312ea8e146103b857806354575af4146103cb575f5ffd5b8063433efbc614610372578063441a3e7014610387578063504a04001461039c57806351eb05a6146103a5575f5ffd5b8063228cb73311610208578063228cb733146102c1578063231f0c6a146103005780632f380b351461031357806341811c0814610352575f5ffd5b8063081e3eda146102395780631526fe271461025057806317caf6f1146102a45780631f9c175e146102ac575b5f5ffd5b6004545b6040519081526020015b60405180910390f35b61026361025e366004611c18565b61055b565b6040805173ffffffffffffffffffffffffffffffffffffffff909616865260208601949094529284019190915260608301521515608082015260a001610247565b60065461023d565b6102b46105b4565b6040516102479190611c2f565b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610247565b61023d61030e366004611c71565b610650565b610326610321366004611c18565b6106b0565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610247565b6002546102db9073ffffffffffffffffffffffffffffffffffffffff1681565b61037a61073a565b6040516102479190611c91565b61039a610395366004611c71565b610801565b005b61023d600a5481565b61039a6103b3366004611c18565b610821565b61039a6103c6366004611c18565b6109c6565b61039a6103d9366004611cff565b610a70565b6001546102db9073ffffffffffffffffffffffffffffffffffffffff1681565b61023d60075481565b61039a610cc8565b61023d60095481565b61023d60085481565b61023d61042f366004611d3e565b610ce6565b61023d600b5481565b61046e61044b366004611d60565b600560209081525f92835260408084209091529082529020805460019091015482565b60408051928352602083019190915201610247565b61039a610491366004611c18565b610d1a565b61023d6104a4366004611d60565b610d54565b61039a6104b7366004611c71565b610edb565b61039a6104ca366004611d3e565b610fe5565b61039a6104dd366004611d8e565b6110d3565b6003546102db9073ffffffffffffffffffffffffffffffffffffffff1681565b61023d613a9881565b61023d611360565b61039a610521366004611c71565b611383565b6102b4610534366004611d60565b6114cd565b61039a61155a565b600261023d565b6102b4610556366004611d3e565b6115ad565b6004818154811061056a575f80fd5b5f9182526020909120600590910201805460018201546002830154600384015460049094015473ffffffffffffffffffffffffffffffffffffffff90931694509092909160ff1685565b60408051600280825260608083018452926020830190803683370190505090506105dc611360565b815f815181106105ee576105ee611dc3565b602002602001018181525050612710613a98825f8151811061061257610612611dc3565b60200260200101516106249190611e1d565b61062e9190611e34565b8160018151811061064157610641611dc3565b60200260200101818152505090565b5f6007548211158061066457506008548310155b1561067057505f6106aa565b6008548211156106805760085491505b6007548310156106905760075492505b600b5461069d8484611e6c565b6106a79190611e1d565b90505b92915050565b5f5f5f600484815481106106c6576106c6611dc3565b5f9182526020918290206040805160a0810182526005909302909101805473ffffffffffffffffffffffffffffffffffffffff168084526001820154948401859052600282015492840192909252600381015460608401526004015460ff1615156080909201919091529590945092505050565b60408051600280825260608083018452926020830190803683375050600254825192935073ffffffffffffffffffffffffffffffffffffffff16918391505f9061078657610786611dc3565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526003548251911690829060019081106107c4576107c4611dc3565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b610809611638565b610814338383611679565b61081d60015f55565b5050565b5f6004828154811061083557610835611dc3565b905f5260205f209060050201905080600201544211610852575050565b80546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156108bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108e19190611e7f565b9050805f036108f557504260029091015550565b600482015460ff1661094b576004820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155820154600680545f90610945908490611e96565b90915550505b600654156109bb575f610962836002015442610650565b90505f6006548460010154836109789190611e1d565b6109829190611e34565b90508261099782670de0b6b3a7640000611e1d565b6109a19190611e34565b846003015f8282546109b39190611e96565b909155505050505b504260029091015550565b5f600482815481106109da576109da611dc3565b5f9182526020808320858452600580835260408086203380885294528520805486825560018201969096559302018054909450919291610a339173ffffffffffffffffffffffffffffffffffffffff9091169083611846565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a350505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f47656e65736973526577617264506f6f6c3a2063616c6c6572206973206e6f7460448201527f20746865206f70657261746f720000000000000000000000000000000000000060648201526084015b60405180910390fd5b600854610b2c9062278d00611e96565b421015610ca25760035473ffffffffffffffffffffffffffffffffffffffff848116911614801590610b79575060025473ffffffffffffffffffffffffffffffffffffffff848116911614155b610bdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f72657761726400000000000000000000000000000000000000000000000000006044820152606401610b13565b6004545f5b81811015610c9f575f60048281548110610c0057610c00611dc3565b5f9182526020909120600590910201805490915073ffffffffffffffffffffffffffffffffffffffff90811690871603610c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f21706f6f6c2e746f6b656e0000000000000000000000000000000000000000006044820152606401610b13565b50600101610be4565b50505b610cc373ffffffffffffffffffffffffffffffffffffffff84168284611846565b505050565b6004545f5b8181101561081d57610cde81610821565b600101610ccd565b6004545f90815b81811015610d1357610cff8185610d54565b610d099084611e96565b9250600101610ced565b5050919050565b610d22611638565b5f81815260056020908152604080832033808552925290912054610d4891908390611679565b610d5160015f55565b50565b5f5f60048481548110610d6957610d69611dc3565b5f91825260208083208784526005808352604080862073ffffffffffffffffffffffffffffffffffffffff8a811688529452808620949091029091016003810154815492517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291965093949291909116906370a0823190602401602060405180830381865afa158015610e06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2a9190611e7f565b9050836002015442118015610e3e57508015155b15610ea0575f610e52856002015442610650565b90505f600654866001015483610e689190611e1d565b610e729190611e34565b905082610e8782670de0b6b3a7640000611e1d565b610e919190611e34565b610e9b9085611e96565b935050505b60018301548354670de0b6b3a764000090610ebc908590611e1d565b610ec69190611e34565b610ed09190611e6c565b979650505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f47656e65736973526577617264506f6f6c3a2063616c6c6572206973206e6f7460448201527f20746865206f70657261746f72000000000000000000000000000000000000006064820152608401610b13565b610f8a610cc8565b5f60048381548110610f9e57610f9e611dc3565b5f9182526020909120600590910201600481015490915060ff1615610fde57818160010154600654610fd09190611e6c565b610fda9190611e96565b6006555b6001015550565b60015473ffffffffffffffffffffffffffffffffffffffff16331461108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f47656e65736973526577617264506f6f6c3a2063616c6c6572206973206e6f7460448201527f20746865206f70657261746f72000000000000000000000000000000000000006064820152608401610b13565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff16331461117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f47656e65736973526577617264506f6f6c3a2063616c6c6572206973206e6f7460448201527f20746865206f70657261746f72000000000000000000000000000000000000006064820152608401610b13565b611183826118c7565b61118b610cc8565b6007544210156111a9576007548110156111a457506007545b6111bd565b8015806111b557504281105b156111bd5750425b5f600754821115806111cf5750428211155b6040805160a08101825273ffffffffffffffffffffffffffffffffffffffff8681168252602082018881529282018681525f60608401818152861580156080870190815260048054600181018255945295517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b600590940293840180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919096161790945594517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c82015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d82015592517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e84015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f90920180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169215159290921790915590915061135a578360065f8282546113549190611e96565b90915550505b50505050565b5f60075442111580611373575060085442115b61137e5750600b5490565b505f90565b61138b611638565b5f6004838154811061139f5761139f611dc3565b5f91825260208083208684526005808352604080862033875290935291909320910290910191506113cf84610821565b805415611420575f8160010154670de0b6b3a76400008460030154845f01546113f89190611e1d565b6114029190611e34565b61140c9190611e6c565b9050801561141e5761141e3382611993565b505b821561146257815461144a9073ffffffffffffffffffffffffffffffffffffffff16333086611a4e565b82815f015f82825461145c9190611e96565b90915550505b60038201548154670de0b6b3a76400009161147c91611e1d565b6114869190611e34565b6001820155604051838152849033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a3505061081d60015f55565b60605f6114da8484610d54565b604080516002808252606082018352929350919060208301908036833701905050915080825f8151811061151057611510611dc3565b602090810291909101015261271061152a613a9883611e1d565b6115349190611e34565b8260018151811061154757611547611dc3565b6020026020010181815250505092915050565b611562611638565b6004545f5b818110156115a0575f818152600560209081526040808320338452909152902054156115985761159833825f611679565b600101611567565b50506115ab60015f55565b565b60605f6115b983610ce6565b604080516002808252606082018352929350919060208301908036833701905050915080825f815181106115ef576115ef611dc3565b6020908102919091010152612710611609613a9883611e1d565b6116139190611e34565b8260018151811061162657611626611dc3565b60200260200101818152505050919050565b60025f5403611673576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b5f6004838154811061168d5761168d611dc3565b5f91825260208083208684526005808352604080862073ffffffffffffffffffffffffffffffffffffffff8b168752909352919093208054929091029092019250831115611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f77697468647261773a206e6f7420676f6f6400000000000000000000000000006044820152606401610b13565b61174084610821565b5f8160010154670de0b6b3a76400008460030154845f01546117629190611e1d565b61176c9190611e34565b6117769190611e6c565b90508015611788576117888682611993565b83156117c85783825f015f8282546117a09190611e6c565b909155505082546117c89073ffffffffffffffffffffffffffffffffffffffff168786611846565b60038301548254670de0b6b3a7640000916117e291611e1d565b6117ec9190611e34565b6001830155604051848152859073ffffffffffffffffffffffffffffffffffffffff8816907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff838116602483015260448201839052610cc391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611a94565b6004545f5b81811015610cc3578273ffffffffffffffffffffffffffffffffffffffff16600482815481106118fe576118fe611dc3565b5f91825260209091206005909102015473ffffffffffffffffffffffffffffffffffffffff160361198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f726577617264506f6f6c3a206578697374696e6720706f6f6c3f0000000000006044820152606401610b13565b6001016118cc565b5f6127106119a3613a9884611e1d565b6119ad9190611e34565b6002549091506119d49073ffffffffffffffffffffffffffffffffffffffff168484611b33565b6003546119f89073ffffffffffffffffffffffffffffffffffffffff168483611b33565b604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff8516917fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f51910160405180910390a2505050565b60405173ffffffffffffffffffffffffffffffffffffffff848116602483015283811660448301526064820183905261135a9186918216906323b872dd90608401611880565b5f5f60205f8451602086015f885af180611ab3576040513d5f823e3d81fd5b50505f513d91508115611aca578060011415611ae4565b73ffffffffffffffffffffffffffffffffffffffff84163b155b1561135a576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610b13565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015611b9d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc19190611e7f565b9050801561135a5780821115611bf757611bf273ffffffffffffffffffffffffffffffffffffffff85168483611846565b61135a565b61135a73ffffffffffffffffffffffffffffffffffffffff85168484611846565b5f60208284031215611c28575f5ffd5b5035919050565b602080825282518282018190525f918401906040840190835b81811015611c66578351835260209384019390920191600101611c48565b509095945050505050565b5f5f60408385031215611c82575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b81811015611c6657835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101611caa565b73ffffffffffffffffffffffffffffffffffffffff81168114610d51575f5ffd5b5f5f5f60608486031215611d11575f5ffd5b8335611d1c81611cde565b9250602084013591506040840135611d3381611cde565b809150509250925092565b5f60208284031215611d4e575f5ffd5b8135611d5981611cde565b9392505050565b5f5f60408385031215611d71575f5ffd5b823591506020830135611d8381611cde565b809150509250929050565b5f5f5f60608486031215611da0575f5ffd5b833592506020840135611db281611cde565b929592945050506040919091013590565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176106aa576106aa611df0565b5f82611e67577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b818103818111156106aa576106aa611df0565b5f60208284031215611e8f575f5ffd5b5051919050565b808201808211156106aa576106aa611df056fea2646970667358221220d086c686d5b9567311aab2065606a2fb0d65543d0ba6001a4fe40d9c835fec3764736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000afde634d6f38fc59cf94fb9e24a91e31ee6aa5e000000000000000000000000011f5cd8ae75c2f498de4b874058c489ae473e4880000000000000000000000000000000000000000000000000000000067d17740
-----Decoded View---------------
Arg [0] : _fogHOG (address): 0xaFde634d6f38FC59cF94FB9e24a91E31EE6AA5E0
Arg [1] : _fogSNAKE (address): 0x11F5cd8aE75c2f498DE4b874058c489AE473E488
Arg [2] : _poolStartTime (uint256): 1741780800
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000afde634d6f38fc59cf94fb9e24a91e31ee6aa5e0
Arg [1] : 00000000000000000000000011f5cd8ae75c2f498de4b874058c489ae473e488
Arg [2] : 0000000000000000000000000000000000000000000000000000000067d17740
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.