Contract 0xD742992bc78852E1c5cfbC70eA3c72689Fa72304

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xb8ff1a12983a4222b474266a60f835bc380aefe609691f741af00d723c5b107fWithdraw422114892022-07-07 7:20:0585 days 18 hrs ago0x8dac0bf62cc3d09f7a33a4c7493b381f04f66c32 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.000290891291
0xce730ac87cbe043263290afbdb4c73e6cc755ccebeb79ed5d8eb8d4180537c94Withdraw421326322022-07-06 6:52:4286 days 19 hrs ago0xac1b80e06f970879bfb8f2b92b59442593f332b6 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.000280093757
0xaba5a1004ab67ee1f14e12cd63ddd531f91a1334af912c35c4c335368fba8c97Withdraw421326262022-07-06 6:52:2986 days 19 hrs ago0xac1b80e06f970879bfb8f2b92b59442593f332b6 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.000235959967
0x06f023c2b0e60904aa69c92cc047f5ab4e0209d72bc0edf260da183c6f8fa5dfWithdraw416114752022-06-29 11:29:2393 days 14 hrs ago0x708670ad43835305eee4447e378801fd72c86c9e IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.000929771416
0xb943503eeb873d9c773060cf7e0baa787bd9c1395f289fe7c3d43fec8e6e1cadWithdraw411710532022-06-23 18:24:3099 days 7 hrs ago0x9256af19ddc0cdfb92beb486efad4a40bb3aabb0 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.000290027625
0x468ae727f8197026464c2ad9e59e168f2d6b20f1d7ab5f7b36b09d3c62547eccDeposit406052692022-06-15 23:15:44107 days 2 hrs ago0xd1c8ae3531bbe4591d404089b0d01e0d15b36efc IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.01164702733
0x41c81d095fdcee9949e740de67a5d5769f33a9e648d96fb8e2170209ea4c2b74Deposit405992162022-06-15 21:16:55107 days 4 hrs ago0xdfb0348f0d8200ee2eb50aa4755f690dc3165b52 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.032233328567
0x1f20c642998b3ba7be79d29981de20820a8355eb928922b67a714b4eea749e3fWithdraw405574982022-06-15 7:09:47107 days 18 hrs ago0xb34503e79f49e5d00a5d70d6e3c7effa7baa9f95 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.003948869615
0x6d59648099cb7ff237b73e533729665caeddb2ff3bc4df725359ec4b61fb97c5Deposit404994982022-06-14 12:17:26108 days 13 hrs ago0x8dac0bf62cc3d09f7a33a4c7493b381f04f66c32 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.02228291973
0x72ec62509b7e8bb336f7f1daceb8866fc00df502503562c7e6b5f7e5131ab4baWithdraw404980702022-06-14 11:50:21108 days 14 hrs ago0xd039288dd5b8cecf4b251b06fe601e88584e55b3 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.014624689136
0x6099f3884f4e95afc1462aa233eb9574dd9b2ea3d8b50ebc0d514340395f4d9dWithdraw404980202022-06-14 11:49:22108 days 14 hrs ago0xd039288dd5b8cecf4b251b06fe601e88584e55b3 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.023795174405
0x6541fa25f0346058b1d01db780e67f08356b10185683e4764e3782359e18aefeWithdraw404979842022-06-14 11:48:44108 days 14 hrs ago0xd039288dd5b8cecf4b251b06fe601e88584e55b3 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.156066593244
0x168b92376a8569cb0811b9cc8d268afa5b1c5eb65c5bb81449ebb1eb2997ff56Deposit404423772022-06-13 17:47:05109 days 8 hrs ago0xba00f683050912096aed6f689f38ca68b5d98423 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.094247866305
0xcb554824c67ea786d84ec026cda279de06d518bb54db225f64d979106fe77b6dWithdraw399553682022-06-07 1:31:38116 days 33 mins ago0x8dc4397696ddd4af057e748d39804b269d6f3205 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.000801806729
0x3c89341ad7ef3a130e3acad46f4158e897b3eebfd8803ee73cde7e6ac6fbc7f4Deposit396355442022-06-02 19:26:53120 days 6 hrs ago0x708670ad43835305eee4447e378801fd72c86c9e IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.012061329051
0x29ee78a843b91e7204c8201d96025135cb87815ba3d4029c98e70d3e8e37e462Withdraw395928992022-06-02 5:12:29120 days 20 hrs ago0x5aa299873dc8be02da07846c2fed6fac0cec8991 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.000919172792
0xb3dcd8e6afbeb58d34348be5086f2a8badef917f7e21a598b93ee67fea325ea6Deposit395785922022-06-02 0:40:27121 days 1 hr ago0x9d85984832c56cf3bf4ba911c854ee50fb625138 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.003900363982
0x81f090a61e51f34e47ad7b5f94305dd2936807e14cbcebca75d536ede7e5b455Withdraw395164472022-06-01 4:27:05121 days 21 hrs ago0xff1cde077ee22adbe95f3b178d5d51595985223c IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.00105897983
0x44c4d6533d7ea937db59d7eaade8eabe64049e5005194537a479a865932eed77Deposit394420492022-05-31 4:26:25122 days 21 hrs ago0x8dc4397696ddd4af057e748d39804b269d6f3205 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.002591825877
0x7cfcb26dca120a6e90120cca1f7826cbfb5669bd4d910621e297746bc30805c7Deposit394411162022-05-31 4:10:01122 days 21 hrs ago0x8dc4397696ddd4af057e748d39804b269d6f3205 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.003888031086
0x2f01f6f8bb0b3174e167f83eda0e536c41a7cb7d8d5bfbf3a7e94e54a9f2ff3eWithdraw394407622022-05-31 4:03:43122 days 22 hrs ago0x8dc4397696ddd4af057e748d39804b269d6f3205 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.002152727169
0xc9b31af62a7048b1c0cf5442daa18e58ba97dc7db1c4041f2461ca260ee3a7c7Withdraw394000612022-05-30 14:33:39123 days 11 hrs ago0xe97fecebde0e222c4dfded8f9da7a8dd8f8559bb IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.002936098788
0x6ac152b045fe4399c25fe453f6bf7711cc1a066cf7127f24e5537fd66b0845a9Deposit393376492022-05-29 17:46:25124 days 8 hrs ago0xbad9c3ac37c5d96b5a2baddc300b948ec7544f17 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.000537245305
0x54b8c6d92108041ed8d64724e1543dbb352fd0ae8ee63cecd0750b7a9234c0e8Withdraw390796402022-05-26 5:36:30127 days 20 hrs ago0x32ed81a2a2599df3374118520a0dedfe5157f768 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.217141612176
0x0716e7d30a3a14eb0143cefcec6ea4a82a66b0604eba6c7c088abe88f6839d30Deposit389568942022-05-24 13:57:09129 days 12 hrs ago0x32ed81a2a2599df3374118520a0dedfe5157f768 IN  0xd742992bc78852e1c5cfbc70ea3c72689fa723040 FTM0.020187273925
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x53c8f0c3ab623870ec524134cb5a18818949c2c1da4db1a8ada0a1c8ee0a8195337618162022-03-18 15:24:14196 days 10 hrs ago Piggy Finance: Deployer  Contract Creation0 FTM
[ Download CSV Export 
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:
PShareRewardPool

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : PShareRewardPool.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";

// Note that this pool has no minter key of pSHARE (rewards).
// Instead, the governance will call pSHARE distributeReward method and send reward to this pool at the beginning.
contract PShareRewardPool {
    using SafeMath for uint256;
    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. pSHAREs to distribute per block.
        uint256 lastRewardTime; // Last time that pSHAREs distribution occurs.
        uint256 accPSharePerShare; // Accumulated pSHAREs per share, times 1e18. See below.
        bool isStarted; // if lastRewardTime has passed
    }

    IERC20 public pshare;

    // 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 public totalAllocPoint = 0;

    // The time when pSHARE mining starts.
    uint256 public poolStartTime;

    // The time when pSHARE mining ends.
    uint256 public poolEndTime;

    uint256 public pSharePerSecond = 0.00218 ether; // 60000 pshare / (370 days * 24h * 60min * 60s)
    uint256 public runningTime = 370 days; // 370 days
    uint256 public constant TOTAL_REWARDS = 70000 ether;

    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 amount);

    constructor(
        address _pshare,
        uint256 _poolStartTime
    ) public {
        require(block.timestamp < _poolStartTime, "late ");
        if (_pshare != address(0)) pshare = IERC20(_pshare);
        poolStartTime = _poolStartTime;
        poolEndTime = poolStartTime + runningTime;
        operator = msg.sender;
    }

    modifier onlyOperator() {
        require(operator == msg.sender, "PShareRewardPool: caller is not the operator");
        _;
    }

    function checkPoolDuplicate(IERC20 _token) internal view {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            require(poolInfo[pid].token != _token, "PShareRewardPool: existing pool?");
        }
    }

    // Add a new lp to the pool. Can only be called by the owner.
    function add(
        uint256 _allocPoint,
        IERC20 _token,
        bool _withUpdate,
        uint256 _lastRewardTime
    ) public onlyOperator {
        checkPoolDuplicate(_token);
        if (_withUpdate) {
            massUpdatePools();
        }
        if (block.timestamp < poolStartTime) {
            // chef is sleeping
            if (_lastRewardTime == 0) {
                _lastRewardTime = poolStartTime;
            } else {
                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,
            accPSharePerShare : 0,
            isStarted : _isStarted
            }));
        if (_isStarted) {
            totalAllocPoint = totalAllocPoint.add(_allocPoint);
        }
    }

    // Update the given pool's pSHARE allocation point. Can only be called by the owner.
    function set(uint256 _pid, uint256 _allocPoint) public onlyOperator {
        massUpdatePools();
        PoolInfo storage pool = poolInfo[_pid];
        if (pool.isStarted) {
            totalAllocPoint = totalAllocPoint.sub(pool.allocPoint).add(
                _allocPoint
            );
        }
        pool.allocPoint = _allocPoint;
    }

    // Return accumulate rewards over the given _from to _to block.
    function getGeneratedReward(uint256 _fromTime, uint256 _toTime) public view returns (uint256) {
        if (_fromTime >= _toTime) return 0;
        if (_toTime >= poolEndTime) {
            if (_fromTime >= poolEndTime) return 0;
            if (_fromTime <= poolStartTime) return poolEndTime.sub(poolStartTime).mul(pSharePerSecond);
            return poolEndTime.sub(_fromTime).mul(pSharePerSecond);
        } else {
            if (_toTime <= poolStartTime) return 0;
            if (_fromTime <= poolStartTime) return _toTime.sub(poolStartTime).mul(pSharePerSecond);
            return _toTime.sub(_fromTime).mul(pSharePerSecond);
        }
    }

    // View function to see pending pSHAREs on frontend.
    function pendingShare(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accPSharePerShare = pool.accPSharePerShare;
        uint256 tokenSupply = pool.token.balanceOf(address(this));
        if (block.timestamp > pool.lastRewardTime && tokenSupply != 0) {
            uint256 _generatedReward = getGeneratedReward(pool.lastRewardTime, block.timestamp);
            uint256 _pshareReward = _generatedReward.mul(pool.allocPoint).div(totalAllocPoint);
            accPSharePerShare = accPSharePerShare.add(_pshareReward.mul(1e18).div(tokenSupply));
        }
        return user.amount.mul(accPSharePerShare).div(1e18).sub(user.rewardDebt);
    }

    // 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 = totalAllocPoint.add(pool.allocPoint);
        }
        if (totalAllocPoint > 0) {
            uint256 _generatedReward = getGeneratedReward(pool.lastRewardTime, block.timestamp);
            uint256 _pshareReward = _generatedReward.mul(pool.allocPoint).div(totalAllocPoint);
            pool.accPSharePerShare = pool.accPSharePerShare.add(_pshareReward.mul(1e18).div(tokenSupply));
        }
        pool.lastRewardTime = block.timestamp;
    }

    // Deposit LP tokens.
    function deposit(uint256 _pid, uint256 _amount) public {
        address _sender = msg.sender;
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_sender];
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 _pending = user.amount.mul(pool.accPSharePerShare).div(1e18).sub(user.rewardDebt);
            if (_pending > 0) {
                safePShareTransfer(_sender, _pending);
                emit RewardPaid(_sender, _pending);
            }
        }
        if (_amount > 0) {
            pool.token.safeTransferFrom(_sender, address(this), _amount);
            user.amount = user.amount.add(_amount);
        }
        user.rewardDebt = user.amount.mul(pool.accPSharePerShare).div(1e18);
        emit Deposit(_sender, _pid, _amount);
    }

    // Withdraw LP tokens.
    function withdraw(uint256 _pid, uint256 _amount) public {
        address _sender = msg.sender;
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_sender];
        require(user.amount >= _amount, "withdraw: not good");
        updatePool(_pid);
        uint256 _pending = user.amount.mul(pool.accPSharePerShare).div(1e18).sub(user.rewardDebt);
        if (_pending > 0) {
            safePShareTransfer(_sender, _pending);
            emit RewardPaid(_sender, _pending);
        }
        if (_amount > 0) {
            user.amount = user.amount.sub(_amount);
            pool.token.safeTransfer(_sender, _amount);
        }
        user.rewardDebt = user.amount.mul(pool.accPSharePerShare).div(1e18);
        emit Withdraw(_sender, _pid, _amount);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) public {
        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);
    }

    // Safe pshare transfer function, just in case if rounding error causes pool to not have enough pSHAREs.
    function safePShareTransfer(address _to, uint256 _amount) internal {
        uint256 _pshareBal = pshare.balanceOf(address(this));
        if (_pshareBal > 0) {
            if (_amount > _pshareBal) {
                pshare.safeTransfer(_to, _pshareBal);
            } else {
                pshare.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 + 90 days) {
            // do not allow to drain core token (pSHARE or lps) if less than 90 days after pool ends
            require(_token != pshare, "pshare");
            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 5 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 3 of 5 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

import "./IERC20.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 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 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @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).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 4 of 5 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 5 of 5 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_pshare","type":"address"},{"internalType":"uint256","name":"_poolStartTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"amount","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":"TOTAL_REWARDS","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":"bool","name":"_withUpdate","type":"bool"},{"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":[{"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":[{"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":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pSharePerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingShare","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":"accPSharePerShare","type":"uint256"},{"internalType":"bool","name":"isStarted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pshare","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"runningTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","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"}]

608060405260006004556607beb2cd9c40006007556301e7cb0060085534801561002857600080fd5b506040516118973803806118978339818101604052604081101561004b57600080fd5b508051602090910151428111610090576040805162461bcd60e51b815260206004820152600560248201526403630ba32960dd1b604482015290519081900360640190fd5b6001600160a01b038216156100bb57600180546001600160a01b0319166001600160a01b0384161790555b60058190556008540160065550600080546001600160a01b031916331790556117ae806100e96000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c8063570ca735116100b8578063943f013d1161007c578063943f013d1461031657806396805e541461031e578063b3ab15fb14610358578063babc55471461037e578063cf4b55cb14610386578063e2bbb158146103b257610137565b8063570ca735146102955780635f96dc11146102b9578063630b5ba1146102c15780636e271dd5146102c957806393f1a40b146102d157610137565b8063441a3e70116100ff578063441a3e70146101fa57806351eb05a61461021d5780635312ea8e1461023a57806354575af414610257578063554e99271461028d57610137565b806309cf60911461013c5780631526fe271461015657806317caf6f1146101aa5780631ab06ee5146101b2578063231f0c6a146101d7575b600080fd5b6101446103d5565b60408051918252519081900360200190f35b6101736004803603602081101561016c57600080fd5b50356103e3565b604080516001600160a01b039096168652602086019490945284840192909252606084015215156080830152519081900360a00190f35b61014461042e565b6101d5600480360360408110156101c857600080fd5b5080359060200135610434565b005b610144600480360360408110156101ed57600080fd5b50803590602001356104e2565b6101d56004803603604081101561021057600080fd5b50803590602001356105a7565b6101d56004803603602081101561023357600080fd5b5035610764565b6101d56004803603602081101561025057600080fd5b50356108c2565b6101d56004803603606081101561026d57600080fd5b506001600160a01b0381358116916020810135916040909101351661095e565b610144610aa6565b61029d610aac565b604080516001600160a01b039092168252519081900360200190f35b610144610abb565b6101d5610ac1565b610144610ae4565b6102fd600480360360408110156102e757600080fd5b50803590602001356001600160a01b0316610aea565b6040805192835260208301919091528051918290030190f35b610144610b0e565b6101d56004803603608081101561033457600080fd5b508035906001600160a01b0360208201351690604081013515159060600135610b14565b6101d56004803603602081101561036e57600080fd5b50356001600160a01b0316610d11565b61029d610d7c565b6101446004803603604081101561039c57600080fd5b50803590602001356001600160a01b0316610d8b565b6101d5600480360360408110156103c857600080fd5b5080359060200135610ee7565b690ed2b525841adfc0000081565b600281815481106103f057fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909160ff1685565b60045481565b6000546001600160a01b0316331461047d5760405162461bcd60e51b815260040180806020018281038252602c815260200180611702602c913960400191505060405180910390fd5b610485610ac1565b60006002838154811061049457fe5b60009182526020909120600590910201600481015490915060ff16156104db576104d7826104d1836001015460045461105790919063ffffffff16565b906110a0565b6004555b6001015550565b60008183106104f3575060006105a1565b600654821061055b57600654831061050d575060006105a1565b60055483116105405761053960075461053360055460065461105790919063ffffffff16565b906110fa565b90506105a1565b6105396007546105338560065461105790919063ffffffff16565b600554821161056c575060006105a1565b6005548311610590576105396007546105336005548561105790919063ffffffff16565b600754610539906105338486611057565b92915050565b60003390506000600284815481106105bb57fe5b600091825260208083208784526003825260408085206001600160a01b03881686529092529220805460059092029092019250841115610637576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b61064085610764565b600061067d8260010154610677670de0b6b3a7640000610671876003015487600001546110fa90919063ffffffff16565b90611153565b90611057565b905080156106cf5761068f8482611195565b6040805182815290516001600160a01b038616917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b84156106f95781546106e19086611057565b825582546106f9906001600160a01b0316858761124b565b6003830154825461071791670de0b6b3a764000091610671916110fa565b600183015560408051868152905187916001600160a01b038716917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505050505050565b60006002828154811061077357fe5b906000526020600020906005020190508060020154421161079457506108bf565b8054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156107de57600080fd5b505afa1580156107f2573d6000803e3d6000fd5b505050506040513d602081101561080857600080fd5b505190508061081e5750426002909101556108bf565b600482015460ff1661084f576004808301805460ff19166001908117909155830154905461084b916110a0565b6004555b600454156108b65760006108678360020154426104e2565b905060006108886004546106718660010154856110fa90919063ffffffff16565b90506108ae6108a38461067184670de0b6b3a76400006110fa565b6003860154906110a0565b600385015550505b50426002909101555b50565b6000600282815481106108d157fe5b600091825260208083208584526003825260408085203380875293528420805485825560018201959095556005909302018054909450919291610921916001600160a01b0391909116908361124b565b604080518281529051859133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a350505050565b6000546001600160a01b031633146109a75760405162461bcd60e51b815260040180806020018281038252602c815260200180611702602c913960400191505060405180910390fd5b6006546276a70001421015610a8d576001546001600160a01b0384811691161415610a02576040805162461bcd60e51b815260206004820152600660248201526570736861726560d01b604482015290519081900360640190fd5b60025460005b81811015610a8a57600060028281548110610a1f57fe5b6000918252602090912060059091020180549091506001600160a01b0387811691161415610a81576040805162461bcd60e51b815260206004820152600a6024820152693837b7b6173a37b5b2b760b11b604482015290519081900360640190fd5b50600101610a08565b50505b610aa16001600160a01b038416828461124b565b505050565b60075481565b6000546001600160a01b031681565b60055481565b60025460005b81811015610ae057610ad881610764565b600101610ac7565b5050565b60065481565b60036020908152600092835260408084209091529082529020805460019091015482565b60085481565b6000546001600160a01b03163314610b5d5760405162461bcd60e51b815260040180806020018281038252602c815260200180611702602c913960400191505060405180910390fd5b610b668361129d565b8115610b7457610b74610ac1565b600554421015610ba05780610b8c5750600554610b9b565b600554811015610b9b57506005545b610bb4565b801580610bac57504281105b15610bb45750425b600060055482111580610bc75750428211155b6040805160a0810182526001600160a01b03878116825260208201898152928201868152600060608401818152861580156080870190815260028054600181018255945295517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600590940293840180546001600160a01b031916919096161790945594517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf82015590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad082015592517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad184015590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad2909201805460ff191692151592909217909155909150610d0a57600454610d0690866110a0565b6004555b5050505050565b6000546001600160a01b03163314610d5a5760405162461bcd60e51b815260040180806020018281038252602c815260200180611702602c913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b60008060028481548110610d9b57fe5b60009182526020808320878452600380835260408086206001600160a01b03808b168852908552818720600590960290930191820154825482516370a0823160e01b815230600482015292519398509596909590949316926370a0823192602480840193829003018186803b158015610e1357600080fd5b505afa158015610e27573d6000803e3d6000fd5b505050506040513d6020811015610e3d57600080fd5b5051600285015490915042118015610e5457508015155b15610eb1576000610e698560020154426104e2565b90506000610e8a6004546106718860010154856110fa90919063ffffffff16565b9050610eac610ea58461067184670de0b6b3a76400006110fa565b85906110a0565b935050505b610edc8360010154610677670de0b6b3a76400006106718688600001546110fa90919063ffffffff16565b979650505050505050565b6000339050600060028481548110610efb57fe5b600091825260208083208784526003825260408085206001600160a01b0388168652909252922060059091029091019150610f3585610764565b805415610fc1576000610f6d8260010154610677670de0b6b3a7640000610671876003015487600001546110fa90919063ffffffff16565b90508015610fbf57610f7f8482611195565b6040805182815290516001600160a01b038616917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b505b8315610fed578154610fde906001600160a01b0316843087611337565b8054610fea90856110a0565b81555b6003820154815461100b91670de0b6b3a764000091610671916110fa565b600182015560408051858152905186916001600160a01b038616917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050505050565b600061109983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611397565b9392505050565b600082820183811015611099576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082611109575060006105a1565b8282028284828161111657fe5b04146110995760405162461bcd60e51b815260040180806020018281038252602181526020018061172e6021913960400191505060405180910390fd5b600061109983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061142e565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156111e057600080fd5b505afa1580156111f4573d6000803e3d6000fd5b505050506040513d602081101561120a57600080fd5b505190508015610aa1578082111561123857600154611233906001600160a01b0316848361124b565b610aa1565b600154610aa1906001600160a01b031684845b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610aa1908490611493565b60025460005b81811015610aa157826001600160a01b0316600282815481106112c257fe5b60009182526020909120600590910201546001600160a01b0316141561132f576040805162461bcd60e51b815260206004820181905260248201527f505368617265526577617264506f6f6c3a206578697374696e6720706f6f6c3f604482015290519081900360640190fd5b6001016112a3565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611391908590611493565b50505050565b600081848411156114265760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156113eb5781810151838201526020016113d3565b50505050905090810190601f1680156114185780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818361147d5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156113eb5781810151838201526020016113d3565b50600083858161148957fe5b0495945050505050565b60606114e8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115449092919063ffffffff16565b805190915015610aa15780806020019051602081101561150757600080fd5b5051610aa15760405162461bcd60e51b815260040180806020018281038252602a81526020018061174f602a913960400191505060405180910390fd5b6060611553848460008561155b565b949350505050565b6060611566856116c8565b6115b7576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106115f65780518252601f1990920191602091820191016115d7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611658576040519150601f19603f3d011682016040523d82523d6000602084013e61165d565b606091505b509150915081156116715791506115539050565b8051156116815780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156113eb5781810151838201526020016113d3565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061155357505015159291505056fe505368617265526577617264506f6f6c3a2063616c6c6572206973206e6f7420746865206f70657261746f72536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122044c37da3cffed8d657b7d6657cbb8366f9a64c78e2ef28b811f237d1faec740664736f6c634300060c0033000000000000000000000000f6036dd216b6b97482510cb647c5d1feb83ce9100000000000000000000000000000000000000000000000000000000062439d80

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000f6036dd216b6b97482510cb647c5d1feb83ce9100000000000000000000000000000000000000000000000000000000062439d80

-----Decoded View---------------
Arg [0] : _pshare (address): 0xf6036dd216b6b97482510cb647c5d1feb83ce910
Arg [1] : _poolStartTime (uint256): 1648598400

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f6036dd216b6b97482510cb647c5d1feb83ce910
Arg [1] : 0000000000000000000000000000000000000000000000000000000062439d80


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.