Contract 0x1288D0bEd4F0a1381A0f63cbC97C7353908623be

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x4eee70c271f9f3713694881569d9d7fdb838b916a9ccfe5d4afbb2b57f50dec9Withdraw544075362023-01-21 1:16:1816 days 4 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00005058
0xa2d6b28b82d1890518f44f1b3a3ea2255d69c047a1656e859a5d03af1a266817Withdraw541198822023-01-19 15:11:0017 days 14 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00003784
0xdec1982810b84fa4f5b8b164fe8e9c9b5fa555e630eba8b47ff50b174a405e7eWithdraw526565672023-01-12 23:24:0324 days 6 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00005384
0x9d74b616ff39f92682b261d100460860fe43c8e3afa747ce36ee59e7f48e6ea9Withdraw521993642023-01-11 2:24:3626 days 3 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00004208
0x750b8c34e6413ab19b67d54eb5b2fe0efcb2289d4460911eaead93ac0cc98f91Withdraw519651262023-01-10 2:41:2627 days 2 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00004028
0xcd8c3f3336db65b4fecf585cb4a7b06a41b3d7c4870c19e491cd420271705884Withdraw514750172023-01-07 17:09:0429 days 12 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.0000379
0xd6d6fc5fcdd48dd1c11fdada085b958cfa02eb79ef483c878ace9c795db31932Withdraw512299532023-01-06 13:52:0530 days 15 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00003452
0x46eb9f79dde86da53006e4d2155211925b9e512c33bbfb54fc4331a9462afaa1Withdraw512283892023-01-06 13:44:3630 days 15 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.000032
0x588312ebf3898e55e080b8de41aeb1d864509bec0fcff4ab216831d10362b55dWithdraw512266802023-01-06 13:36:0130 days 15 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00003408
0x0c0f23818eb609b20efe5f61cfdabf5aa92a3dba95925511c859c7447f748e31Withdraw511120352023-01-05 23:00:2231 days 6 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00005212
0x8ce65fa2c4629eb140f314ec773327481760518506ca8f6202d629322e9f62dfWithdraw511118842023-01-05 22:58:3631 days 6 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00005304
0x2c0e087ce3e0cda6ed88ec2a47b9603cf8387f72a87605e960e122ed7f9b6c6dWithdraw502425902023-01-02 2:09:3335 days 3 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00003999
0xfeb2e8c27af3f62594c3ccfff2a61630947abec78991063ec7743166c30006b2Withdraw502424652023-01-02 2:07:5735 days 3 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00003999
0x2269c26cdf3729c45b9246b72d7e8213b39f2c73f16b672e95a2392abdaa1bffWithdraw496726562022-12-29 20:51:0538 days 8 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00004425
0xa693b615962a25325b3e3c0c637660454fa3435ff32d55df5b9e3b27d2d58e16Withdraw487603482022-12-25 13:29:1442 days 15 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00003203
0x086d963d56f05e3c37636906503e3ae7dcebc549a47b42d0189167325b5c766cWithdraw483654402022-12-23 21:31:2144 days 7 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00003598
0xd76484c77cd9971971325b4b3e52e39e632e622a630403953fd4275cc0ef4d26Withdraw480543852022-12-22 14:16:4845 days 15 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00003983
0x952c17d73e75e0cd0e81f590f978f2e47faa74b74d3f3012cf6714e4ca68a2dbWithdraw478909432022-12-21 20:17:0446 days 9 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00003722
0x1ec964e4a322c2ccbeeb8f8ee3c4bd096dad54151743594833bc32c2ac8b28feWithdraw474034462022-12-19 21:20:0248 days 8 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.0000403
0x4bc475e819f9654e7e321233b895ff7365412a2d23e417b5fcaf7845b448ba57Withdraw466984612022-12-16 18:16:4551 days 11 hrs ago0x198e18ecfda347c6cdaa440e22b2ff89eaa2cb6f IN  Pana DAO: Staking Pools0 ETH0.00005556
0xde8c5b9643303aa38f5b8418b601781c41ee40170dd46edcf0d66111d1571a71Harvest All466978622022-12-16 18:12:4151 days 11 hrs ago0x198e18ecfda347c6cdaa440e22b2ff89eaa2cb6f IN  Pana DAO: Staking Pools0 ETH0.000044
0xc4cff81d2400d63f50ea8256e87e64c0e7c26d4c00905edd47c69417e805b68dDeposit465771472022-12-16 8:24:5951 days 21 hrs ago0xc7d319685db275847334c7cd1acda39730b8f73d IN  Pana DAO: Staking Pools0 ETH0.00003067
0x4a71661ae1d90e2e6294eb159237b368b525695b1d3f83cd1fa232b77291a448Withdraw462407462022-12-15 2:25:1353 days 3 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00003259
0x3b6f7fd5b141b8ae9f95d0c8ced5bd753243679eadd9bed10445108541902f9aWithdraw462156712022-12-15 0:07:5553 days 5 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00003461
0xfda1e985a9685eed0cb322d9ef9844393449c89de24191f2626f8abdb6480186Withdraw459514922022-12-14 0:13:2654 days 5 hrs ago0xa2af46be6b202f2a4f22234531d7844f019ddc15 IN  Pana DAO: Staking Pools0 ETH0.00003622
[ Download CSV Export 

OVERVIEW

Pana DAO Staking Pools is a standard contract, collection of various farms/assets where users can stake those assets and earn streaming Pana.

Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x4eee70c271f9f3713694881569d9d7fdb838b916a9ccfe5d4afbb2b57f50dec9544075362023-01-21 1:16:1816 days 4 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x4eee70c271f9f3713694881569d9d7fdb838b916a9ccfe5d4afbb2b57f50dec9544075362023-01-21 1:16:1816 days 4 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0xa2d6b28b82d1890518f44f1b3a3ea2255d69c047a1656e859a5d03af1a266817541198822023-01-19 15:11:0017 days 14 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0xa2d6b28b82d1890518f44f1b3a3ea2255d69c047a1656e859a5d03af1a266817541198822023-01-19 15:11:0017 days 14 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0xdec1982810b84fa4f5b8b164fe8e9c9b5fa555e630eba8b47ff50b174a405e7e526565672023-01-12 23:24:0324 days 6 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0xdec1982810b84fa4f5b8b164fe8e9c9b5fa555e630eba8b47ff50b174a405e7e526565672023-01-12 23:24:0324 days 6 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x9d74b616ff39f92682b261d100460860fe43c8e3afa747ce36ee59e7f48e6ea9521993642023-01-11 2:24:3626 days 3 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x9d74b616ff39f92682b261d100460860fe43c8e3afa747ce36ee59e7f48e6ea9521993642023-01-11 2:24:3626 days 3 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x750b8c34e6413ab19b67d54eb5b2fe0efcb2289d4460911eaead93ac0cc98f91519651262023-01-10 2:41:2627 days 2 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x750b8c34e6413ab19b67d54eb5b2fe0efcb2289d4460911eaead93ac0cc98f91519651262023-01-10 2:41:2627 days 2 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0xcd8c3f3336db65b4fecf585cb4a7b06a41b3d7c4870c19e491cd420271705884514750172023-01-07 17:09:0429 days 12 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0xcd8c3f3336db65b4fecf585cb4a7b06a41b3d7c4870c19e491cd420271705884514750172023-01-07 17:09:0429 days 12 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0xd6d6fc5fcdd48dd1c11fdada085b958cfa02eb79ef483c878ace9c795db31932512299532023-01-06 13:52:0530 days 15 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0xd6d6fc5fcdd48dd1c11fdada085b958cfa02eb79ef483c878ace9c795db31932512299532023-01-06 13:52:0530 days 15 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x46eb9f79dde86da53006e4d2155211925b9e512c33bbfb54fc4331a9462afaa1512283892023-01-06 13:44:3630 days 15 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x46eb9f79dde86da53006e4d2155211925b9e512c33bbfb54fc4331a9462afaa1512283892023-01-06 13:44:3630 days 15 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x588312ebf3898e55e080b8de41aeb1d864509bec0fcff4ab216831d10362b55d512266802023-01-06 13:36:0130 days 15 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x588312ebf3898e55e080b8de41aeb1d864509bec0fcff4ab216831d10362b55d512266802023-01-06 13:36:0130 days 15 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x0c0f23818eb609b20efe5f61cfdabf5aa92a3dba95925511c859c7447f748e31511120352023-01-05 23:00:2231 days 6 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x0c0f23818eb609b20efe5f61cfdabf5aa92a3dba95925511c859c7447f748e31511120352023-01-05 23:00:2231 days 6 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x8ce65fa2c4629eb140f314ec773327481760518506ca8f6202d629322e9f62df511118842023-01-05 22:58:3631 days 6 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x8ce65fa2c4629eb140f314ec773327481760518506ca8f6202d629322e9f62df511118842023-01-05 22:58:3631 days 6 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x2c0e087ce3e0cda6ed88ec2a47b9603cf8387f72a87605e960e122ed7f9b6c6d502425902023-01-02 2:09:3335 days 3 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0x2c0e087ce3e0cda6ed88ec2a47b9603cf8387f72a87605e960e122ed7f9b6c6d502425902023-01-02 2:09:3335 days 3 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
0xfeb2e8c27af3f62594c3ccfff2a61630947abec78991063ec7743166c30006b2502424652023-01-02 2:07:5735 days 3 hrs ago Pana DAO: Staking Pools Pana DAO: PANA Token0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StakingPools

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 5 : PanaAccessControlled.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.7.5;

import "../interfaces/IPanaAuthority.sol";

abstract contract PanaAccessControlled {

    /* ========== EVENTS ========== */

    event AuthorityUpdated(IPanaAuthority indexed authority);

    string UNAUTHORIZED = "UNAUTHORIZED"; // save gas

    /* ========== STATE VARIABLES ========== */

    IPanaAuthority public authority;


    /* ========== Constructor ========== */

    constructor(IPanaAuthority _authority) {
        authority = _authority;
        emit AuthorityUpdated(_authority);
    }
    

    /* ========== MODIFIERS ========== */
    
    modifier onlyGovernor() {
        require(msg.sender == authority.governor(), UNAUTHORIZED);
        _;
    }
    
    modifier onlyGuardian() {
        require(msg.sender == authority.guardian(), UNAUTHORIZED);
        _;
    }
    
    modifier onlyPolicy() {
        require(msg.sender == authority.policy(), UNAUTHORIZED);
        _;
    }

    modifier onlyVault() {
        require(msg.sender == authority.vault(), UNAUTHORIZED);
        _;
    }
    
    /* ========== GOV ONLY ========== */
    
    function setAuthority(IPanaAuthority _newAuthority) external onlyGovernor {
        authority = _newAuthority;
        emit AuthorityUpdated(_newAuthority);
    }
}

File 2 of 5 : IERC20.sol
// SPDX-License-Identifier: AGPL-3.0
pragma solidity >=0.7.5;

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 : IPanaAuthority.sol
// SPDX-License-Identifier: AGPL-3.0
pragma solidity >=0.7.5;

interface IPanaAuthority {
    /* ========== EVENTS ========== */
    
    event GovernorPushed(address indexed from, address indexed to, bool _effectiveImmediately);
    event GuardianPushed(address indexed from, address indexed to, bool _effectiveImmediately);
    event PolicyPushed(address indexed from, address indexed to, bool _effectiveImmediately);
    event VaultPushed(address indexed from, address indexed to, bool _effectiveImmediately);
    event DistributionVaultPushed(address indexed from, address indexed to, bool _effectiveImmediately); 

    event GovernorPulled(address indexed from, address indexed to);
    event GuardianPulled(address indexed from, address indexed to);
    event PolicyPulled(address indexed from, address indexed to);
    event VaultPulled(address indexed from, address indexed to);
    event DistributionVaultPulled(address indexed from, address indexed to);

    /* ========== VIEW ========== */
    
    function governor() external view returns (address);
    function guardian() external view returns (address);
    function policy() external view returns (address);
    function vault() external view returns (address);
    function distributionVault() external view returns (address);
}

File 4 of 5 : StakingPools.sol
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.10;

import "../libraries/SafeERC20.sol";

import "../access/PanaAccessControlled.sol";


// The StakingPools contract distributes Pana tokens to the users who stake certain tokens here.
// It is a fork of Giddy's GiddyChef contract which in turn is a fork of MasterChef by SushiSwap.
contract StakingPools is PanaAccessControlled {
    using SafeERC20 for IERC20;

    // Info of each user.
    struct UserInfo {
        uint256 amount;     // How many tokens the user has provided.
        uint256 rewardDebt; // Reward debt. See explanation below.
        //
        // We do some fancy math here. Basically, any point in time, the amount of Pana
        // entitled to a user but is pending to be distributed is:
        //
        //   pending reward = (user.amount * pool.accPanaPerShare) - user.rewardDebt
        //
        // Whenever a user deposits or withdraws tokens to a pool. Here's what happens:
        //   1. The pool's `accPanaPerShare` (and `lastRewardBlock`) gets updated.
        //   2. User receives the pending reward sent to his/her address.
        //   3. User's `amount` gets updated.
        //   4. User's `rewardDebt` gets updated.
    }

    // Info of each pool.
    struct PoolInfo {
        IERC20 token;             // Address of a deposit token contract.
        uint256 allocPoint;       // How many allocation points assigned to this pool.
        uint256 lastRewardTime;   // Last block time that Pana distribution occurs.
        uint256 accPanaPerShare;  // Accumulated Pana per share, times 1e12. See below.
    }

    IERC20 public immutable PANA;

    // Pana tokens distributed per second.
    uint256 public panaPerSecond;
 
    uint256 public constant MaxAllocPoint = 4000;

    // Info of each pool.
    PoolInfo[] public poolInfo;
    // Info of each user that stakes 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;
    // The block time when Pana mining starts.
    uint256 public startTime;
    // The block time when Pana mining stops.
    uint256 public endTime;

    // Escrow that holds rewards
    address public escrow;

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

    constructor(
        address _pana,
        address _escrow,
        uint256 _panaPerSecond,
        uint256 _startTime,
        uint256 _endTime,
        address _authority
    ) PanaAccessControlled(IPanaAuthority(_authority)) {
        require(_pana != address(0), "Zero address: PANA");
        PANA = IERC20(_pana);
        escrow = _escrow;
        panaPerSecond = _panaPerSecond;
        startTime = _startTime;
        endTime = _endTime;

        totalAllocPoint = 0;
    }

    function poolLength() external view returns (uint256) {
        return poolInfo.length;
    }

    function checkForDuplicate(IERC20 _token) internal view {
        uint256 length = poolInfo.length;
        for (uint256 _pid = 0; _pid < length; _pid++) {
            require(poolInfo[_pid].token != _token, "Pool already exists!");
        }
    }

    // Sets new escrow address
    function setEscrow(address _escrow) external onlyGovernor {
        escrow = _escrow;
    }

    // Add a new pool.
    function add(uint256 _allocPoint, IERC20 _token) external onlyGovernor {
        require(_allocPoint <= MaxAllocPoint, "Too many alloc points!");

        checkForDuplicate(_token); // ensure you can't add duplicate pools
        massUpdatePools();

        uint256 lastRewardTime = block.timestamp > startTime ? block.timestamp : startTime;
        totalAllocPoint = totalAllocPoint + _allocPoint;
        poolInfo.push(PoolInfo({
            token: _token,
            allocPoint: _allocPoint,
            lastRewardTime: lastRewardTime,
            accPanaPerShare: 0
        }));
    }

    // Update the given pool's allocation point.
    function set(uint256 _pid, uint256 _allocPoint) external onlyGovernor {
        require(_allocPoint <= MaxAllocPoint, "Too many alloc points!");

        massUpdatePools();

        totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint;
        poolInfo[_pid].allocPoint = _allocPoint;
    }

    // Return reward multiplier over the given _from to _to timestamp.
    function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) {
        _from = _from > startTime ? _from : startTime;
        if (_to < startTime || _from >= endTime) {
            return 0;
        } else if (_to <= endTime) {
            return _to - _from;
        } else {
            return endTime - _from;
        }
    }

    // View function to see pending Pana on frontend.
    function pendingPana(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];

        uint256 accPanaPerShare = pool.accPanaPerShare;
        uint256 supply = pool.token.balanceOf(address(this));

        if (block.timestamp > pool.lastRewardTime && supply != 0) {
            uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp);
            uint256 panaReward = multiplier * panaPerSecond * pool.allocPoint / totalAllocPoint;
            accPanaPerShare = accPanaPerShare + panaReward * 1e12 / supply;
        }

        return user.amount * accPanaPerShare / 1e12 - user.rewardDebt;
    }

    function poolBalances(address _user) external view returns (uint256[] memory) {
        uint256 length = poolInfo.length;
        uint256[] memory poolBalanceData = new uint256[](length);

        for (uint256 _pid = 0; _pid < length; ++_pid) {
            UserInfo storage user = userInfo[_pid][_user];
            poolBalanceData[_pid] = user.amount;
        }
        return poolBalanceData;
    }

    // View function to see pending Pana on frontend.
    function pendingPanaForUser(address _user) external view returns (uint256[] memory) {
        uint256 length = poolInfo.length;
        uint256[] memory pendingPanaValues = new uint256[](length);

        for (uint256 _pid = 0; _pid < length; ++_pid) {
            PoolInfo storage pool = poolInfo[_pid];
            UserInfo storage user = userInfo[_pid][_user];
            uint256 accPanaPerShare = pool.accPanaPerShare;
            uint256 supply = pool.token.balanceOf(address(this));

            if (block.timestamp > pool.lastRewardTime && supply != 0) {
                uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp);
                uint256 panaReward = multiplier * panaPerSecond * pool.allocPoint / totalAllocPoint;
                accPanaPerShare = accPanaPerShare + panaReward * 1e12 / supply;
            }

            pendingPanaValues[_pid] = user.amount * accPanaPerShare / 1e12 - user.rewardDebt;
        }
        return pendingPanaValues;
    }

    // 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 supply = pool.token.balanceOf(address(this));
        if (supply == 0) {
            pool.lastRewardTime = block.timestamp;
            return;
        }

        uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp);
        uint256 panaReward = multiplier * panaPerSecond * pool.allocPoint / totalAllocPoint;

        pool.accPanaPerShare = pool.accPanaPerShare + panaReward * 1e12 / supply;
        pool.lastRewardTime = block.timestamp;
    }

    // Deposit tokens to staking.
    function deposit(uint256 _pid, uint256 _amount) external {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];

        updatePool(_pid);

        uint256 pending = user.amount * pool.accPanaPerShare / 1e12 - user.rewardDebt;

        user.amount = user.amount + _amount;
        user.rewardDebt = user.amount * pool.accPanaPerShare / 1e12;

        if(pending > 0) {
            PANA.safeTransferFrom(escrow, msg.sender, pending);
        }
        pool.token.safeTransferFrom(address(msg.sender), address(this), _amount);

        emit Deposit(msg.sender, _pid, _amount);
    }

    // Withdraw tokens from staking.
    function withdraw(uint256 _pid, uint256 _amount) external {  
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];

        require(user.amount >= _amount, "Insufficient funds");

        updatePool(_pid);

        uint256 pending = user.amount * pool.accPanaPerShare / 1e12 - user.rewardDebt;

        user.amount = user.amount - _amount;
        user.rewardDebt = user.amount * pool.accPanaPerShare / 1e12;

        if(pending > 0) {
            PANA.safeTransferFrom(escrow, msg.sender, pending);
        }
        pool.token.safeTransfer(address(msg.sender), _amount);
        
        emit Withdraw(msg.sender, _pid, _amount);
    }

    function harvestAll() public {
        uint256 length = poolInfo.length;
        uint calc;
        uint pending;
        UserInfo storage user;
        PoolInfo storage pool;
        uint totalPending;

        for (uint256 pid = 0; pid < length; ++pid) {
            user = userInfo[pid][msg.sender];
            if (user.amount > 0) {
                pool = poolInfo[pid];
                updatePool(pid);

                calc = user.amount * pool.accPanaPerShare / 1e12;
                pending = calc - user.rewardDebt;
                user.rewardDebt = calc;

                if(pending > 0) {
                    totalPending += pending;
                }
            }
        }

        if (totalPending > 0) {
            PANA.safeTransferFrom(escrow, msg.sender, totalPending);
        }
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];

        uint oldUserAmount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;

        pool.token.safeTransfer(address(msg.sender), oldUserAmount);
        emit EmergencyWithdraw(msg.sender, _pid, oldUserAmount);
    }

    function setStartTime(uint256 _newStartTime) external onlyGovernor {
        require(startTime > block.timestamp, "Already started");
        require(_newStartTime > block.timestamp, "New time in the past");

        startTime = _newStartTime;
    }

    function setEndTime(uint256 _newEndTime) external onlyGovernor {
        require(endTime > block.timestamp, "Already ended");
        require(_newEndTime > block.timestamp, "New end time in the past");

        endTime = _newEndTime;
    }

    function setPanaPerSecond(uint256 _panaPerSecond) external onlyGovernor {
        panaPerSecond = _panaPerSecond;
    }
}

File 5 of 5 : SafeERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.7.5;

import {IERC20} from "../interfaces/IERC20.sol";

/// @notice Safe IERC20 and ETH transfer library that safely handles missing return values.
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v3-periphery/blob/main/contracts/libraries/TransferHelper.sol)
/// Taken from Solmate
library SafeERC20 {
    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, amount)
        );

        require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(IERC20.transfer.selector, to, amount)
        );

        require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FAILED");
    }

    function safeApprove(
        IERC20 token,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(IERC20.approve.selector, to, amount)
        );

        require(success && (data.length == 0 || abi.decode(data, (bool))), "APPROVE_FAILED");
    }

    function safeTransferETH(address to, uint256 amount) internal {
        (bool success, ) = to.call{value: amount}(new bytes(0));

        require(success, "ETH_TRANSFER_FAILED");
    }
}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "none",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 800
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_pana","type":"address"},{"internalType":"address","name":"_escrow","type":"address"},{"internalType":"uint256","name":"_panaPerSecond","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"address","name":"_authority","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IPanaAuthority","name":"authority","type":"address"}],"name":"AuthorityUpdated","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":"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":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MaxAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PANA","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"authority","outputs":[{"internalType":"contract IPanaAuthority","name":"","type":"address"}],"stateMutability":"view","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":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"escrow","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"panaPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingPana","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingPanaForUser","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"poolBalances","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":"accPanaPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","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":"contract IPanaAuthority","name":"_newAuthority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newEndTime","type":"uint256"}],"name":"setEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_escrow","type":"address"}],"name":"setEscrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_panaPerSecond","type":"uint256"}],"name":"setPanaPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newStartTime","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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"}]

60e0604052600c60a08190526b15539055551213d49256915160a21b60c09081526200002f91600091906200013a565b503480156200003d57600080fd5b5060405162002087380380620020878339810160408190526200006091620001fd565b600180546001600160a01b0319166001600160a01b0383169081179091556040518291907f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a2506001600160a01b038616620000fb5760405162461bcd60e51b81526020600482015260126024820152715a65726f20616464726573733a2050414e4160701b604482015260640160405180910390fd5b506001600160a01b03948516608052600880546001600160a01b03191694909516939093179093556002556006919091556007556000600555620002a0565b828054620001489062000263565b90600052602060002090601f0160209004810192826200016c5760008555620001b7565b82601f106200018757805160ff1916838001178555620001b7565b82800160010185558215620001b7579182015b82811115620001b75782518255916020019190600101906200019a565b50620001c5929150620001c9565b5090565b5b80821115620001c55760008155600101620001ca565b80516001600160a01b0381168114620001f857600080fd5b919050565b60008060008060008060c087890312156200021757600080fd5b6200022287620001e0565b95506200023260208801620001e0565b94506040870151935060608701519250608087015191506200025760a08801620001e0565b90509295509295509295565b600181811c908216806200027857607f821691505b602082108114156200029a57634e487b7160e01b600052602260045260246000fd5b50919050565b608051611db6620002d1600039600081816102cc01528181610b4401528181610ffd01526117360152611db66000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806378e97925116100f9578063b55d269411610097578063ccb98ffc11610071578063ccb98ffc146103f0578063e2bbb15814610403578063e2fdcc1714610416578063f4b83c4c1461042957600080fd5b8063b55d2694146103b7578063bf7e214f146103ca578063c10c3546146103dd57600080fd5b80638ed955b9116100d35780638ed955b9146103355780639155ccc81461033d57806393f1a40b1461035d578063af7ac3d9146103a457600080fd5b806378e97925146103065780637a9e5e4b1461030f5780638dbb1e3a1461032257600080fd5b80633e0a322d116101665780635312ea8e116101405780635312ea8e146102a3578063630b5ba1146102b657806367df6019146102be57806377e93ca8146102c757600080fd5b80633e0a322d1461026a578063441a3e701461027d57806351eb05a61461029057600080fd5b806317caf6f1116101a257806317caf6f1146102325780631ab06ee51461023b5780632b8bbbe81461024e5780633197cbb61461026157600080fd5b8063081e3eda146101c957806312cfa125146101e05780631526fe27146101f5575b600080fd5b6003545b6040519081526020015b60405180910390f35b6101f36101ee366004611ab6565b610432565b005b610208610203366004611ab6565b6104ec565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101d7565b6101cd60055481565b6101f3610249366004611acf565b610530565b6101f361025c366004611b09565b6106a6565b6101cd60075481565b6101f3610278366004611ab6565b6108d6565b6101f361028b366004611acf565b610a27565b6101f361029e366004611ab6565b610bc3565b6101f36102b1366004611ab6565b610cf3565b6101f3610d92565b6101cd60025481565b6102ee7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101d7565b6101cd60065481565b6101f361031d366004611b39565b610dbd565b6101cd610330366004611acf565b610ec0565b6101f3610f24565b61035061034b366004611b39565b61102f565b6040516101d79190611b5d565b61038f61036b366004611b09565b60046020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101d7565b6101cd6103b2366004611b09565b6110e3565b6103506103c5366004611b39565b611252565b6001546102ee906001600160a01b031681565b6101f36103eb366004611b39565b611440565b6101f36103fe366004611ab6565b61151b565b6101f3610411366004611acf565b61166c565b6008546102ee906001600160a01b031681565b6101cd610fa081565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104a99190611ba1565b6001600160a01b0316336001600160a01b0316146000906104e65760405162461bcd60e51b81526004016104dd9190611bbe565b60405180910390fd5b50600255565b600381815481106104fc57600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a79190611ba1565b6001600160a01b0316336001600160a01b0316146000906105db5760405162461bcd60e51b81526004016104dd9190611bbe565b50610fa081111561062e5760405162461bcd60e51b815260206004820152601660248201527f546f6f206d616e7920616c6c6f6320706f696e7473210000000000000000000060448201526064016104dd565b610636610d92565b806003838154811061064a5761064a611c66565b9060005260206000209060040201600101546005546106699190611c92565b6106739190611ca9565b600581905550806003838154811061068d5761068d611c66565b9060005260206000209060040201600101819055505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071d9190611ba1565b6001600160a01b0316336001600160a01b0316146000906107515760405162461bcd60e51b81526004016104dd9190611bbe565b50610fa08211156107a45760405162461bcd60e51b815260206004820152601660248201527f546f6f206d616e7920616c6c6f6320706f696e7473210000000000000000000060448201526064016104dd565b6107ad816117ab565b6107b5610d92565b600060065442116107c8576006546107ca565b425b9050826005546107da9190611ca9565b600555604080516080810182526001600160a01b0393841681526020810194855290810191825260006060820181815260038054600181018255925291517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b6004909202918201805473ffffffffffffffffffffffffffffffffffffffff1916919095161790935592517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c830155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d82015590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e90910155565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094d9190611ba1565b6001600160a01b0316336001600160a01b0316146000906109815760405162461bcd60e51b81526004016104dd9190611bbe565b5042600654116109d35760405162461bcd60e51b815260206004820152600f60248201527f416c72656164792073746172746564000000000000000000000000000000000060448201526064016104dd565b428111610a225760405162461bcd60e51b815260206004820152601460248201527f4e65772074696d6520696e20746865207061737400000000000000000000000060448201526064016104dd565b600655565b600060038381548110610a3c57610a3c611c66565b6000918252602080832086845260048083526040808620338752909352919093208054929091029092019250831115610ab75760405162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e742066756e6473000000000000000000000000000060448201526064016104dd565b610ac084610bc3565b6000816001015464e8d4a5100084600301548460000154610ae19190611cc1565b610aeb9190611ce0565b610af59190611c92565b8254909150610b05908590611c92565b808355600384015464e8d4a5100091610b1e9190611cc1565b610b289190611ce0565b60018301558015610b6e57600854610b6e906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691163384611855565b8254610b84906001600160a01b03163386611986565b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568906020015b60405180910390a35050505050565b600060038281548110610bd857610bd8611c66565b9060005260206000209060040201905080600201544211610bf7575050565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c639190611d02565b905080610c7557504260029091015550565b6000610c85836002015442610ec0565b90506000600554846001015460025484610c9f9190611cc1565b610ca99190611cc1565b610cb39190611ce0565b905082610cc58264e8d4a51000611cc1565b610ccf9190611ce0565b8460030154610cde9190611ca9565b60038501555050426002909201919091555050565b600060038281548110610d0857610d08611c66565b60009182526020808320858452600480835260408086203380885294528520805486825560018201969096559302018054909450919291610d55916001600160a01b039091169083611986565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a350505050565b60035460005b81811015610db957610da981610bc3565b610db281611d1b565b9050610d98565b5050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e349190611ba1565b6001600160a01b0316336001600160a01b031614600090610e685760405162461bcd60e51b81526004016104dd9190611bbe565b506001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a250565b60006006548311610ed357600654610ed5565b825b9250600654821080610ee957506007548310155b15610ef657506000610f1e565b6007548211610f1057610f098383611c92565b9050610f1e565b82600754610f099190611c92565b92915050565b600354600080808080805b86811015610fe55760008181526004602090815260408083203384529091529020805490945015610fd55760038181548110610f6d57610f6d611c66565b90600052602060002090600402019250610f8681610bc3565b6003830154845464e8d4a5100091610f9d91611cc1565b610fa79190611ce0565b9550836001015486610fb99190611c92565b6001850187905594508415610fd557610fd28583611ca9565b91505b610fde81611d1b565b9050610f2f565b50801561102757600854611027906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691163384611855565b505050505050565b60035460609060008167ffffffffffffffff81111561105057611050611d36565b604051908082528060200260200182016040528015611079578160200160208202803683370190505b50905060005b828110156110db5760008181526004602090815260408083206001600160a01b03891684529091529020805483518490849081106110bf576110bf611c66565b6020908102919091010152506110d481611d1b565b905061107f565b509392505050565b600080600384815481106110f9576110f9611c66565b60009182526020808320878452600480835260408086206001600160a01b038a8116885294528086209482029092016003810154815493516370a0823160e01b8152309381019390935290965093949291909116906370a0823190602401602060405180830381865afa158015611174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111989190611d02565b90508360020154421180156111ac57508015155b1561121a5760006111c1856002015442610ec0565b905060006005548660010154600254846111db9190611cc1565b6111e59190611cc1565b6111ef9190611ce0565b9050826112018264e8d4a51000611cc1565b61120b9190611ce0565b6112159085611ca9565b935050505b6001830154835464e8d4a5100090611233908590611cc1565b61123d9190611ce0565b6112479190611c92565b979650505050505050565b60035460609060008167ffffffffffffffff81111561127357611273611d36565b60405190808252806020026020018201604052801561129c578160200160208202803683370190505b50905060005b828110156110db576000600382815481106112bf576112bf611c66565b60009182526020808320858452600480835260408086206001600160a01b038d8116885294528086209482029092016003810154815493516370a0823160e01b8152309381019390935290965093949291909116906370a0823190602401602060405180830381865afa15801561133a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135e9190611d02565b905083600201544211801561137257508015155b156113e0576000611387856002015442610ec0565b905060006005548660010154600254846113a19190611cc1565b6113ab9190611cc1565b6113b59190611ce0565b9050826113c78264e8d4a51000611cc1565b6113d19190611ce0565b6113db9085611ca9565b935050505b6001830154835464e8d4a51000906113f9908590611cc1565b6114039190611ce0565b61140d9190611c92565b86868151811061141f5761141f611c66565b602002602001018181525050505050508061143990611d1b565b90506112a2565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa158015611493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b79190611ba1565b6001600160a01b0316336001600160a01b0316146000906114eb5760405162461bcd60e51b81526004016104dd9190611bbe565b506008805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa15801561156e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115929190611ba1565b6001600160a01b0316336001600160a01b0316146000906115c65760405162461bcd60e51b81526004016104dd9190611bbe565b5042600754116116185760405162461bcd60e51b815260206004820152600d60248201527f416c726561647920656e6465640000000000000000000000000000000000000060448201526064016104dd565b4281116116675760405162461bcd60e51b815260206004820152601860248201527f4e657720656e642074696d6520696e207468652070617374000000000000000060448201526064016104dd565b600755565b60006003838154811061168157611681611c66565b600091825260208083208684526004808352604080862033875290935291909320910290910191506116b284610bc3565b6000816001015464e8d4a51000846003015484600001546116d39190611cc1565b6116dd9190611ce0565b6116e79190611c92565b82549091506116f7908590611ca9565b808355600384015464e8d4a51000916117109190611cc1565b61171a9190611ce0565b6001830155801561176057600854611760906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691163384611855565b8254611777906001600160a01b0316333087611855565b604051848152859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1590602001610bb4565b60035460005b8181101561185057826001600160a01b0316600382815481106117d6576117d6611c66565b60009182526020909120600490910201546001600160a01b0316141561183e5760405162461bcd60e51b815260206004820152601460248201527f506f6f6c20616c7265616479206578697374732100000000000000000000000060448201526064016104dd565b8061184881611d1b565b9150506117b1565b505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b17905291516000928392908816916118ce9190611d4c565b6000604051808303816000865af19150503d806000811461190b576040519150601f19603f3d011682016040523d82523d6000602084013e611910565b606091505b509150915081801561193a57508051158061193a57508080602001905181019061193a9190611d87565b6110275760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016104dd565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b17905291516000928392908716916119f79190611d4c565b6000604051808303816000865af19150503d8060008114611a34576040519150601f19603f3d011682016040523d82523d6000602084013e611a39565b606091505b5091509150818015611a63575080511580611a63575080806020019051810190611a639190611d87565b611aaf5760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016104dd565b5050505050565b600060208284031215611ac857600080fd5b5035919050565b60008060408385031215611ae257600080fd5b50508035926020909101359150565b6001600160a01b0381168114611b0657600080fd5b50565b60008060408385031215611b1c57600080fd5b823591506020830135611b2e81611af1565b809150509250929050565b600060208284031215611b4b57600080fd5b8135611b5681611af1565b9392505050565b6020808252825182820181905260009190848201906040850190845b81811015611b9557835183529284019291840191600101611b79565b50909695505050505050565b600060208284031215611bb357600080fd5b8151611b5681611af1565b600060208083526000845481600182811c915080831680611be057607f831692505b858310811415611bfe57634e487b7160e01b85526022600452602485fd5b878601838152602001818015611c1b5760018114611c2c57611c57565b60ff19861682528782019650611c57565b60008b81526020902060005b86811015611c5157815484820152908501908901611c38565b83019750505b50949998505050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015611ca457611ca4611c7c565b500390565b60008219821115611cbc57611cbc611c7c565b500190565b6000816000190483118215151615611cdb57611cdb611c7c565b500290565b600082611cfd57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611d1457600080fd5b5051919050565b6000600019821415611d2f57611d2f611c7c565b5060010190565b634e487b7160e01b600052604160045260246000fd5b6000825160005b81811015611d6d5760208186018101518583015201611d53565b81811115611d7c576000828501525b509190910192915050565b600060208284031215611d9957600080fd5b81518015158114611b5657600080fdfea164736f6c634300080a000a000000000000000000000000369eb8197062093a20402935d3a707b4ae414e9d000000000000000000000000a178776d7b05931e31b2b955dd97436f08046cfe0000000000000000000000000000000000000000000000000807f7f3d17642200000000000000000000000000000000000000000000000000000000062fa6d8000000000000000000000000000000000000000000000000000000000634ad900000000000000000000000000cc654fbb3c1b12be82d36bc9c7e1ce075a422f80

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

000000000000000000000000369eb8197062093a20402935d3a707b4ae414e9d000000000000000000000000a178776d7b05931e31b2b955dd97436f08046cfe0000000000000000000000000000000000000000000000000807f7f3d17642200000000000000000000000000000000000000000000000000000000062fa6d8000000000000000000000000000000000000000000000000000000000634ad900000000000000000000000000cc654fbb3c1b12be82d36bc9c7e1ce075a422f80

-----Decoded View---------------
Arg [0] : _pana (address): 0x369eb8197062093a20402935d3a707b4ae414e9d
Arg [1] : _escrow (address): 0xa178776d7b05931e31b2b955dd97436f08046cfe
Arg [2] : _panaPerSecond (uint256): 578703703703700000
Arg [3] : _startTime (uint256): 1660579200
Arg [4] : _endTime (uint256): 1665849600
Arg [5] : _authority (address): 0xcc654fbb3c1b12be82d36bc9c7e1ce075a422f80

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000369eb8197062093a20402935d3a707b4ae414e9d
Arg [1] : 000000000000000000000000a178776d7b05931e31b2b955dd97436f08046cfe
Arg [2] : 0000000000000000000000000000000000000000000000000807f7f3d1764220
Arg [3] : 0000000000000000000000000000000000000000000000000000000062fa6d80
Arg [4] : 00000000000000000000000000000000000000000000000000000000634ad900
Arg [5] : 000000000000000000000000cc654fbb3c1b12be82d36bc9c7e1ce075a422f80


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.