Contract 0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e 3

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x4bd97b347036d2374c2be01c6d5084887996046144797aa2bf14929a8ae95c5eWithdraw All112148622021-09-25 6:20:503 days 3 hrs ago0x5542fa7da7f619c3e32fb0d7ed9d2c6c6f214828 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.00046647
0x7924410df3d4ebb302748ed37e58269a400160e67b3dca157c55160ed5346d2bWithdraw All111830102021-09-24 3:41:554 days 6 hrs ago0x084b980b64c2d78de04d1db8bdf5611acf488cec IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000524825
0xbb37a23b9af06e5c307a9d2496a4d345e0b4397d4de758fc09fbf1b61f246782Withdraw All111339872021-09-22 10:34:395 days 23 hrs ago0xa1a6962f8f787e9cd48f57c8a2dfa00e9ea569b5 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000449825
0xa2b9c4310cb6b4f8f5cc36b8e93b8ca03e49c6988e697d8f8dd685ddb523e7d6Withdraw All111313212021-09-22 8:20:426 days 1 hr ago0x40f31a7a0dd2eba908ff8d4ca0e57a25bdc04d26 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000388725
0x8c78518be1478ba5a23996889fa82942147db739e316431cb84b1f4640b5f9f2Withdraw All111267592021-09-22 4:30:516 days 5 hrs ago0xc93028eb06b02c90bea187456bc2e2f3431d10ac IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000524825
0x4e63abd44c2900019e6ea828553e8daae5d1c05ba9dee4d68e90ac05b3ac2030Withdraw All110627282021-09-19 22:54:368 days 11 hrs ago0x2acd27782703cbe218b926a2e68460b1701292da IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000524825
0x23587cd98050074c5bc14ce50cfcb4ef161b5e0de61f3642882e1247e4ec5ce9Withdraw All110607892021-09-19 21:17:398 days 13 hrs ago0x2bddff6666317c895cc43097b6b1acc68cba6d4e IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000388725
0xe62e158ea027467efd279379bbbf6ce2537115f14522d74ec56d22f016a0b8e6Withdraw All110481092021-09-19 10:38:048 days 23 hrs ago0x81eb886a521efd0e269a309b147a042774e5d1f3 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000449825
0x205700ce3aab0a38a6b2b6fffccd8e9a3a449da9a87bf6fab9a93b66b340a39eWithdraw All109806752021-09-17 2:11:3611 days 8 hrs ago0x08ccff06b09d0c17235ab9b0de1dbfeeceef2b5a IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.00039341
0x77b217220cfdfb170dbf36a2f90e54085476cb66316324371c7ce1df3c5477dfWithdraw All109725032021-09-16 19:22:5611 days 14 hrs ago0x64bdfa0dd6356d409b234bb76a6b66b848c33b97 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000388725
0x58b10b4a933e1cfb30f491a1a7c5c77b24979869360c2f848903cce4aa036b39Withdraw All109693012021-09-16 16:42:0311 days 17 hrs ago0xddcc6a7c9f53a437f4d6515bdf058b029e8e1169 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000449825
0x3fa2c113dc0361065eb32062ed68f0a918bedd90136a81a75e631d5b4c4febd6Withdraw All109657952021-09-16 13:46:2211 days 20 hrs ago0x6e0aa392ba94d05c0e06187c76d5ee3b47782de8 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.00046841
0x786891d8d486feeaac310eaa48b5c781686613eda6e00b915b353272036221baWithdraw All109613992021-09-16 10:05:2512 days 12 mins ago0x96aedaaac73153201a36e543297be3224e81f81f IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000449825
0x19e10ab42418ee80954e0a48ff78565844de673287494be3a53fc58d7d321aa1Withdraw All109301752021-09-15 7:57:2013 days 2 hrs ago0x4e1b2d7b8ac16abebc1dfa1a3b274f5f07d93a41 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000449825
0xc7b3f51cac5723b75ec0c14d6426f357caa576016022fd76b3055d6563acc189Withdraw All109232082021-09-15 2:08:3513 days 8 hrs ago0x171f4e639933ca28adc8e1a2b1eb0770f029b419 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000388725
0xad1b8c55e17dc13abb6e907e2d64b8ec9fd54d1d602835c9a8ec0b12e7d08101Withdraw All109131552021-09-14 17:45:1213 days 16 hrs ago0xb42284d98937a2dd55803a7bfd7dc3b73e41de28 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.00044979
0x0c08afdd7d27e5a1b55c2a67ed95fb7bdc3fadfc9c3a582dafcd21195fdabdcdWithdraw All109069012021-09-14 12:30:5913 days 21 hrs ago0x728ec5d858eb5f9c676234dfae806e1c357e470c IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000463725
0xfd7a26e0e0feae2cd8a38e27949e25febc59281d462b1c642a5345db4edb44a5Withdraw All109063902021-09-14 12:05:1213 days 22 hrs ago0xb0bbec66befc0e008633eaaac31a8414fb949984 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000524825
0x45973781f86cbcec92779e864f8d217a19610fe1060610f0e6f5e87efdf0f262Withdraw All108518622021-09-12 14:33:4515 days 19 hrs ago0x4c182f66f8a4901481a8ee9c2f2afea85716a6af IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000449825
0x661d2360922bc4e5f463740d9af954d7fdbdafd77f136dd9a4bc725e85a444b5Withdraw All107607302021-09-09 9:54:0119 days 23 mins ago0x575c9c7de56d8254c66ca69964d03cd31e6b6e39 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000388725
0x80d3eaeeb94cf35f6b05020f8815a24aaa3ddd5894ff2625d574db629eda39e0Withdraw All107433902021-09-08 19:20:3319 days 14 hrs ago0x380c2b3019b8ee0a921b469b598cdbb16ea87d27 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000388725
0x6f3eceaaf4461b45f53f2ce7496ce7b2ef44ccf7decc91c1f8cf44387c4611e9Withdraw All107425732021-09-08 18:38:0619 days 15 hrs ago0xc0682d80cb3c6bc921f3f4672f814b6b4d476a70 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000449825
0x79d5f09f58e9ae9bbccadf7f7ffb91174a47e56a6bc645fb6dc41058982b7fa9Withdraw All107093672021-09-07 14:28:0720 days 19 hrs ago0x636b90c059acdaab018fb56b0f3813ec110adf5a IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000524825
0xa5c3e817638f32ff5384392c190a61f7503f56af76ed0dd62b1ad4ec3b52d168Withdraw All106912842021-09-06 23:10:2321 days 11 hrs ago0x67443683d43bde8274acc78b3e8ce6ec6f72a1a6 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000388725
0xe5a0df21d61874de085b4b7c4165fb3f5cf7afd73e2b7c5bf4e75a171b07dce7Withdraw All106823772021-09-06 15:38:3921 days 18 hrs ago0x8cacb17f18ddf34ea35be228f30a2c41e8a11d75 IN  0x184d7b54685bb3df8dcf68233a6eb1d17d4f846e0 BNB0.000524825
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GrowStakingPool

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "../utils/Context.sol";
/**
 * @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.
 */
abstract 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 virtual 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 2 of 9 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.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, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @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) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * 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);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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 3 of 9 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.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 4 of 9 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

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

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

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

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

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

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

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

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

pragma solidity >=0.6.2 <0.8.0;

/**
 * @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 on 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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        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 6 of 9 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.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 7 of 9 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.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].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

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

    uint256 private _status;

    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 8 of 9 : GrowStakingPool.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "../interfaces/IGrow.sol";

contract GrowStakingPool is IGrowProfitReceiver, IGrowMembershipController, Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    uint256 constant _DECIMAL = 1e18;

    /// @notice Address of staking token (GROW)
    IERC20 public immutable stakingToken;
    /// @notice Address of reward token
    IERC20 public immutable rewardToken;

    uint256 public growLockedForMembership = 1e18;

    struct UserInfo {
        uint256 balance;
        uint256 lockedBalance;
        uint256 rewardDebt;
    }

    /// @notice User infos
    mapping(address => UserInfo) public users;

    /// @notice Reward distribute like MasterChef mode
    uint256 public accRewardPreShare;

    /// @notice Total supply of staking token
    uint256 public totalSupply;

    constructor(
        address rewarderAddress,
        address stakingTokenAddress,
        address rewardTokenAddress
    ) public {
        growRewarder = rewarderAddress;
        stakingToken = IERC20(stakingTokenAddress);
        rewardToken = IERC20(rewardTokenAddress);

        growDev = msg.sender;
    }

    // --------------------------------------------------------------
    // Misc
    // --------------------------------------------------------------

    /// @notice Grow Master
    address public growRewarder;

    modifier onlyGrowRewarder {
        require(msg.sender == address(growRewarder), "GrowStakingPool: caller is not on the GrowMaster");
        _;
    }

    function updateGrowRewarder(address _growRewarder) external onlyOwner {
        growRewarder = _growRewarder;
    }

    /// @dev grow developer
    address public growDev;

    /// @dev maybe transfer dev address to governance in future

    function updateDevAddress(address _devAddress) external {
        require(msg.sender == growDev, "dev: ?");

        // make sure _devAddress dont have balance
        require(users[_devAddress].balance == 0, "GrowStakingPool: dev account can't have any balance in current pool");
        require(users[_devAddress].lockedBalance == 0, "GrowStakingPool: dev account can't have any balance in current pool");

        // move balance to _devAddress
        users[_devAddress].balance = users[growDev].balance;
        users[_devAddress].lockedBalance = users[growDev].lockedBalance;
        users[_devAddress].rewardDebt = users[growDev].rewardDebt;

        // remove growDev balance
        users[growDev].balance = 0;
        users[growDev].lockedBalance = 0;
        users[growDev].rewardDebt = 0;

        growDev = _devAddress;
    }

    // --------------------------------------------------------------
    // Harvest!
    // --------------------------------------------------------------

    function _harvest(address userAddress) private {
        UserInfo storage user = users[userAddress];
        uint256 pendingRewardAmount = user.balance
            .mul(accRewardPreShare).div(_DECIMAL)
            .sub(user.rewardDebt);
        user.rewardDebt = user.balance.mul(accRewardPreShare).div(_DECIMAL);

        if (pendingRewardAmount > 0) {
            rewardToken.safeTransfer(userAddress, pendingRewardAmount);
        }

        emit LogHarvest(userAddress, pendingRewardAmount);
    }

    // --------------------------------------------------------------
    // Read Interface
    // --------------------------------------------------------------

    function pendingRewards(address userAddress) external view returns (uint256) {
        UserInfo storage user = users[userAddress];
        return user.balance.mul(accRewardPreShare).div(_DECIMAL).sub(user.rewardDebt);
    }

    function hasMembership(address userAddress) external view override returns (bool) {
        return users[userAddress].lockedBalance > 0;
    }

    // --------------------------------------------------------------
    // Membership Collector
    // --------------------------------------------------------------

    function addMembershipFee(uint256 balance) private {
        UserInfo storage user = users[growDev];

        _harvest(growDev);
        user.balance = user.balance.add(balance);
        user.rewardDebt = user.balance.mul(accRewardPreShare).div(_DECIMAL);
    }

    function removeMembershipFee(uint256 balance) private {
        UserInfo storage user = users[growDev];

        _harvest(growDev);
        user.balance = user.balance.sub(balance);
        user.rewardDebt = user.balance.mul(accRewardPreShare).div(_DECIMAL);
    }

    function harvestMembershipFee() external nonReentrant {
        _harvest(growDev);
    }

    function totalShares() public view returns(uint256) {
        return totalSupply;
    }

    function sharesOf(address userAddress) public view returns(uint256) {
        return users[userAddress].balance;
    }

    // --------------------------------------------------------------
    // Write Interface
    // --------------------------------------------------------------

    function getRewards() external nonReentrant {
        _harvest(msg.sender);
    }

    function deposit(uint256 amount) external nonReentrant {
        require(msg.sender != growDev, "GrowStakingPool: dev can not deposit");

        UserInfo storage user = users[msg.sender];

        _harvest(msg.sender);

        // 1. transfer
        stakingToken.safeTransferFrom(msg.sender, address(this), amount);

        if (user.lockedBalance == 0 && user.balance.add(amount) >= growLockedForMembership) {
            user.balance = user.balance.add(amount).sub(growLockedForMembership);
            user.lockedBalance = growLockedForMembership;
            addMembershipFee(growLockedForMembership);
        } else {
            user.balance = user.balance.add(amount);
        }

        // 2. write balance
        totalSupply = totalSupply.add(amount);
        user.rewardDebt = user.balance.mul(accRewardPreShare).div(_DECIMAL);

        emit LogDeposit(msg.sender, amount);
    }

    function _withdraw(uint256 amount) private {
        require(msg.sender != growDev, "GrowStakingPool: dev can not withdraw");

        UserInfo storage user = users[msg.sender];
        if (amount > user.balance.add(user.lockedBalance)) {
            amount = user.balance.add(user.lockedBalance);
        }

        _harvest(msg.sender);

        if (user.lockedBalance > 0 && user.balance < amount) {
            user.balance = user.balance.add(user.lockedBalance).sub(amount);
            removeMembershipFee(user.lockedBalance);
            user.lockedBalance = 0;
        } else {
            user.balance = user.balance.sub(amount);
        }

        // 1. write balance
        totalSupply = totalSupply.sub(amount);
        user.rewardDebt = user.balance.mul(accRewardPreShare).div(_DECIMAL);

        // 2. transfer
        stakingToken.safeTransfer(msg.sender, amount);

        emit LogWithdraw(msg.sender, amount);
    }

    function withdraw(uint256 amount) external nonReentrant {
        _withdraw(amount);
    }

    function withdrawAll() external nonReentrant {
        _withdraw(uint256(~0));
    }

    // --------------------------------------------------------------
    // Grow Rewarder Operations
    // --------------------------------------------------------------

    function pump(uint256 amount) external override onlyGrowRewarder {
        rewardToken.safeTransferFrom(msg.sender, address(this), amount);

        // Nobody share the rewards, take it to dev :P
        if (totalSupply == 0) {
            rewardToken.safeTransfer(growDev, amount);
        } else {
            accRewardPreShare = accRewardPreShare.add(
                amount.mul(_DECIMAL).div(totalSupply)
            );
        }

        emit LogPump(msg.sender, amount);
    }

    // --------------------------------------------------------------
    // Events
    // --------------------------------------------------------------
    event LogPump(address sender, uint256 amount);
    event LogDeposit(address user, uint256 amount);
    event LogWithdraw(address user, uint256 amount);
    event LogHarvest(address user, uint256 amount);

}

File 9 of 9 : IGrow.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

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

interface IGrowRewarder {
    function depositRewardAddReward(address strategyAddress, address userAddress, uint256 amountInNativeToken) external;
    function profitRewardAddReward(address strategyAddress, address profitToken, address userAddress, uint256 profitTokenAmount) external;
    function notifyUserSharesUpdate(address strategyAddress, address userAddress, uint256 sharesUpdateTo, bool isWithdraw) external;
    function getRewards(address strategyAddress, address userAddress) external;
}

interface IGrowProfitReceiver {
    function pump(uint256 amount) external;
}

interface IGrowMembershipController {
    function hasMembership(address userAddress) external view returns (bool);
}

interface IGrowStrategy {
    function totalShares() external view returns (uint256);
    function sharesOf(address userAddress) external view returns (uint256);

    function IS_EMERGENCY_MODE() external returns (bool);
}

Settings
{
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"rewarderAddress","type":"address"},{"internalType":"address","name":"stakingTokenAddress","type":"address"},{"internalType":"address","name":"rewardTokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogHarvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogPump","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogWithdraw","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"},{"inputs":[],"name":"accRewardPreShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"growDev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"growLockedForMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"growRewarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestMembershipFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"hasMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"pump","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"sharesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddress","type":"address"}],"name":"updateDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_growRewarder","type":"address"}],"name":"updateGrowRewarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"lockedBalance","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052670de0b6b3a764000060025534801561001c57600080fd5b50604051611e12380380611e128339818101604052606081101561003f57600080fd5b5080516020820151604090920151909190600061005a6100ef565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055600680546001600160a01b039094166001600160a01b03199485161790556001600160601b0319606092831b8116608052911b1660a05260078054909116331790556100f3565b3390565b60805160601c60a05160601c611cdd610135600039806108175280610864528061113452806111f152508061076b5280610d7d52806113c65250611cdd6000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80637eae56ad116100e3578063a88db6ad1161008c578063f2fde38b11610066578063f2fde38b146103b7578063f5eb42dc146103ea578063f7c618c11461041d5761018d565b8063a88db6ad14610320578063b6b55f2514610367578063d736902b146103845761018d565b80638da5cb5b116100bd5780638da5cb5b146102bf5780638e629c14146102c7578063a87430ba146102cf5761018d565b80637eae56ad1461027c5780638503376214610284578063853828b6146102b75761018d565b8063536318181161014557806372f702f31161011f57806372f702f31461024f578063745dae42146102575780637b8373ce146102745761018d565b8063536318181461020e57806365c8ef5d14610216578063715018a6146102475761018d565b80632e1a7d4d116101765780632e1a7d4d146101b657806331d7a262146101d35780633a98ef39146102065761018d565b80630572b0cc1461019257806318160ddd1461019c575b600080fd5b61019a610425565b005b6101a46104ab565b60408051918252519081900360200190f35b61019a600480360360208110156101cc57600080fd5b50356104b1565b6101a4600480360360208110156101e957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610538565b6101a4610597565b61019a61059d565b61021e610636565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61019a610652565b61021e610769565b61019a6004803603602081101561026d57600080fd5b503561078d565b6101a46108fa565b61021e610900565b61019a6004803603602081101561029a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661091c565b61019a610b52565b61021e610bf2565b6101a4610c0e565b610302600480360360208110156102e557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c14565b60408051938452602084019290925282820152519081900360600190f35b6103536004803603602081101561033657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c35565b604080519115158252519081900360200190f35b61019a6004803603602081101561037d57600080fd5b5035610c62565b61019a6004803603602081101561039a57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e7a565b61019a600480360360208110156103cd57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610f69565b6101a46004803603602081101561040057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661110a565b61021e611132565b6002600154141561049757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026001556104a533611156565b60018055565b60055481565b6002600154141561052357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026001556105318161126e565b5060018055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812060028101546004548254610590929161058a91670de0b6b3a764000091610584919061142c565b906114a8565b90611529565b9392505050565b60055490565b6002600154141561060f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026001556007546104a59073ffffffffffffffffffffffffffffffffffffffff16611156565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b61065a6115a0565b73ffffffffffffffffffffffffffffffffffffffff16610678610bf2565b73ffffffffffffffffffffffffffffffffffffffff16146106fa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b7f000000000000000000000000000000000000000000000000000000000000000081565b60065473ffffffffffffffffffffffffffffffffffffffff1633146107fd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180611c4e6030913960400191505060405180910390fd5b61083f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846115a4565b6005546108925760075461088d9073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811691168361163f565b6108bc565b6005546108b8906108af9061058484670de0b6b3a764000061142c565b600454906116d1565b6004555b604080513381526020810183905281517f2d747df60564d484a16a4bdb564d30b702cf2eab1c203e96d54a24097c52d69d929181900390910190a150565b60045481565b60075473ffffffffffffffffffffffffffffffffffffffff1681565b60075473ffffffffffffffffffffffffffffffffffffffff1633146109a257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f6465763a203f0000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205415610a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526043815260200180611bc46043913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090206001015415610a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526043815260200180611bc46043913960600191505060405180910390fd5b6007805473ffffffffffffffffffffffffffffffffffffffff908116600090815260036020526040808220549483168083528183209586558454841683528183206001908101548782015585548516845282842060029081015497810197909755855485168452828420849055855485168452828420018390558454909316825281209093019290925580547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b60026001541415610bc457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026001556104a57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61126e565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60025481565b60036020526000908152604090208054600182015460029092015490919083565b73ffffffffffffffffffffffffffffffffffffffff16600090815260036020526040902060010154151590565b60026001541415610cd457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260015560075473ffffffffffffffffffffffffffffffffffffffff16331415610d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180611b556024913960400191505060405180910390fd5b33600081815260036020526040902090610d6390611156565b610da573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330856115a4565b6001810154158015610dc457506002548154610dc190846116d1565b10155b15610df7576002548154610ddd919061058a90856116d1565b815560025460018201819055610df290611745565b610e06565b8054610e0390836116d1565b81555b600554610e1390836116d1565b6005556004548154610e3291670de0b6b3a7640000916105849161142c565b6002820155604080513381526020810184905281517f1b851e1031ef35a238e6c67d0c7991162390df915f70eaf9098dbf0b175a6198929181900390910190a1505060018055565b610e826115a0565b73ffffffffffffffffffffffffffffffffffffffff16610ea0610bf2565b73ffffffffffffffffffffffffffffffffffffffff1614610f2257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610f716115a0565b73ffffffffffffffffffffffffffffffffffffffff16610f8f610bf2565b73ffffffffffffffffffffffffffffffffffffffff161461101157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661107d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180611b796026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120600281015460045482549293926111a5929161058a91670de0b6b3a764000091610584919061142c565b90506111cc670de0b6b3a7640000610584600454856000015461142c90919063ffffffff16565b600283015580156112185761121873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016848361163f565b6040805173ffffffffffffffffffffffffffffffffffffffff851681526020810183905281517f4c8b77aa73a5c6c2ffb739719fae2d510d4917a2599984e4ad8c6c9015dbd839929181900390910190a1505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314156112df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611b9f6025913960400191505060405180910390fd5b336000908152600360205260409020600181015481546112fe916116d1565b8211156113185760018101548154611315916116d1565b91505b61132133611156565b600081600101541180156113355750805482115b1561136c576001810154815461135091849161058a916116d1565b81556001810154611360906117a9565b6000600182015561137b565b80546113789083611529565b81555b6005546113889083611529565b60055560045481546113a791670de0b6b3a7640000916105849161142c565b60028201556113ed73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016338461163f565b604080513381526020810184905281517f4ce7033d118120e254016dccf195288400b28fc8936425acd5f17ce2df3ab708929181900390910190a15050565b60008261143b575060006114a2565b8282028284828161144857fe5b041461149f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180611c2d6021913960400191505060405180910390fd5b90505b92915050565b600080821161151857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161152157fe5b049392505050565b60008282111561159a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3390565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526116399085906117e6565b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526116cc9084906117e6565b505050565b60008282018381101561149f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60075473ffffffffffffffffffffffffffffffffffffffff1660008181526003602052604090209061177690611156565b805461178290836116d1565b8082556004546117a091670de0b6b3a764000091610584919061142c565b60029091015550565b60075473ffffffffffffffffffffffffffffffffffffffff166000818152600360205260409020906117da90611156565b80546117829083611529565b6060611848826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166118be9092919063ffffffff16565b8051909150156116cc5780806020019051602081101561186757600080fd5b50516116cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180611c7e602a913960400191505060405180910390fd5b60606118cd84846000856118d5565b949350505050565b606082471015611930576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180611c076026913960400191505060405180910390fd5b61193985611a90565b6119a457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310611a0e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016119d1565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611a70576040519150601f19603f3d011682016040523d82523d6000602084013e611a75565b606091505b5091509150611a85828286611a96565b979650505050505050565b3b151590565b60608315611aa5575081610590565b825115611ab55782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611b19578181015183820152602001611b01565b50505050905090810190601f168015611b465780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe47726f775374616b696e67506f6f6c3a206465762063616e206e6f74206465706f7369744f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737347726f775374616b696e67506f6f6c3a206465762063616e206e6f7420776974686472617747726f775374616b696e67506f6f6c3a20646576206163636f756e742063616e2774206861766520616e792062616c616e636520696e2063757272656e7420706f6f6c416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7747726f775374616b696e67506f6f6c3a2063616c6c6572206973206e6f74206f6e207468652047726f774d61737465725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220e5b13c839ab5ea12c0eff18049cd73f68c1cd8b14c51ac050eaa418f91e0724464736f6c634300060c0033000000000000000000000000bafcac62f53275b4aa2d903ae4608d38e8f6733d0000000000000000000000008cef274596d334ffa10f8976a920ddc81ba6e29b000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

000000000000000000000000bafcac62f53275b4aa2d903ae4608d38e8f6733d0000000000000000000000008cef274596d334ffa10f8976a920ddc81ba6e29b000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Decoded View---------------
Arg [0] : rewarderAddress (address): 0xbafcac62f53275b4aa2d903ae4608d38e8f6733d
Arg [1] : stakingTokenAddress (address): 0x8cef274596d334ffa10f8976a920ddc81ba6e29b
Arg [2] : rewardTokenAddress (address): 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000bafcac62f53275b4aa2d903ae4608d38e8f6733d
Arg [1] : 0000000000000000000000008cef274596d334ffa10f8976a920ddc81ba6e29b
Arg [2] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


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.