Contract 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 1

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xd8cf6e559420fa5591c7e2764d99312dbe49ed7524941b862d978631a6e7cc23Withdraw All110879342021-09-20 19:57:242 hrs 27 mins ago0x6e872925c7d209bf9f03c1a71467876c9b7f168d IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001358345
0x25bfc35a6464c0f6c8629a1abc97987cd7f0ab07a0a751d4852a1c5c47efb987Withdraw All110804422021-09-20 13:42:328 hrs 41 mins ago0x118737ad6df512035c098a258b1132744392409c IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.00171009
0xc0bf85defdf83c344bfa613f10489933bc6cc7182f07a70c02bc982f979fdd29Withdraw All110637732021-09-19 23:46:5122 hrs 37 mins ago0x382e49310b2360ec48518bfd24cd850751bcb990 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.00163509
0x3600982695f76394874d88b54e8a50315367984bb64d6a0884078a222f9e5cedWithdraw All110592002021-09-19 19:58:111 day 2 hrs ago0xb785b147035c0371193a66ce9fa84fd565cc9679 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.000478455
0xff1edb975132134f7e1e3bf9d66e0d39d3749a0d4a83af124dcbe270e6c4a439Withdraw All110591962021-09-19 19:57:591 day 2 hrs ago0xb785b147035c0371193a66ce9fa84fd565cc9679 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001433345
0x0a4fbb4a0d53a13437525a80a80b45bef52e6bf76d90d6052da8ca7a19fa59b9Withdraw All110571362021-09-19 18:14:591 day 4 hrs ago0xb8e1885ec849681756e4610cd74f0c98fcd449e5 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001686665
0x23d36fa0da049047d6eeab102cb805e5435554c435bfd0798a5e59296054c309Withdraw All110570022021-09-19 18:08:171 day 4 hrs ago0x5f58cecd7f8609d4fb3c83a87d8f8f332c23979b IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001358345
0x1e3dcddd66784c5f87b5d6652fb28681ebf202c2996d164830ec31c9c0dd460bWithdraw All110568102021-09-19 17:58:411 day 4 hrs ago0xf7d948d780b49366b677833439367c9d2f7b9853 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001433345
0x20aeb7bc98a1cb3ce889728accd8316608fe812d1205e8376e6a181054087e5cWithdraw All110536012021-09-19 15:18:111 day 7 hrs ago0x99bac204bce2df57820274489f54a46e5483fa5e IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001358345
0xc9817d5c29b0778145366ed29eb6c3708a44da0e082ef6ddf1827355f52998caWithdraw All110533822021-09-19 15:07:121 day 7 hrs ago0x36e8315c2ec8cdb22ea8a1d4dffcc961296bc8d9 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.00163509
0xed19a444ec128ccae336dbfae75ed81e8910b39419ed555237ec606307ec2c76Withdraw All110279622021-09-18 17:41:092 days 4 hrs ago0x04468aa90e7712fe4da95ac5df93264b03436af9 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001433345
0x7f242105041a65c69a259d3bb2babc01875e8316b9abedb1763509de3529f3b6Withdraw All110203392021-09-18 11:17:432 days 11 hrs ago0xeaf0779fc290775f622ebed930f167d916d7e098 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001433345
0xe9d4c2298562586a4a502d9fdb786b6faf80ab2a7c60fa696921f0bea663ccfaWithdraw All110203012021-09-18 11:15:492 days 11 hrs ago0xeaf0779fc290775f622ebed930f167d916d7e098 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001891425
0x7c47d57f287d4ea6486a32803389b573a3df1d4c8b75e38a4356bb05e9b9cfbeWithdraw All110202662021-09-18 11:14:042 days 11 hrs ago0xeaf0779fc290775f622ebed930f167d916d7e098 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001891425
0x4a3d16003376cd83eb9159ed22b22ad1a6c383975726c083334f5b7e8db78985Withdraw All110178742021-09-18 9:14:142 days 13 hrs ago0xbf03f8ca52ef9edbc8cdde7c96d81a0e1ece542a IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001358345
0x3e4d31c2b9e30674b7f9842f76adf75f98ed3643fcc07c8a3e01a1633206bb09Withdraw All110167912021-09-18 8:19:582 days 14 hrs ago0xe3a7c1a3c46725f1de0a43f1ef15713e27fe53f0 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001433345
0xbffe333afe4e22b221eeb5c95ca2cfd896a7d7f45fb23a1b8c558d46102c4a9fWithdraw All110104002021-09-18 2:59:222 days 19 hrs ago0xb7b75b494fba13046a1d9518362f1d5fe7909f5d IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.00171009
0x6ecbae9346cd192d6a793485207f2a174587454fc37ea4d8bc6a4f71a8e7092dWithdraw All110087352021-09-18 1:36:032 days 20 hrs ago0xbdb3dbad3411cdd078803aa3cc9a995db7af38bf IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.00163509
0x56efa59e98ba2f811503d35491b147c6169cde11725f6a31c3b966b9237204e0Withdraw All110041312021-09-17 21:45:463 days 38 mins ago0xde6cb232646db05c1c54b9865d5c02467395c002 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.000478455
0x97e8c57ef1fb4072bd305324393e1009fb5d2877314e7ee679aa01a3d89461bfWithdraw All110041302021-09-17 21:45:433 days 38 mins ago0xde6cb232646db05c1c54b9865d5c02467395c002 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001334925
0x09bd4d34262deca2b363c0cc8021517aa555c8cca977918689d80e95390dea02Withdraw110041172021-09-17 21:45:043 days 39 mins ago0xde6cb232646db05c1c54b9865d5c02467395c002 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001481325
0x15fe7a2f6bb79efe1fd3140eb7d079e3f5bdd1612eebd1638a5f2dcb847b1d9cWithdraw All110016952021-09-17 19:43:553 days 2 hrs ago0x79c1f3f7e10f0c28df6377f898224d1b3e2d87e4 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.00171009
0xbba1b10c7285d6a7d514fd4b28fd386790e3cebb6004e83e516b55bb66880707Approve109987862021-09-17 17:18:283 days 5 hrs ago0xc85b2a896d76ea4478277052a70dbda5cf8acc27 IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.000072615
0x8a073f162370da8a0ec7d4d49430fcf765b9bb7c0f65790ab0108436989964a5Withdraw All109959352021-09-17 14:55:263 days 7 hrs ago0x53bbb8dd9e4fabfbeacb958ab5258305564167de IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.001686665
0x0b0391a1bdadf18d25a36fdd5d192a2f1a39130b97458d3aaf51b1aff4dc2618Withdraw All109958832021-09-17 14:52:503 days 7 hrs ago0xe42d20bd3b1790cff25765509c902b38388d8aaa IN  0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB0.00163509
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xacb361fa6a2c4568175452bed08db21a1213cd2613fc7d9d66a5eb0ba7358e8354712952021-03-07 11:57:42197 days 10 hrs ago 0xdda39b0a11de6e0ebce995d4a065960532eb332e 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB
0xb609f49bc7df42fe1e67b99a68623200d35109ad1bdfcc5d9b81e017c4fa655b54712842021-03-07 11:57:09197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0xb609f49bc7df42fe1e67b99a68623200d35109ad1bdfcc5d9b81e017c4fa655b54712842021-03-07 11:57:09197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 0xb40fc2359563ac63636f4f094c71521dc8ae81cb0 BNB
0xb609f49bc7df42fe1e67b99a68623200d35109ad1bdfcc5d9b81e017c4fa655b54712842021-03-07 11:57:09197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 0xb40fc2359563ac63636f4f094c71521dc8ae81cb0 BNB
0xb609f49bc7df42fe1e67b99a68623200d35109ad1bdfcc5d9b81e017c4fa655b54712842021-03-07 11:57:09197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0xb609f49bc7df42fe1e67b99a68623200d35109ad1bdfcc5d9b81e017c4fa655b54712842021-03-07 11:57:09197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0xb609f49bc7df42fe1e67b99a68623200d35109ad1bdfcc5d9b81e017c4fa655b54712842021-03-07 11:57:09197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0xb609f49bc7df42fe1e67b99a68623200d35109ad1bdfcc5d9b81e017c4fa655b54712842021-03-07 11:57:09197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0xb609f49bc7df42fe1e67b99a68623200d35109ad1bdfcc5d9b81e017c4fa655b54712842021-03-07 11:57:09197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 0xb40fc2359563ac63636f4f094c71521dc8ae81cb0 BNB
0xb609f49bc7df42fe1e67b99a68623200d35109ad1bdfcc5d9b81e017c4fa655b54712842021-03-07 11:57:09197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0x9239d56872a6b947b708719875387d95225c0a22311c32f6ef31050047148a7354712472021-03-07 11:55:18197 days 10 hrs ago 0xdda39b0a11de6e0ebce995d4a065960532eb332e 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab43730 BNB
0x91be2630bc0a1300cdb60649bb3d91f61fd958003ca1cf3e704fa7b6a1602bcb54712312021-03-07 11:54:30197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0x91be2630bc0a1300cdb60649bb3d91f61fd958003ca1cf3e704fa7b6a1602bcb54712312021-03-07 11:54:30197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 0xb40fc2359563ac63636f4f094c71521dc8ae81cb0 BNB
0x91be2630bc0a1300cdb60649bb3d91f61fd958003ca1cf3e704fa7b6a1602bcb54712312021-03-07 11:54:30197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 0xb40fc2359563ac63636f4f094c71521dc8ae81cb0 BNB
0x91be2630bc0a1300cdb60649bb3d91f61fd958003ca1cf3e704fa7b6a1602bcb54712312021-03-07 11:54:30197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0x91be2630bc0a1300cdb60649bb3d91f61fd958003ca1cf3e704fa7b6a1602bcb54712312021-03-07 11:54:30197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0x91be2630bc0a1300cdb60649bb3d91f61fd958003ca1cf3e704fa7b6a1602bcb54712312021-03-07 11:54:30197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0x91be2630bc0a1300cdb60649bb3d91f61fd958003ca1cf3e704fa7b6a1602bcb54712312021-03-07 11:54:30197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0x91be2630bc0a1300cdb60649bb3d91f61fd958003ca1cf3e704fa7b6a1602bcb54712312021-03-07 11:54:30197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 0xb40fc2359563ac63636f4f094c71521dc8ae81cb0 BNB
0x91be2630bc0a1300cdb60649bb3d91f61fd958003ca1cf3e704fa7b6a1602bcb54712312021-03-07 11:54:30197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0xe53738c1add1b31568116e3c6b7a1b705a7c7821e3898dab67f8b229fd0ebb1054712292021-03-07 11:54:24197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0xe53738c1add1b31568116e3c6b7a1b705a7c7821e3898dab67f8b229fd0ebb1054712292021-03-07 11:54:24197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 0xb40fc2359563ac63636f4f094c71521dc8ae81cb0 BNB
0xe53738c1add1b31568116e3c6b7a1b705a7c7821e3898dab67f8b229fd0ebb1054712292021-03-07 11:54:24197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 0xb40fc2359563ac63636f4f094c71521dc8ae81cb0 BNB
0xe53738c1add1b31568116e3c6b7a1b705a7c7821e3898dab67f8b229fd0ebb1054712292021-03-07 11:54:24197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
0xe53738c1add1b31568116e3c6b7a1b705a7c7821e3898dab67f8b229fd0ebb1054712292021-03-07 11:54:24197 days 10 hrs ago 0xe0b473c0dd6d7fea5b395c3ce7ffd4fef0ab4373 PancakeSwap: CAKE Token0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x2a33bC66c6609f1CD64FEfd87DB4c0ebc9EDF6F6

Contract Name:
BeefyVaultV4

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-02-12
*/

// File: @openzeppelin/contracts/GSN/Context.sol


pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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: @openzeppelin/contracts/math/SafeMath.sol


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: @openzeppelin/contracts/utils/Address.sol


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) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @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);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


pragma solidity ^0.6.0;





/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol


pragma solidity ^0.6.0;




/**
 * @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: @openzeppelin/contracts/utils/ReentrancyGuard.sol


pragma solidity ^0.6.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


pragma solidity ^0.6.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/BIFI/interfaces/beefy/IStrategy.sol


pragma solidity ^0.6.0;

interface IStrategy {
    function want() external view returns (address);
    function deposit() external;
    function withdraw(uint256) external;
    function balanceOf() external view returns (uint256);
    function harvest() external;
    function retireStrat() external;
}

// File: contracts/BIFI/vaults/BeefyVaultV4.sol


pragma solidity ^0.6.0;








/**
 * @dev Implementation of a vault to deposit funds for yield optimizing.
 * This is the contract that receives funds and that users interface with.
 * The yield optimizing strategy itself is implemented in a separate 'Strategy.sol' contract.
 */
contract BeefyVaultV4 is ERC20, Ownable, ReentrancyGuard {
    using SafeERC20 for IERC20;
    using Address for address;
    using SafeMath for uint256;

    struct StratCandidate {
        address implementation;
        uint proposedTime;
    }

    // The last proposed strategy to switch to.
    StratCandidate public stratCandidate; 
    // The strategy currently in use by the vault.
    address public strategy;
    // The token the vault accepts and looks to maximize.
    IERC20 public token;
    // The minimum time it has to pass before a strat candidate can be approved.
    uint256 public immutable approvalDelay;

    event NewStratCandidate(address implementation);
    event UpgradeStrat(address implementation);
    
    /**
     * @dev Sets the value of {token} to the token that the vault will
     * hold as underlying value. It initializes the vault's own 'moo' token.
     * This token is minted when someone does a deposit. It is burned in order
     * to withdraw the corresponding portion of the underlying assets.
     * @param _token the token to maximize.
     * @param _strategy the address of the strategy.
     * @param _name the name of the vault token.
     * @param _symbol the symbol of the vault token.
     * @param _approvalDelay the delay before a new strat can be approved.
     */
    constructor (
        address _token, 
        address _strategy, 
        string memory _name, 
        string memory _symbol, 
        uint256 _approvalDelay
    ) public ERC20(
        string(_name),
        string(_symbol)
    ) {
        token = IERC20(_token);
        strategy = _strategy;
        approvalDelay = _approvalDelay;
    }

    /**
     * @dev It calculates the total underlying value of {token} held by the system.
     * It takes into account the vault contract balance, the strategy contract balance
     *  and the balance deployed in other contracts as part of the strategy.
     */
    function balance() public view returns (uint) {
        return token.balanceOf(address(this)).add(IStrategy(strategy).balanceOf());
    }

    /**
     * @dev Custom logic in here for how much the vault allows to be borrowed.
     * We return 100% of tokens for now. Under certain conditions we might
     * want to keep some of the system funds at hand in the vault, instead
     * of putting them to work.
     */
    function available() public view returns (uint256) {
        return token.balanceOf(address(this));
    }

    /**
     * @dev Function for various UIs to display the current value of one of our yield tokens.
     * Returns an uint256 with 18 decimals of how much underlying asset one vault share represents.
     */
    function getPricePerFullShare() public view returns (uint256) {
        return balance().mul(1e18).div(totalSupply());
    }

    /**
     * @dev A helper function to call deposit() with all the sender's funds.
     */
    function depositAll() external {
        deposit(token.balanceOf(msg.sender));
    }

    /**
     * @dev The entrypoint of funds into the system. People deposit with this function
     * into the vault. The vault is then in charge of sending funds into the strategy.
     */
    function deposit(uint _amount) public nonReentrant {
        uint256 _pool = balance();
        token.safeTransferFrom(msg.sender, address(this), _amount);
        earn();
        uint256 _after = balance();
        _amount = _after.sub(_pool); // Additional check for deflationary tokens
        uint256 shares = 0;
        if (totalSupply() == 0) {
            shares = _amount;
        } else {
            shares = (_amount.mul(totalSupply())).div(_pool);
        }
        _mint(msg.sender, shares);
    }

    /**
     * @dev Function to send funds into the strategy and put them to work. It's primarily called
     * by the vault's deposit() function.
     */
    function earn() public {
        uint _bal = available();
        token.safeTransfer(strategy, _bal);
        IStrategy(strategy).deposit();
    }

    /**
     * @dev A helper function to call withdraw() with all the sender's funds.
     */
    function withdrawAll() external {
        withdraw(balanceOf(msg.sender));
    }

    /**
     * @dev Function to exit the system. The vault will withdraw the required tokens
     * from the strategy and pay up the token holder. A proportional number of IOU
     * tokens are burned in the process.
     */
    function withdraw(uint256 _shares) public {
        uint256 r = (balance().mul(_shares)).div(totalSupply());
        _burn(msg.sender, _shares);

        uint b = token.balanceOf(address(this));
        if (b < r) {
            uint _withdraw = r.sub(b);
            IStrategy(strategy).withdraw(_withdraw);
            uint _after = token.balanceOf(address(this));
            uint _diff = _after.sub(b);
            if (_diff < _withdraw) {
                r = b.add(_diff);
            }
        }

        token.safeTransfer(msg.sender, r);
    }

    /** 
     * @dev Sets the candidate for the new strat to use with this vault.
     * @param _implementation The address of the candidate strategy.  
     */
    function proposeStrat(address _implementation) public onlyOwner {
        stratCandidate = StratCandidate({ 
            implementation: _implementation,
            proposedTime: block.timestamp
         });

        emit NewStratCandidate(_implementation);
    }

    /** 
     * @dev It switches the active strat for the strat candidate. After upgrading, the 
     * candidate implementation is set to the 0x00 address, and proposedTime to a time 
     * happening in +100 years for safety. 
     */

    function upgradeStrat() public onlyOwner {
        require(stratCandidate.implementation != address(0), "There is no candidate");
        require(stratCandidate.proposedTime.add(approvalDelay) < block.timestamp, "Delay has not passed");
        
        emit UpgradeStrat(stratCandidate.implementation);

        IStrategy(strategy).retireStrat();
        strategy = stratCandidate.implementation;
        stratCandidate.implementation = address(0);
        stratCandidate.proposedTime = 5000000000;
        
        earn();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_strategy","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_approvalDelay","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"NewStratCandidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"UpgradeStrat","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approvalDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"available","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"proposeStrat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stratCandidate","outputs":[{"internalType":"address","name":"implementation","type":"address"},{"internalType":"uint256","name":"proposedTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradeStrat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b50604051620020f0380380620020f0833981810160405260a08110156200003757600080fd5b815160208301516040808501805191519395929483019291846401000000008211156200006357600080fd5b9083019060208201858111156200007957600080fd5b82516401000000008111828201881017156200009457600080fd5b82525081516020918201929091019080838360005b83811015620000c3578181015183820152602001620000a9565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011557600080fd5b9083019060208201858111156200012b57600080fd5b82516401000000008111828201881017156200014657600080fd5b82525081516020918201929091019080838360005b83811015620001755781810151838201526020016200015b565b50505050905090810190601f168015620001a35780820380516001836020036101000a031916815260200191505b5060405260209081015185519093508592508491620001c89160039185019062000294565b508051620001de90600490602084019062000294565b50506005805460ff19166012179055506000620001fa62000290565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600655600a80546001600160a01b039687166001600160a01b0319918216179091556009805495909616941693909317909355506080525062000330565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002d757805160ff191683800117855562000307565b8280016001018555821562000307579182015b8281111562000307578251825591602001919060010190620002ea565b506200031592915062000319565b5090565b5b808211156200031557600081556001016200031a565b608051611da06200035060003980610ef65280610fd55250611da06000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80638da5cb5b116100f9578063d389800f11610097578063e2d1e75c11610071578063e2d1e75c146104c5578063e6685244146104cd578063f2fde38b146104d5578063fc0c546a146104fb576101c4565b8063d389800f14610487578063dd62ed3e1461048f578063de5f6268146104bd576101c4565b8063a8c62e76116100d3578063a8c62e761461042e578063a9059cbb14610436578063b69ef8a814610462578063b6b55f251461046a576101c4565b80638da5cb5b146103d657806395d89b41146103fa578063a457c2d714610402576101c4565b806348a0d75411610166578063715018a611610140578063715018a61461039357806376dfabb81461039b57806377c7b8fc146103c6578063853828b6146103ce576101c4565b806348a0d7541461033f5780635b12ff9b1461034757806370a082311461036d576101c4565b806323b872dd116101a257806323b872dd146102a05780632e1a7d4d146102d6578063313ce567146102f55780633950935114610313576101c4565b806306fdde03146101c9578063095ea7b31461024657806318160ddd14610286575b600080fd5b6101d1610503565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561020b5781810151838201526020016101f3565b50505050905090810190601f1680156102385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102726004803603604081101561025c57600080fd5b506001600160a01b038135169060200135610599565b604080519115158252519081900360200190f35b61028e6105b7565b60408051918252519081900360200190f35b610272600480360360608110156102b657600080fd5b506001600160a01b038135811691602081013590911690604001356105bd565b6102f3600480360360208110156102ec57600080fd5b5035610644565b005b6102fd610828565b6040805160ff9092168252519081900360200190f35b6102726004803603604081101561032957600080fd5b506001600160a01b038135169060200135610831565b61028e61087f565b6102f36004803603602081101561035d57600080fd5b50356001600160a01b03166108fb565b61028e6004803603602081101561038357600080fd5b50356001600160a01b03166109c0565b6102f36109db565b6103a3610a88565b604080516001600160a01b03909316835260208301919091528051918290030190f35b61028e610a9d565b6102f3610ac3565b6103de610ad6565b604080516001600160a01b039092168252519081900360200190f35b6101d1610aea565b6102726004803603604081101561041857600080fd5b506001600160a01b038135169060200135610b4b565b6103de610bb3565b6102726004803603604081101561044c57600080fd5b506001600160a01b038135169060200135610bc2565b61028e610bd6565b6102f36004803603602081101561048057600080fd5b5035610cd2565b6102f3610db7565b61028e600480360360408110156104a557600080fd5b506001600160a01b0381358116916020013516610e4c565b6102f3610e77565b61028e610ef4565b6102f3610f18565b6102f3600480360360208110156104eb57600080fd5b50356001600160a01b031661111f565b6103de611228565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561058f5780601f106105645761010080835404028352916020019161058f565b820191906000526020600020905b81548152906001019060200180831161057257829003601f168201915b5050505050905090565b60006105ad6105a6611237565b848461123b565b5060015b92915050565b60025490565b60006105ca848484611327565b61063a846105d6611237565b61063585604051806060016040528060288152602001611c6a602891396001600160a01b038a16600090815260016020526040812090610614611237565b6001600160a01b031681526020810191909152604001600020549190611482565b61123b565b5060019392505050565b60006106696106516105b7565b6106638461065d610bd6565b90611519565b90611579565b905061067533836115bb565b600a54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156106c057600080fd5b505afa1580156106d4573d6000803e3d6000fd5b505050506040513d60208110156106ea57600080fd5b505190508181101561080c57600061070283836116b7565b60095460408051632e1a7d4d60e01b81526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b15801561075257600080fd5b505af1158015610766573d6000803e3d6000fd5b5050600a54604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b1580156107b757600080fd5b505afa1580156107cb573d6000803e3d6000fd5b505050506040513d60208110156107e157600080fd5b5051905060006107f182856116b7565b9050828110156108085761080584826116f9565b94505b5050505b600a54610823906001600160a01b03163384611753565b505050565b60055460ff1690565b60006105ad61083e611237565b84610635856001600061084f611237565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906116f9565b600a54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156108ca57600080fd5b505afa1580156108de573d6000803e3d6000fd5b505050506040513d60208110156108f457600080fd5b5051905090565b610903611237565b60055461010090046001600160a01b03908116911614610958576040805162461bcd60e51b81526020600482018190526024820152600080516020611c92833981519152604482015290519081900360640190fd5b6040805180820182526001600160a01b038316808252426020928301819052600780546001600160a01b03191683179055600855825190815291517f1aae2ec5647db56da2d513de40528ba3565c6057525637050660c4323bbac7df9281900390910190a150565b6001600160a01b031660009081526020819052604090205490565b6109e3611237565b60055461010090046001600160a01b03908116911614610a38576040805162461bcd60e51b81526020600482018190526024820152600080516020611c92833981519152604482015290519081900360640190fd5b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6007546008546001600160a01b039091169082565b6000610abe610aaa6105b7565b610663670de0b6b3a764000061065d610bd6565b905090565b610ad4610acf336109c0565b610644565b565b60055461010090046001600160a01b031690565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561058f5780601f106105645761010080835404028352916020019161058f565b60006105ad610b58611237565b8461063585604051806060016040528060258152602001611d466025913960016000610b82611237565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611482565b6009546001600160a01b031681565b60006105ad610bcf611237565b8484611327565b6000610abe600960009054906101000a90046001600160a01b03166001600160a01b031663722713f76040518163ffffffff1660e01b815260040160206040518083038186803b158015610c2957600080fd5b505afa158015610c3d573d6000803e3d6000fd5b505050506040513d6020811015610c5357600080fd5b5051600a54604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610ca057600080fd5b505afa158015610cb4573d6000803e3d6000fd5b505050506040513d6020811015610cca57600080fd5b5051906116f9565b60026006541415610d2a576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026006556000610d39610bd6565b600a54909150610d54906001600160a01b03163330856117a5565b610d5c610db7565b6000610d66610bd6565b9050610d7281836116b7565b92506000610d7e6105b7565b610d89575082610da2565b610d9f83610663610d986105b7565b8790611519565b90505b610dac3382611805565b505060016006555050565b6000610dc161087f565b600954600a54919250610de1916001600160a01b03908116911683611753565b600960009054906101000a90046001600160a01b03166001600160a01b031663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e3157600080fd5b505af1158015610e45573d6000803e3d6000fd5b5050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600a54604080516370a0823160e01b81523360048201529051610ad4926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610ec357600080fd5b505afa158015610ed7573d6000803e3d6000fd5b505050506040513d6020811015610eed57600080fd5b5051610cd2565b7f000000000000000000000000000000000000000000000000000000000000000081565b610f20611237565b60055461010090046001600160a01b03908116911614610f75576040805162461bcd60e51b81526020600482018190526024820152600080516020611c92833981519152604482015290519081900360640190fd5b6007546001600160a01b0316610fca576040805162461bcd60e51b81526020600482015260156024820152745468657265206973206e6f2063616e64696461746560581b604482015290519081900360640190fd5b6008544290610ff9907f00000000000000000000000000000000000000000000000000000000000000006116f9565b10611042576040805162461bcd60e51b815260206004820152601460248201527311195b185e481a185cc81b9bdd081c185cdcd95960621b604482015290519081900360640190fd5b600754604080516001600160a01b039092168252517f7f37d440e85aba7fbf641c4bda5ca4ef669a80bffaacde2aa8d9feb1b048c82c9181900360200190a1600960009054906101000a90046001600160a01b03166001600160a01b031663fb6177876040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156110d157600080fd5b505af11580156110e5573d6000803e3d6000fd5b505060078054600980546001600160a01b03199081166001600160a01b03841617909155169055505064012a05f200600855610ad4610db7565b611127611237565b60055461010090046001600160a01b0390811691161461117c576040805162461bcd60e51b81526020600482018190526024820152600080516020611c92833981519152604482015290519081900360640190fd5b6001600160a01b0381166111c15760405162461bcd60e51b8152600401808060200182810382526026815260200180611bdb6026913960400191505060405180910390fd5b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600a546001600160a01b031681565b3390565b6001600160a01b0383166112805760405162461bcd60e51b8152600401808060200182810382526024815260200180611cf86024913960400191505060405180910390fd5b6001600160a01b0382166112c55760405162461bcd60e51b8152600401808060200182810382526022815260200180611c016022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661136c5760405162461bcd60e51b8152600401808060200182810382526025815260200180611cd36025913960400191505060405180910390fd5b6001600160a01b0382166113b15760405162461bcd60e51b8152600401808060200182810382526023815260200180611b966023913960400191505060405180910390fd5b6113bc838383610823565b6113f981604051806060016040528060268152602001611c23602691396001600160a01b0386166000908152602081905260409020549190611482565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461142890826116f9565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156115115760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156114d65781810151838201526020016114be565b50505050905090810190601f1680156115035780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082611528575060006105b1565b8282028284828161153557fe5b04146115725760405162461bcd60e51b8152600401808060200182810382526021815260200180611c496021913960400191505060405180910390fd5b9392505050565b600061157283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506118f5565b6001600160a01b0382166116005760405162461bcd60e51b8152600401808060200182810382526021815260200180611cb26021913960400191505060405180910390fd5b61160c82600083610823565b61164981604051806060016040528060228152602001611bb9602291396001600160a01b0385166000908152602081905260409020549190611482565b6001600160a01b03831660009081526020819052604090205560025461166f90826116b7565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600061157283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611482565b600082820183811015611572576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261082390849061195a565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526117ff90859061195a565b50505050565b6001600160a01b038216611860576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61186c60008383610823565b60025461187990826116f9565b6002556001600160a01b03821660009081526020819052604090205461189f90826116f9565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600081836119445760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156114d65781810151838201526020016114be565b50600083858161195057fe5b0495945050505050565b60606119af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611a0b9092919063ffffffff16565b805190915015610823578080602001905160208110156119ce57600080fd5b50516108235760405162461bcd60e51b815260040180806020018281038252602a815260200180611d1c602a913960400191505060405180910390fd5b6060611a1a8484600085611a22565b949350505050565b6060611a2d85611b8f565b611a7e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611abd5780518252601f199092019160209182019101611a9e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611b1f576040519150601f19603f3d011682016040523d82523d6000602084013e611b24565b606091505b50915091508115611b38579150611a1a9050565b805115611b485780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156114d65781810151838201526020016114be565b3b15159056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207f6622debe997b32ac106d38e3d03a1ded7a1077642d5be112ff3aec87e02e9764736f6c634300060c00330000000000000000000000000e09fabb73bd3ade0a17ecc321fd13a19e81ce82000000000000000000000000c4c291b76f9ad94f0ce57e7a5e629d81a02bb1c900000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000000000000d4d6f6f204175746f2043414b450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106d6f6f4175746f43616b65466978656400000000000000000000000000000000

Deployed ByteCode Sourcemap

35640:6341:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17395:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19501:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19501:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;18470:100;;;:::i;:::-;;;;;;;;;;;;;;;;20144:321;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20144:321:0;;;;;;;;;;;;;;;;;:::i;40174:566::-;;;;;;;;;;;;;;;;-1:-1:-1;40174:566:0;;:::i;:::-;;18322:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20874:218;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20874:218:0;;;;;;;;:::i;38062:107::-;;;:::i;40913:271::-;;;;;;;;;;;;;;;;-1:-1:-1;40913:271:0;-1:-1:-1;;;;;40913:271:0;;:::i;18633:119::-;;;;;;;;;;;;;;;;-1:-1:-1;18633:119:0;-1:-1:-1;;;;;18633:119:0;;:::i;34361:148::-;;;:::i;35952:36::-;;;:::i;:::-;;;;-1:-1:-1;;;;;35952:36:0;;;;;;;;;;;;;;;;;;;;;38391:126;;;:::i;39854:82::-;;;:::i;33719:79::-;;;:::i;:::-;;;;-1:-1:-1;;;;;33719:79:0;;;;;;;;;;;;;;17597:87;;;:::i;21595:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21595:269:0;;;;;;;;:::i;36048:23::-;;;:::i;18965:175::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18965:175:0;;;;;;;;:::i;37632:139::-;;;:::i;38909:523::-;;;;;;;;;;;;;;;;-1:-1:-1;38909:523:0;;:::i;39599:150::-;;;:::i;19203:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19203:151:0;;;;;;;;;;:::i;38621:86::-;;;:::i;36245:38::-;;;:::i;41436:542::-;;;:::i;34664:244::-;;;;;;;;;;;;;;;;-1:-1:-1;34664:244:0;-1:-1:-1;;;;;34664:244:0;;:::i;36137:19::-;;;:::i;17395:83::-;17465:5;17458:12;;;;;;;;-1:-1:-1;;17458:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17432:13;;17458:12;;17465:5;;17458:12;;17465:5;17458:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17395:83;:::o;19501:169::-;19584:4;19601:39;19610:12;:10;:12::i;:::-;19624:7;19633:6;19601:8;:39::i;:::-;-1:-1:-1;19658:4:0;19501:169;;;;;:::o;18470:100::-;18550:12;;18470:100;:::o;20144:321::-;20250:4;20267:36;20277:6;20285:9;20296:6;20267:9;:36::i;:::-;20314:121;20323:6;20331:12;:10;:12::i;:::-;20345:89;20383:6;20345:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20345:19:0;;;;;;:11;:19;;;;;;20365:12;:10;:12::i;:::-;-1:-1:-1;;;;;20345:33:0;;;;;;;;;;;;-1:-1:-1;20345:33:0;;;:89;:37;:89::i;:::-;20314:8;:121::i;:::-;-1:-1:-1;20453:4:0;20144:321;;;;;:::o;40174:566::-;40227:9;40239:43;40268:13;:11;:13::i;:::-;40240:22;40254:7;40240:9;:7;:9::i;:::-;:13;;:22::i;:::-;40239:28;;:43::i;:::-;40227:55;;40293:26;40299:10;40311:7;40293:5;:26::i;:::-;40341:5;;:30;;;-1:-1:-1;;;40341:30:0;;40365:4;40341:30;;;;;;40332:6;;-1:-1:-1;;;;;40341:5:0;;:15;;:30;;;;;;;;;;;;;;:5;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40341:30:0;;-1:-1:-1;40386:5:0;;;40382:305;;;40408:14;40425:8;:1;40431;40425:5;:8::i;:::-;40458;;40448:39;;;-1:-1:-1;;;40448:39:0;;;;;;;;;;40408:25;;-1:-1:-1;;;;;;40458:8:0;;;;40448:28;;:39;;;;;40458:8;;40448:39;;;;;;;;40458:8;;40448:39;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40516:5:0;;:30;;;-1:-1:-1;;;40516:30:0;;40540:4;40516:30;;;;;;40502:11;;-1:-1:-1;;;;;;40516:5:0;;;;-1:-1:-1;40516:15:0;;:30;;;;;;;;;;;;;;:5;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40516:30:0;;-1:-1:-1;40561:10:0;40574:13;40516:30;40585:1;40574:10;:13::i;:::-;40561:26;;40614:9;40606:5;:17;40602:74;;;40648:12;:1;40654:5;40648;:12::i;:::-;40644:16;;40602:74;40382:305;;;;40699:5;;:33;;-1:-1:-1;;;;;40699:5:0;40718:10;40730:1;40699:18;:33::i;:::-;40174:566;;;:::o;18322:83::-;18388:9;;;;18322:83;:::o;20874:218::-;20962:4;20979:83;20988:12;:10;:12::i;:::-;21002:7;21011:50;21050:10;21011:11;:25;21023:12;:10;:12::i;:::-;-1:-1:-1;;;;;21011:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21011:25:0;;;:34;;;;;;;;;;;:38;:50::i;38062:107::-;38131:5;;:30;;;-1:-1:-1;;;38131:30:0;;38155:4;38131:30;;;;;;38104:7;;-1:-1:-1;;;;;38131:5:0;;:15;;:30;;;;;;;;;;;;;;:5;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38131:30:0;;-1:-1:-1;38062:107:0;:::o;40913:271::-;33941:12;:10;:12::i;:::-;33931:6;;;;;-1:-1:-1;;;;;33931:6:0;;;:22;;;33923:67;;;;;-1:-1:-1;;;33923:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33923:67:0;;;;;;;;;;;;;;;41005:119:::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;41005:119:0;::::1;::::0;;;41096:15:::1;41005:119;::::0;;::::1;::::0;;;40988:14:::1;:136:::0;;-1:-1:-1;;;;;;40988:136:0::1;::::0;::::1;::::0;;;;41142:34;;;;;;;::::1;::::0;;;;;;;;::::1;40913:271:::0;:::o;18633:119::-;-1:-1:-1;;;;;18726:18:0;18699:7;18726:18;;;;;;;;;;;;18633:119::o;34361:148::-;33941:12;:10;:12::i;:::-;33931:6;;;;;-1:-1:-1;;;;;33931:6:0;;;:22;;;33923:67;;;;;-1:-1:-1;;;33923:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33923:67:0;;;;;;;;;;;;;;;34452:6:::1;::::0;34431:40:::1;::::0;34468:1:::1;::::0;34452:6:::1;::::0;::::1;-1:-1:-1::0;;;;;34452:6:0::1;::::0;34431:40:::1;::::0;34468:1;;34431:40:::1;34482:6;:19:::0;;-1:-1:-1;;;;;;34482:19:0::1;::::0;;34361:148::o;35952:36::-;;;;;-1:-1:-1;;;;;35952:36:0;;;;;:::o;38391:126::-;38444:7;38471:38;38495:13;:11;:13::i;:::-;38471:19;38485:4;38471:9;:7;:9::i;:38::-;38464:45;;38391:126;:::o;39854:82::-;39897:31;39906:21;39916:10;39906:9;:21::i;:::-;39897:8;:31::i;:::-;39854:82::o;33719:79::-;33784:6;;;;;-1:-1:-1;;;;;33784:6:0;;33719:79::o;17597:87::-;17669:7;17662:14;;;;;;;;-1:-1:-1;;17662:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17636:13;;17662:14;;17669:7;;17662:14;;17669:7;17662:14;;;;;;;;;;;;;;;;;;;;;;;;21595:269;21688:4;21705:129;21714:12;:10;:12::i;:::-;21728:7;21737:96;21776:15;21737:96;;;;;;;;;;;;;;;;;:11;:25;21749:12;:10;:12::i;:::-;-1:-1:-1;;;;;21737:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21737:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;36048:23::-;;;-1:-1:-1;;;;;36048:23:0;;:::o;18965:175::-;19051:4;19068:42;19078:12;:10;:12::i;:::-;19092:9;19103:6;19068:9;:42::i;37632:139::-;37672:4;37696:67;37741:8;;;;;;;;;-1:-1:-1;;;;;37741:8:0;-1:-1:-1;;;;;37731:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37731:31:0;37696:5;;:30;;;-1:-1:-1;;;37696:30:0;;37720:4;37696:30;;;;;;-1:-1:-1;;;;;37696:5:0;;;;:15;;:30;;;;;37731:31;;37696:30;;;;;;;;:5;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37696:30:0;;:34;:67::i;38909:523::-;31672:1;32278:7;;:19;;32270:63;;;;;-1:-1:-1;;;32270:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31672:1;32411:7;:18;38971:13:::1;38987:9;:7;:9::i;:::-;39007:5;::::0;38971:25;;-1:-1:-1;39007:58:0::1;::::0;-1:-1:-1;;;;;39007:5:0::1;39030:10;39050:4;39057:7:::0;39007:22:::1;:58::i;:::-;39076:6;:4;:6::i;:::-;39093:14;39110:9;:7;:9::i;:::-;39093:26:::0;-1:-1:-1;39140:17:0::1;39093:26:::0;39151:5;39140:10:::1;:17::i;:::-;39130:27;;39212:14;39245:13;:11;:13::i;:::-;39241:148;;-1:-1:-1::0;39289:7:0;39241:148:::1;;;39338:39;39371:5;39339:26;39351:13;:11;:13::i;:::-;39339:7:::0;;:11:::1;:26::i;39338:39::-;39329:48;;39241:148;39399:25;39405:10;39417:6;39399:5;:25::i;:::-;-1:-1:-1::0;;31628:1:0;32590:7;:22;-1:-1:-1;;38909:523:0:o;39599:150::-;39633:9;39645:11;:9;:11::i;:::-;39686:8;;39667:5;;39633:23;;-1:-1:-1;39667:34:0;;-1:-1:-1;;;;;39667:5:0;;;;39686:8;39633:23;39667:18;:34::i;:::-;39722:8;;;;;;;;;-1:-1:-1;;;;;39722:8:0;-1:-1:-1;;;;;39712:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39599:150;:::o;19203:151::-;-1:-1:-1;;;;;19319:18:0;;;19292:7;19319:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19203:151::o;38621:86::-;38671:5;;:27;;;-1:-1:-1;;;38671:27:0;;38687:10;38671:27;;;;;;38663:36;;-1:-1:-1;;;;;38671:5:0;;:15;;:27;;;;;;;;;;;;;;:5;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38671:27:0;38663:7;:36::i;36245:38::-;;;:::o;41436:542::-;33941:12;:10;:12::i;:::-;33931:6;;;;;-1:-1:-1;;;;;33931:6:0;;;:22;;;33923:67;;;;;-1:-1:-1;;;33923:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33923:67:0;;;;;;;;;;;;;;;41496:14:::1;:29:::0;-1:-1:-1;;;;;41496:29:0::1;41488:77;;;::::0;;-1:-1:-1;;;41488:77:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41488:77:0;;;;;;;;;;;;;::::1;;41584:27:::0;;41633:15:::1;::::0;41584:46:::1;::::0;41616:13:::1;41584:31;:46::i;:::-;:64;41576:97;;;::::0;;-1:-1:-1;;;41576:97:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41576:97:0;;;;;;;;;;;;;::::1;;41712:14;:29:::0;41699:43:::1;::::0;;-1:-1:-1;;;;;41712:29:0;;::::1;41699:43:::0;;;::::1;::::0;;;;::::1;::::0;;::::1;41765:8;;;;;;;;;-1:-1:-1::0;;;;;41765:8:0::1;-1:-1:-1::0;;;;;41755:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41810:14:0::1;:29:::0;;41799:8:::1;:40:::0;;-1:-1:-1;;;;;;41799:40:0;;::::1;-1:-1:-1::0;;;;;41810:29:0;::::1;41799:40;::::0;;;41850:42:::1;::::0;;-1:-1:-1;;41933:10:0::1;41903:27:::0;:40;41964:6:::1;:4;:6::i;34664:244::-:0;33941:12;:10;:12::i;:::-;33931:6;;;;;-1:-1:-1;;;;;33931:6:0;;;:22;;;33923:67;;;;;-1:-1:-1;;;33923:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33923:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34753:22:0;::::1;34745:73;;;;-1:-1:-1::0;;;34745:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34855:6;::::0;34834:38:::1;::::0;-1:-1:-1;;;;;34834:38:0;;::::1;::::0;34855:6:::1;::::0;::::1;;::::0;34834:38:::1;::::0;;;::::1;34883:6;:17:::0;;-1:-1:-1;;;;;34883:17:0;;::::1;;;-1:-1:-1::0;;;;;;34883:17:0;;::::1;::::0;;;::::1;::::0;;34664:244::o;36137:19::-;;;-1:-1:-1;;;;;36137:19:0;;:::o;624:106::-;712:10;624:106;:::o;24740:346::-;-1:-1:-1;;;;;24842:19:0;;24834:68;;;;-1:-1:-1;;;24834:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24921:21:0;;24913:68;;;;-1:-1:-1;;;24913:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24994:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25046:32;;;;;;;;;;;;;;;;;24740:346;;;:::o;22354:539::-;-1:-1:-1;;;;;22460:20:0;;22452:70;;;;-1:-1:-1;;;22452:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22541:23:0;;22533:71;;;;-1:-1:-1;;;22533:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22617:47;22638:6;22646:9;22657:6;22617:20;:47::i;:::-;22697:71;22719:6;22697:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22697:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;22677:17:0;;;:9;:17;;;;;;;;;;;:91;;;;22802:20;;;;;;;:32;;22827:6;22802:24;:32::i;:::-;-1:-1:-1;;;;;22779:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;22850:35;;;;;;;22779:20;;22850:35;;;;;;;;;;;;;22354:539;;;:::o;5605:192::-;5691:7;5727:12;5719:6;;;;5711:29;;;;-1:-1:-1;;;5711:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5763:5:0;;;5605:192::o;6056:471::-;6114:7;6359:6;6355:47;;-1:-1:-1;6389:1:0;6382:8;;6355:47;6426:5;;;6430:1;6426;:5;:1;6450:5;;;;;:10;6442:56;;;;-1:-1:-1;;;6442:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6518:1;6056:471;-1:-1:-1;;;6056:471:0:o;7003:132::-;7061:7;7088:39;7092:1;7095;7088:39;;;;;;;;;;;;;;;;;:3;:39::i;23884:418::-;-1:-1:-1;;;;;23968:21:0;;23960:67;;;;-1:-1:-1;;;23960:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24040:49;24061:7;24078:1;24082:6;24040:20;:49::i;:::-;24123:68;24146:6;24123:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24123:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;24102:18:0;;:9;:18;;;;;;;;;;:89;24217:12;;:24;;24234:6;24217:16;:24::i;:::-;24202:12;:39;24257:37;;;;;;;;24283:1;;-1:-1:-1;;;;;24257:37:0;;;;;;;;;;;;23884:418;;:::o;5166:136::-;5224:7;5251:43;5255:1;5258;5251:43;;;;;;;;;;;;;;;;;:3;:43::i;4702:181::-;4760:7;4792:5;;;4816:6;;;;4808:46;;;;;-1:-1:-1;;;4808:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26866:177;26976:58;;;-1:-1:-1;;;;;26976:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26976:58:0;-1:-1:-1;;;26976:58:0;;;26949:86;;26969:5;;26949:19;:86::i;27051:205::-;27179:68;;;-1:-1:-1;;;;;27179:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27179:68:0;-1:-1:-1;;;27179:68:0;;;27152:96;;27172:5;;27152:19;:96::i;:::-;27051:205;;;;:::o;23174:378::-;-1:-1:-1;;;;;23258:21:0;;23250:65;;;;;-1:-1:-1;;;23250:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23328:49;23357:1;23361:7;23370:6;23328:20;:49::i;:::-;23405:12;;:24;;23422:6;23405:16;:24::i;:::-;23390:12;:39;-1:-1:-1;;;;;23461:18:0;;:9;:18;;;;;;;;;;;:30;;23484:6;23461:22;:30::i;:::-;-1:-1:-1;;;;;23440:18:0;;:9;:18;;;;;;;;;;;:51;;;;23507:37;;;;;;;23440:18;;:9;;23507:37;;;;;;;;;;23174:378;;:::o;7631:278::-;7717:7;7752:12;7745:5;7737:28;;;;-1:-1:-1;;;7737:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7776:9;7792:1;7788;:5;;;;;;;7631:278;-1:-1:-1;;;;;7631:278:0:o;29171:761::-;29595:23;29621:69;29649:4;29621:69;;;;;;;;;;;;;;;;;29629:5;-1:-1:-1;;;;;29621:27:0;;;:69;;;;;:::i;:::-;29705:17;;29595:95;;-1:-1:-1;29705:21:0;29701:224;;29847:10;29836:30;;;;;;;;;;;;;;;-1:-1:-1;29836:30:0;29828:85;;;;-1:-1:-1;;;29828:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12844:196;12947:12;12979:53;13002:6;13010:4;13016:1;13019:12;12979:22;:53::i;:::-;12972:60;12844:196;-1:-1:-1;;;;12844:196:0:o;14221:979::-;14351:12;14384:18;14395:6;14384:10;:18::i;:::-;14376:60;;;;;-1:-1:-1;;;14376:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14510:12;14524:23;14551:6;-1:-1:-1;;;;;14551:11:0;14571:8;14582:4;14551:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14551:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14509:78;;;;14602:7;14598:595;;;14633:10;-1:-1:-1;14626:17:0;;-1:-1:-1;14626:17:0;14598:595;14747:17;;:21;14743:439;;15010:10;15004:17;15071:15;15058:10;15054:2;15050:19;15043:44;14958:148;15146:20;;-1:-1:-1;;;15146:20:0;;;;;;;;;;;;;;;;;15153:12;;15146:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9926:422;10293:20;10332:8;;;9926:422::o

Swarm Source

ipfs://7f6622debe997b32ac106d38e3d03a1ded7a1077642d5be112ff3aec87e02e97
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
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.