S Price: $0.447215 (+4.50%)

Contract

0x5F59CABC5b6BB9B391a033d712afA1b1D90CE62B
Transaction Hash
Method
Block
From
To
Deposit132467362025-03-12 12:46:465 mins ago1741783606IN
0x5F59CABC...1D90CE62B
0 S0.0058632960.5
Deposit132434902025-03-12 12:27:5024 mins ago1741782470IN
0x5F59CABC...1D90CE62B
0 S0.0065497155.01
Deposit132419822025-03-12 12:17:0635 mins ago1741781826IN
0x5F59CABC...1D90CE62B
0 S0.0092927650.0001
Deposit132414732025-03-12 12:13:2339 mins ago1741781603IN
0x5F59CABC...1D90CE62B
0 S0.0034147550
Deposit132414662025-03-12 12:13:1939 mins ago1741781599IN
0x5F59CABC...1D90CE62B
0 S0.0050571650.0001
Withdraw132414512025-03-12 12:13:1139 mins ago1741781591IN
0x5F59CABC...1D90CE62B
0 S0.006848350
Deposit132414292025-03-12 12:13:0239 mins ago1741781582IN
0x5F59CABC...1D90CE62B
0 S0.003411950
Withdraw132414012025-03-12 12:12:5239 mins ago1741781572IN
0x5F59CABC...1D90CE62B
0 S0.00684950
Deposit132413582025-03-12 12:12:3540 mins ago1741781555IN
0x5F59CABC...1D90CE62B
0 S0.0034114150.00538511
Withdraw132413402025-03-12 12:12:2840 mins ago1741781548IN
0x5F59CABC...1D90CE62B
0 S0.00855550
Deposit132410082025-03-12 12:10:3741 mins ago1741781437IN
0x5F59CABC...1D90CE62B
0 S0.0072126650.0001
Harvest All Rewa...132408592025-03-12 12:09:4542 mins ago1741781385IN
0x5F59CABC...1D90CE62B
0 S0.0255404855.01
Withdraw132406282025-03-12 12:08:2244 mins ago1741781302IN
0x5F59CABC...1D90CE62B
0 S0.0067490150.0001
Withdraw132405682025-03-12 12:08:0144 mins ago1741781281IN
0x5F59CABC...1D90CE62B
0 S0.0067501150.0001
Deposit132404882025-03-12 12:07:3245 mins ago1741781252IN
0x5F59CABC...1D90CE62B
0 S0.0059385150.0001
Deposit132404452025-03-12 12:07:1745 mins ago1741781237IN
0x5F59CABC...1D90CE62B
0 S0.0059396650.0001
Withdraw132404172025-03-12 12:07:0545 mins ago1741781225IN
0x5F59CABC...1D90CE62B
0 S0.0099184655.01
Harvest All Rewa...132403812025-03-12 12:06:5145 mins ago1741781211IN
0x5F59CABC...1D90CE62B
0 S0.0122578364.58223699
Deposit132402072025-03-12 12:05:4246 mins ago1741781142IN
0x5F59CABC...1D90CE62B
0 S0.0095496650.0001
Set Pool Allocat...132401692025-03-12 12:05:2347 mins ago1741781123IN
0x5F59CABC...1D90CE62B
0 S0.0135478250.0001
Set Pool Allocat...132401492025-03-12 12:05:1347 mins ago1741781113IN
0x5F59CABC...1D90CE62B
0 S0.0135478250.0001
Deposit132399052025-03-12 12:03:3848 mins ago1741781018IN
0x5F59CABC...1D90CE62B
0 S0.0059396650.0001
Withdraw132398812025-03-12 12:03:3149 mins ago1741781011IN
0x5F59CABC...1D90CE62B
0 S0.0089834954.02891605
Deposit132397982025-03-12 12:03:0349 mins ago1741780983IN
0x5F59CABC...1D90CE62B
0 S0.0059385150.0001
Withdraw132397012025-03-12 12:02:2550 mins ago1741780945IN
0x5F59CABC...1D90CE62B
0 S0.0103616750.0001
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

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
File 1 of 8 : GenesisRewardsPool.sol
// 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);
    }
}

File 2 of 8 : ReentrancyGuard.sol
// 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;
    }
}

File 3 of 8 : SafeERC20.sol
// 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);
    }
}

File 4 of 8 : IERC20.sol
// 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);
}

File 5 of 8 : IERC1363.sol
// 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);
}

File 6 of 8 : IERC165.sol
// 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";

File 7 of 8 : IERC20.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";

File 8 of 8 : IERC165.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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "remappings": []
}

Contract Security Audit

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"}]

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


Block Transaction Gas Used Reward
view all blocks ##produced##

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.