ETH Price: $2,869.23 (-2.71%)

Contract

0x89db3B59381bC06FE9BF74532Afd777e5F78Ef02

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Deposit1322153672023-09-18 12:23:03860 days ago1695039783IN
Hundred Finance: Backstop Masterchef
0 ETH0.000033060.1
Withdraw And Har...1189135022023-08-07 3:11:19902 days ago1691377879IN
Hundred Finance: Backstop Masterchef
0 ETH0.000044640.1
Harvest1189134612023-08-07 3:11:08902 days ago1691377868IN
Hundred Finance: Backstop Masterchef
0 ETH0.000035540.1
Withdraw And Har...1153832562023-07-27 7:26:01913 days ago1690442761IN
Hundred Finance: Backstop Masterchef
0 ETH0.000058880.1
Harvest1153824312023-07-27 7:22:35913 days ago1690442555IN
Hundred Finance: Backstop Masterchef
0 ETH0.000044980.1
Harvest1110214592023-07-14 5:27:42926 days ago1689312462IN
Hundred Finance: Backstop Masterchef
0 ETH0.000037860.1
Withdraw And Har...1085462842023-07-06 20:09:07934 days ago1688674147IN
Hundred Finance: Backstop Masterchef
0 ETH0.000082670.1
Deposit1066938752023-07-01 5:43:51939 days ago1688190231IN
Hundred Finance: Backstop Masterchef
0 ETH0.000051880.1
Withdraw And Har...1049950532023-06-26 5:13:00944 days ago1687756380IN
Hundred Finance: Backstop Masterchef
0 ETH0.000053360.1
Harvest1043328982023-06-24 5:30:56946 days ago1687584656IN
Hundred Finance: Backstop Masterchef
0 ETH0.000032590.1
Deposit1043323952023-06-24 5:28:39946 days ago1687584519IN
Hundred Finance: Backstop Masterchef
0 ETH0.00004560.1
Deposit852489832023-04-28 18:08:271003 days ago1682705307IN
Hundred Finance: Backstop Masterchef
0 ETH0.000098470.1
Withdraw And Har...808623972023-04-15 23:19:571016 days ago1681600797IN
Hundred Finance: Backstop Masterchef
0 ETH0.000067150.1
Withdraw And Har...808537172023-04-15 22:42:431016 days ago1681598563IN
Hundred Finance: Backstop Masterchef
0 ETH0.000064190.1
Withdraw And Har...807946552023-04-15 18:34:351016 days ago1681583675IN
Hundred Finance: Backstop Masterchef
0 ETH0.000077850.1
Withdraw And Har...807429152023-04-15 15:00:461016 days ago1681570846IN
Hundred Finance: Backstop Masterchef
0 ETH0.000062310.10191
Withdraw And Har...807378652023-04-15 14:40:011016 days ago1681569601IN
Hundred Finance: Backstop Masterchef
0 ETH0.000070690.1
Deposit803950792023-04-14 14:42:091017 days ago1681483329IN
Hundred Finance: Backstop Masterchef
0 ETH0.000078720.1
Withdraw And Har...803944462023-04-14 14:39:341017 days ago1681483174IN
Hundred Finance: Backstop Masterchef
0 ETH0.00007510.1
Harvest802834352023-04-14 6:59:321017 days ago1681455572IN
Hundred Finance: Backstop Masterchef
0 ETH0.000062810.1
Harvest801154802023-04-13 19:05:501018 days ago1681412750IN
Hundred Finance: Backstop Masterchef
0 ETH0.00006920.1
Deposit801030022023-04-13 18:13:181018 days ago1681409598IN
Hundred Finance: Backstop Masterchef
0 ETH0.000090990.1
Withdraw And Har...797225372023-04-12 15:20:331019 days ago1681312833IN
Hundred Finance: Backstop Masterchef
0 ETH0.000068980.1
Harvest789164192023-04-10 6:53:011021 days ago1681109581IN
Hundred Finance: Backstop Masterchef
0 ETH0.000047960.1
Deposit782055122023-04-08 4:51:171023 days ago1680929477IN
Hundred Finance: Backstop Masterchef
0 ETH0.000061620.1
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
687120052023-03-11 2:21:131052 days ago1678501273
Hundred Finance: Backstop Masterchef
0 ETH
687120052023-03-11 2:21:131052 days ago1678501273
Hundred Finance: Backstop Masterchef
0 ETH
687120052023-03-11 2:21:131052 days ago1678501273
Hundred Finance: Backstop Masterchef
0 ETH
687120052023-03-11 2:21:131052 days ago1678501273
Hundred Finance: Backstop Masterchef
0 ETH
687120052023-03-11 2:21:131052 days ago1678501273
Hundred Finance: Backstop Masterchef
0 ETH
687120052023-03-11 2:21:131052 days ago1678501273
Hundred Finance: Backstop Masterchef
0 ETH
659976222023-03-02 8:07:171060 days ago1677744437
Hundred Finance: Backstop Masterchef
0 ETH
659976222023-03-02 8:07:171060 days ago1677744437
Hundred Finance: Backstop Masterchef
0 ETH
659976222023-03-02 8:07:171060 days ago1677744437
Hundred Finance: Backstop Masterchef
0 ETH
659976222023-03-02 8:07:171060 days ago1677744437
Hundred Finance: Backstop Masterchef
0 ETH
659976222023-03-02 8:07:171060 days ago1677744437
Hundred Finance: Backstop Masterchef
0 ETH
659976222023-03-02 8:07:171060 days ago1677744437
Hundred Finance: Backstop Masterchef
0 ETH
656350832023-03-01 5:19:591061 days ago1677647999
Hundred Finance: Backstop Masterchef
0 ETH
656350832023-03-01 5:19:591061 days ago1677647999
Hundred Finance: Backstop Masterchef
0 ETH
656350832023-03-01 5:19:591061 days ago1677647999
Hundred Finance: Backstop Masterchef
0 ETH
656350832023-03-01 5:19:591061 days ago1677647999
Hundred Finance: Backstop Masterchef
0 ETH
656350832023-03-01 5:19:591061 days ago1677647999
Hundred Finance: Backstop Masterchef
0 ETH
656350832023-03-01 5:19:591061 days ago1677647999
Hundred Finance: Backstop Masterchef
0 ETH
656349052023-03-01 5:19:111061 days ago1677647951
Hundred Finance: Backstop Masterchef
0 ETH
656349052023-03-01 5:19:111061 days ago1677647951
Hundred Finance: Backstop Masterchef
0 ETH
656281252023-03-01 4:49:381061 days ago1677646178
Hundred Finance: Backstop Masterchef
0 ETH
656281252023-03-01 4:49:381061 days ago1677646178
Hundred Finance: Backstop Masterchef
0 ETH
656281252023-03-01 4:49:381061 days ago1677646178
Hundred Finance: Backstop Masterchef
0 ETH
656281252023-03-01 4:49:381061 days ago1677646178
Hundred Finance: Backstop Masterchef
0 ETH
656281252023-03-01 4:49:381061 days ago1677646178
Hundred Finance: Backstop Masterchef
0 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BProtocolChef

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: MIT

pragma solidity 0.8.7;

import "./Ownable.sol";
import "./SafeERC20.sol";

interface IRewarder {
    function onHundredReward(uint pid, address user, address recipient, uint hundredAmount, uint newLpAmount) external;
    function pendingTokens(uint pid, address user, uint hundredAmount) external view returns (IERC20[] memory, uint[] memory);
}

interface IBAMM is IERC20 {
    function deposit(uint amount) external;
    function withdraw(uint numShares) external;
    function fetchPrice() external view returns(uint);
}

contract BProtocolChef is Ownable {
    using SafeERC20 for IERC20;

    /// @notice Info of each BProtocolChef user.
    /// `shares` LP token shares the user has provided.
    /// `rewardDebt` The shares of HUNDRED entitled to the user.
    struct UserInfo {
        uint shares;
        int256 rewardDebt;
    }

    /// @notice Info of each BProtocolChef pool.
    /// `allocPoint` The shares of allocation points assigned to the pool.
    /// Also known as the shares of HUNDRED to distribute per block.
    struct PoolInfo {
        uint128 accHundredPerShare;
        uint64 lastRewardTime;
        uint64 allocPoint;
    }

    /// @notice Address of Hundred contract.
    IERC20 public immutable Hundred;

    /// @notice Info of each BProtocolChef pool.
    PoolInfo[] public poolInfo;
    /// @notice Address of the B.Protocol LP token for each BProtocolChef pool.
    IBAMM[] public lpTokens;
    /// @notice Address of each `IRewarder` contract in BProtocolChef.
    IRewarder[] public rewarders;
    /// @notice Address of the underlying token for each BProtocolChef pool.
    /// This allows a user to deposit e.g. their USDC into the USDC BAMM, then deposit their BAMM tokens to MiniChef.
    IERC20[] public underlyingTokens;

    /// @notice Info of each user that stakes LP tokens.
    mapping (uint => mapping (address => UserInfo)) public userInfo;

    /// @dev Tokens added
    mapping (address => bool) public addedTokens;

    /// @dev Total allocation points. Must be the sum of all allocation points in all pools.
    uint public totalAllocPoint;

    uint public hundredPerSecond;
    uint private constant ACC_HUNDRED_PRECISION = 1e12;

    event Deposit(address indexed user, uint indexed pid, uint shares, address indexed to);
    event Withdraw(address indexed user, uint indexed pid, uint shares, address indexed to);
    event EmergencyWithdraw(address indexed user, uint indexed pid, uint shares, address indexed to);
    event Harvest(address indexed user, uint indexed pid, uint shares);
    event LogPoolAddition(uint indexed pid, uint allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder);
    event LogSetPool(uint indexed pid, uint allocPoint, IRewarder indexed rewarder, bool overwrite);
    event LogUpdatePool(uint indexed pid, uint64 lastRewardTime, uint lpSupply, uint accHundredPerShare);
    event LogHundredPerSecond(uint hundredPerSecond);

    /// @param _hundred The Hundred token contract address.
    constructor(IERC20 _hundred) {
        Hundred = _hundred;
    }

    /// @notice Returns the number of BProtocolChef pools.
    function poolLength() public view returns (uint pools) {
        pools = poolInfo.length;
    }

    /// @notice Add a new LP to the pool. Can only be called by the owner.
    /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.
    /// @param allocPoint AP of the new pool.
    /// @param _lpToken Address of the LP ERC-20 token.
    /// @param _rewarder Address of the rewarder delegate.
    function add(uint allocPoint, IBAMM _lpToken, IERC20 _underlyingToken, IRewarder _rewarder) public onlyOwner {
        require(addedTokens[address(_lpToken)] == false, "Token already added");
        totalAllocPoint = totalAllocPoint + allocPoint;
        lpTokens.push(_lpToken);
        rewarders.push(_rewarder);
        underlyingTokens.push(_underlyingToken);

        poolInfo.push(PoolInfo({
            allocPoint: uint64(allocPoint),
            lastRewardTime: uint64(block.timestamp),
            accHundredPerShare: 0
        }));
        addedTokens[address(_lpToken)] = true;
        emit LogPoolAddition(lpTokens.length - 1, allocPoint, _lpToken, _rewarder);
    }

    /// @notice Update the given pool's HUNDRED allocation point and `IRewarder` contract. Can only be called by the owner.
    /// @param _pid The index of the pool. See `poolInfo`.
    /// @param _allocPoint New AP of the pool.
    /// @param _rewarder Address of the rewarder delegate.
    /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.
    function set(uint _pid, uint _allocPoint, IRewarder _rewarder, bool overwrite) public onlyOwner {
        totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint;
        poolInfo[_pid].allocPoint = uint64(_allocPoint);
        if (overwrite) { rewarders[_pid] = _rewarder; }
        emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarders[_pid], overwrite);
    }

    /// @notice Sets the hundred per second to be distributed. Can only be called by the owner.
    /// @param _hundredPerSecond The shares of Hundred to be distributed per second.
    function setHundredPerSecond(uint _hundredPerSecond) public onlyOwner {
        hundredPerSecond = _hundredPerSecond;
        emit LogHundredPerSecond(_hundredPerSecond);
    }

    /// @notice View function to see pending HUNDRED on frontend.
    /// @param _pid The index of the pool. See `poolInfo`.
    /// @param _user Address of user.
    /// @return pending HUNDRED reward for a given user.
    function pendingHundred(uint _pid, address _user) external view returns (uint pending) {
        PoolInfo memory pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint accHundredPerShare = pool.accHundredPerShare;
        uint lpSupply = lpTokens[_pid].balanceOf(address(this));
        if (block.timestamp > pool.lastRewardTime && lpSupply != 0 && totalAllocPoint != 0) {
            uint time = block.timestamp - pool.lastRewardTime;
            uint hundredReward = time * hundredPerSecond * pool.allocPoint / totalAllocPoint;
            accHundredPerShare = accHundredPerShare + hundredReward * ACC_HUNDRED_PRECISION / lpSupply;
        }
        pending = uint256(int256(user.shares * accHundredPerShare / ACC_HUNDRED_PRECISION) - user.rewardDebt);
    }

    /// @notice Update reward variables for all pools. Be careful of gas spending!
    /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.
    function massUpdatePools(uint[] calldata pids) external {
        uint len = pids.length;
        for (uint i = 0; i < len; ++i) {
            updatePool(pids[i]);
        }
    }

    /// @notice Update reward variables of the given pool.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @return pool Returns the pool that was updated.
    function updatePool(uint pid) public returns (PoolInfo memory pool) {
        pool = poolInfo[pid];
        if (block.timestamp > pool.lastRewardTime) {
            uint lpSupply = lpTokens[pid].balanceOf(address(this));
            if (lpSupply != 0 && totalAllocPoint != 0) {
                uint time = block.timestamp - pool.lastRewardTime;
                uint hundredReward = time * hundredPerSecond * pool.allocPoint / totalAllocPoint;
                pool.accHundredPerShare = uint128(pool.accHundredPerShare + hundredReward * ACC_HUNDRED_PRECISION / lpSupply);
            }
            pool.lastRewardTime = uint64(block.timestamp);
            poolInfo[pid] = pool;
            emit LogUpdatePool(pid, pool.lastRewardTime, lpSupply, pool.accHundredPerShare);
        }
    }

    /// @notice Deposit the underlying token to the BAMM pool, then deposit the BAMM LP token to MiniChef.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param underlyingAmount Underlying token shares to deposit.
    /// @param to The receiver of the deposit benefit.
    function deposit(uint pid, uint underlyingAmount, address to) public {
        underlyingTokens[pid].safeTransferFrom(msg.sender, address(this), underlyingAmount);

        uint oldShares = lpTokens[pid].balanceOf(address(this));

        underlyingTokens[pid].approve(address(lpTokens[pid]), underlyingAmount);
        lpTokens[pid].deposit(underlyingAmount);

        uint newShares = lpTokens[pid].balanceOf(address(this)) - oldShares;

        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][to];

        // Effects
        user.shares = user.shares + newShares;
        user.rewardDebt = user.rewardDebt + int256(newShares * pool.accHundredPerShare / ACC_HUNDRED_PRECISION);

        // Interactions
        IRewarder _rewarder = rewarders[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onHundredReward(pid, to, to, 0, user.shares);
        }

        emit Deposit(msg.sender, pid, newShares, to);
    }

    function _withdrawFromBAMM(uint pid, uint shares, address to) internal {
        uint oldEthBalance = address(this).balance;
        uint oldUnderlyingBalance = underlyingTokens[pid].balanceOf(address(this));
        lpTokens[pid].withdraw(shares);
        uint newUnderlyingTokens = underlyingTokens[pid].balanceOf(address(this)) - oldUnderlyingBalance;
        underlyingTokens[pid].safeTransfer(to, newUnderlyingTokens);
        uint newEth = address(this).balance - oldEthBalance;
        if (newEth > 0) {
            (bool success, ) = to.call{ value: newEth }(""); // re-entry is fine here
            require(success, "withdraw: sending ETH failed");
        }

        emit Withdraw(msg.sender, pid, shares, to);
    }

    /// @notice Withdraw LP tokens from BProtocolChef without harvesting.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param shares LP token shares to withdraw.
    /// @param to Receiver of the LP tokens.
    function withdraw(uint pid, uint shares, address to) public {
        require(shares > 0, "Can't withdraw 0 shares");
        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][msg.sender];

        // Effects
        user.rewardDebt = user.rewardDebt - int256(shares * pool.accHundredPerShare / ACC_HUNDRED_PRECISION);
        user.shares = user.shares - shares;

        // Interactions
        IRewarder _rewarder = rewarders[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onHundredReward(pid, msg.sender, to, 0, user.shares);
        }

        _withdrawFromBAMM(pid, shares, to);
    }

    /// @notice Harvest proceeds for transaction sender to `to`.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param to Receiver of HUNDRED rewards.
    function harvest(uint pid, address to) public {
        PoolInfo memory pool = updatePool(pid);
        UserInfo storage user = userInfo[pid][msg.sender];
        int256 accumulatedHundred = int256(user.shares * pool.accHundredPerShare / ACC_HUNDRED_PRECISION);
        uint _pendingHundred = uint256(accumulatedHundred - user.rewardDebt);

        // Effects
        user.rewardDebt = accumulatedHundred;

        // Interactions
        if (_pendingHundred != 0) {
            Hundred.safeTransfer(to, _pendingHundred);
        }

        IRewarder _rewarder = rewarders[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onHundredReward(pid, msg.sender, to, _pendingHundred, user.shares);
        }

        emit Harvest(msg.sender, pid, _pendingHundred);
    }

    /// @notice Withdraw LP tokens from BProtocolChef and harvest proceeds for transaction sender to `to`.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param shares LP token shares to withdraw.
    /// @param to Receiver of the LP tokens and HUNDRED rewards.
    function withdrawAndHarvest(uint pid, uint shares, address to) public {
        withdraw(pid, shares, to);
        harvest(pid, to);
    }

    /// @notice Withdraw without caring about rewards. EMERGENCY ONLY.
    /// @param pid The index of the pool. See `poolInfo`.
    /// @param to Receiver of the LP tokens.
    function emergencyWithdraw(uint pid, address to) public {
        UserInfo storage user = userInfo[pid][msg.sender];
        uint shares = user.shares;
        user.shares = 0;
        user.rewardDebt = 0;

        IRewarder _rewarder = rewarders[pid];
        if (address(_rewarder) != address(0)) {
            _rewarder.onHundredReward(pid, msg.sender, to, 0, 0);
        }

        // Note: transfer can fail or succeed if `shares` is zero.
        _withdrawFromBAMM(pid, shares, to);

        emit EmergencyWithdraw(msg.sender, pid, shares, to);
    }

    receive() external payable {}
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (access/Ownable.sol)

pragma solidity ^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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

/**
 * @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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT

pragma solidity 0.8.7;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function totalSupply() external view returns (uint);
    function decimals() external view returns (uint8);
    function balanceOf(address account) external view returns (uint);
    function transfer(address recipient, uint shares) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint shares) external returns (bool);
    function transferFrom(address sender, address recipient, uint shares) external returns (bool);
    function permit(address target, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function transferWithPermit(address target, address to, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
}

library SafeERC20 {
    using Address for address;

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

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

    function safeApprove(IERC20 token, address spender, uint value) internal {
        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 callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "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");
        }
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IERC20","name":"_hundred","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"hundredPerSecond","type":"uint256"}],"name":"LogHundredPerSecond","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"lpToken","type":"address"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"}],"name":"LogPoolAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"},{"indexed":false,"internalType":"bool","name":"overwrite","type":"bool"}],"name":"LogSetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accHundredPerShare","type":"uint256"}],"name":"LogUpdatePool","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":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"Hundred","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"contract IBAMM","name":"_lpToken","type":"address"},{"internalType":"contract IERC20","name":"_underlyingToken","type":"address"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"underlyingAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hundredPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lpTokens","outputs":[{"internalType":"contract IBAMM","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingHundred","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint128","name":"accHundredPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"pools","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewarders","outputs":[{"internalType":"contract IRewarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"},{"internalType":"bool","name":"overwrite","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hundredPerSecond","type":"uint256"}],"name":"setHundredPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","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":"uint256","name":"","type":"uint256"}],"name":"underlyingTokens","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint128","name":"accHundredPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"internalType":"struct BProtocolChef.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"int256","name":"rewardDebt","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawAndHarvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b50604051620022e6380380620022e68339810160408190526200003491620000a5565b6200003f3362000055565b60601b6001600160601b031916608052620000d7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620000b857600080fd5b81516001600160a01b0381168114620000d057600080fd5b9392505050565b60805160601c6121e9620000fd600039600081816101b3015261076a01526121e96000f3fe60806040526004361061014f5760003560e01c8063715018a6116100b657806393f1a40b1161006f57806393f1a40b14610437578063a3bf224b1461048b578063d1abb907146104ab578063d7657ea7146104cb578063f2fde38b146104eb578063fcf8770f1461050b57600080fd5b8063715018a61461036457806379d12ffb1461037957806388bba42f146103b95780638aafbaf7146103d95780638da5cb5b146103f95780638dbdbe6d1461041757600080fd5b80631bb5e2dc116101085780631bb5e2dc146102725780631e0e20e514610292578063266f24b7146102a85780632f940c70146102c857806351eb05a6146102e857806357a5b58c1461034457600080fd5b8063081e3eda1461015b5780630ad58d2f1461017f57806312bd3962146101a15780631526fe27146101ed57806317caf6f11461023c57806318fccc761461025257600080fd5b3661015657005b600080fd5b34801561016757600080fd5b506001545b6040519081526020015b60405180910390f35b34801561018b57600080fd5b5061019f61019a366004611f42565b61052b565b005b3480156101ad57600080fd5b506101d57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610176565b3480156101f957600080fd5b5061020d610208366004611e8d565b6106a2565b604080516001600160801b0390941684526001600160401b039283166020850152911690820152606001610176565b34801561024857600080fd5b5061016c60075481565b34801561025e57600080fd5b5061019f61026d366004611ebf565b6106e7565b34801561027e57600080fd5b506101d561028d366004611e8d565b61086b565b34801561029e57600080fd5b5061016c60085481565b3480156102b457600080fd5b5061019f6102c3366004611eef565b610895565b3480156102d457600080fd5b5061019f6102e3366004611ebf565b610af0565b3480156102f457600080fd5b50610308610303366004611e8d565b610c12565b6040805182516001600160801b031681526020808401516001600160401b03908116918301919091529282015190921690820152606001610176565b34801561035057600080fd5b5061019f61035f366004611dfc565b610eaf565b34801561037057600080fd5b5061019f610ef3565b34801561038557600080fd5b506103a9610394366004611dd8565b60066020526000908152604090205460ff1681565b6040519015158152602001610176565b3480156103c557600080fd5b5061019f6103d4366004611f7b565b610f29565b3480156103e557600080fd5b5061019f6103f4366004611e8d565b6110b6565b34801561040557600080fd5b506000546001600160a01b03166101d5565b34801561042357600080fd5b5061019f610432366004611f42565b61111b565b34801561044357600080fd5b50610476610452366004611ebf565b60056020908152600092835260408084209091529082529020805460019091015482565b60408051928352602083019190915201610176565b34801561049757600080fd5b506101d56104a6366004611e8d565b61154f565b3480156104b757600080fd5b5061019f6104c6366004611f42565b61155f565b3480156104d757600080fd5b5061016c6104e6366004611ebf565b611579565b3480156104f757600080fd5b5061019f610506366004611dd8565b61177b565b34801561051757600080fd5b506101d5610526366004611e8d565b611816565b600082116105805760405162461bcd60e51b815260206004820152601760248201527f43616e277420776974686472617720302073686172657300000000000000000060448201526064015b60405180910390fd5b600061058b84610c12565b6000858152600560209081526040808320338452909152902081519192509064e8d4a51000906105c4906001600160801b0316866120d4565b6105ce91906120b2565b81600101546105dd91906120f3565b600182015580546105ef908590612132565b81556003805460009190879081106106095761060961217a565b6000918252602090912001546001600160a01b03169050801561068f578154604051635547aa3560e11b81526001600160a01b0383169163aa8f546a9161065c918a9133918a916000919060040161202a565b600060405180830381600087803b15801561067657600080fd5b505af115801561068a573d6000803e3d6000fd5b505050505b61069a868686611826565b505050505050565b600181815481106106b257600080fd5b6000918252602090912001546001600160801b03811691506001600160401b03600160801b8204811691600160c01b90041683565b60006106f283610c12565b6000848152600560209081526040808320338452909152812082518154939450909264e8d4a5100091610730916001600160801b03909116906120d4565b61073a91906120b2565b9050600082600101548261074e91906120f3565b6001840183905590508015610791576107916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683611b2a565b6000600387815481106107a6576107a661217a565b6000918252602090912001546001600160a01b03169050801561082b578354604051635547aa3560e11b81526001600160a01b0383169163aa8f546a916107f8918b9133918c9189919060040161202a565b600060405180830381600087803b15801561081257600080fd5b505af1158015610826573d6000803e3d6000fd5b505050505b604051828152879033907f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249549060200160405180910390a350505050505050565b6002818154811061087b57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146108bf5760405162461bcd60e51b815260040161057790611ff5565b6001600160a01b03831660009081526006602052604090205460ff161561091e5760405162461bcd60e51b8152602060048201526013602482015272151bdad95b88185b1c9958591e481859191959606a1b6044820152606401610577565b8360075461092c919061209a565b60075560028054600181810183557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b038088166001600160a01b03199283168117909355600380548086019091557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180548783169084168117909155600480548087019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805492891692909316919091179091556040805160608101825260008082526001600160401b0342811660208481019182528d83168587019081528954808b018b558a865295517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69096018054935191518516600160c01b026001600160c01b0392909516600160801b026001600160c01b03199094166001600160801b039790971696909617929092179190911691909117909255848152600690915220805460ff19168417905592549091610ab791612132565b6040518781527f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e59060200160405180910390a450505050565b60008281526005602090815260408083203384529091528120805482825560018201839055600380549293919286908110610b2d57610b2d61217a565b6000918252602090912001546001600160a01b031690508015610bb257604051635547aa3560e11b81526001600160a01b0382169063aa8f546a90610b7f90889033908990600090819060040161202a565b600060405180830381600087803b158015610b9957600080fd5b505af1158015610bad573d6000803e3d6000fd5b505050505b610bbd858386611826565b836001600160a01b031685336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b85604051610c0391815260200190565b60405180910390a45050505050565b604080516060810182526000808252602082018190529181019190915260018281548110610c4257610c4261217a565b60009182526020918290206040805160608101825292909101546001600160801b03811683526001600160401b03600160801b82048116948401859052600160c01b90910416908201529150421115610eaa57600060028381548110610caa57610caa61217a565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610cf657600080fd5b505afa158015610d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2e9190611ea6565b90508015801590610d40575060075415155b15610dd657600082602001516001600160401b031642610d609190612132565b9050600060075484604001516001600160401b031660085484610d8391906120d4565b610d8d91906120d4565b610d9791906120b2565b905082610da964e8d4a51000836120d4565b610db391906120b2565b8451610dc891906001600160801b031661209a565b6001600160801b0316845250505b6001600160401b03421660208301526001805483919085908110610dfc57610dfc61217a565b6000918252602091829020835191018054848401516040958601516001600160401b03908116600160c01b026001600160c01b03928216600160801b026001600160c01b03199094166001600160801b039687161793909317919091169190911790915585830151865185519190921681529283018590521681830152905184917f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad353919081900360600190a2505b919050565b8060005b81811015610eed57610edc848483818110610ed057610ed061217a565b90506020020135610c12565b50610ee681612149565b9050610eb3565b50505050565b6000546001600160a01b03163314610f1d5760405162461bcd60e51b815260040161057790611ff5565b610f276000611b8d565b565b6000546001600160a01b03163314610f535760405162461bcd60e51b815260040161057790611ff5565b8260018581548110610f6757610f6761217a565b600091825260209091200154600754610f9091600160c01b90046001600160401b031690612132565b610f9a919061209a565b6007819055508260018581548110610fb457610fb461217a565b9060005260206000200160000160186101000a8154816001600160401b0302191690836001600160401b03160217905550801561102e578160038581548110610fff57610fff61217a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8061106057600384815481106110465761104661217a565b6000918252602090912001546001600160a01b0316611062565b815b6001600160a01b0316847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e186585846040516110a89291909182521515602082015260400190565b60405180910390a350505050565b6000546001600160a01b031633146110e05760405162461bcd60e51b815260040161057790611ff5565b60088190556040518181527fb52db2e58a94356d20ff3b2e588c68aaff0bae872a6bc0de65c7644f16d485049060200160405180910390a150565b611151333084600487815481106111345761113461217a565b6000918252602090912001546001600160a01b0316929190611bdd565b6000600284815481106111665761116661217a565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156111b257600080fd5b505afa1580156111c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ea9190611ea6565b9050600484815481106111ff576111ff61217a565b600091825260209091200154600280546001600160a01b039092169163095ea7b39190879081106112325761123261217a565b60009182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b03909116600482015260248101869052604401602060405180830381600087803b15801561128657600080fd5b505af115801561129a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112be9190611e70565b50600284815481106112d2576112d261217a565b60009182526020909120015460405163b6b55f2560e01b8152600481018590526001600160a01b039091169063b6b55f2590602401600060405180830381600087803b15801561132157600080fd5b505af1158015611335573d6000803e3d6000fd5b505050506000816002868154811061134f5761134f61217a565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190611ea6565b6113dd9190612132565b905060006113ea86610c12565b60008781526005602090815260408083206001600160a01b0389168452909152902080549192509061141d90849061209a565b8155815164e8d4a510009061143b906001600160801b0316856120d4565b61144591906120b2565b81600101546114549190612059565b81600101819055506000600388815481106114715761147161217a565b6000918252602090912001546001600160a01b0316905080156114f7578154604051635547aa3560e11b81526001600160a01b0383169163aa8f546a916114c4918c918b9182916000919060040161202a565b600060405180830381600087803b1580156114de57600080fd5b505af11580156114f2573d6000803e3d6000fd5b505050505b856001600160a01b031688336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478760405161153d91815260200190565b60405180910390a45050505050505050565b6004818154811061087b57600080fd5b61156a83838361052b565b61157483826106e7565b505050565b6000806001848154811061158f5761158f61217a565b600091825260208083206040805160608101825291909301546001600160801b0380821683526001600160401b03600160801b8304811684860152600160c01b90920490911682850152888552600583528385206001600160a01b03891686529092529183208251600280549496509194921692889081106116135761161361217a565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561165f57600080fd5b505afa158015611673573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116979190611ea6565b905083602001516001600160401b0316421180156116b457508015155b80156116c1575060075415155b1561174357600084602001516001600160401b0316426116e19190612132565b9050600060075486604001516001600160401b03166008548461170491906120d4565b61170e91906120d4565b61171891906120b2565b90508261172a64e8d4a51000836120d4565b61173491906120b2565b61173e908561209a565b935050505b6001830154835464e8d4a510009061175c9085906120d4565b61176691906120b2565b61177091906120f3565b979650505050505050565b6000546001600160a01b031633146117a55760405162461bcd60e51b815260040161057790611ff5565b6001600160a01b03811661180a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610577565b61181381611b8d565b50565b6003818154811061087b57600080fd5b60004790506000600485815481106118405761184061217a565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561188c57600080fd5b505afa1580156118a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c49190611ea6565b9050600285815481106118d9576118d961217a565b600091825260209091200154604051632e1a7d4d60e01b8152600481018690526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b15801561192857600080fd5b505af115801561193c573d6000803e3d6000fd5b50505050600081600487815481106119565761195661217a565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156119a257600080fd5b505afa1580156119b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119da9190611ea6565b6119e49190612132565b9050611a1a8482600489815481106119fe576119fe61217a565b6000918252602090912001546001600160a01b03169190611b2a565b6000611a268447612132565b90508015611ad3576000856001600160a01b03168260405160006040518083038185875af1925050503d8060008114611a7b576040519150601f19603f3d011682016040523d82523d6000602084013e611a80565b606091505b5050905080611ad15760405162461bcd60e51b815260206004820152601c60248201527f77697468647261773a2073656e64696e6720455448206661696c6564000000006044820152606401610577565b505b846001600160a01b031687336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec213289604051611b1991815260200190565b60405180910390a450505050505050565b6040516001600160a01b03831660248201526044810182905261157490849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611c15565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052610eed9085906323b872dd60e01b90608401611b56565b611c27826001600160a01b0316611d9c565b611c735760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006044820152606401610577565b600080836001600160a01b031683604051611c8e9190611fba565b6000604051808303816000865af19150503d8060008114611ccb576040519150601f19603f3d011682016040523d82523d6000602084013e611cd0565b606091505b509150915081611d225760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646044820152606401610577565b805115610eed5780806020019051810190611d3d9190611e70565b610eed5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610577565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611dd05750808214155b949350505050565b600060208284031215611dea57600080fd5b8135611df581612190565b9392505050565b60008060208385031215611e0f57600080fd5b82356001600160401b0380821115611e2657600080fd5b818501915085601f830112611e3a57600080fd5b813581811115611e4957600080fd5b8660208260051b8501011115611e5e57600080fd5b60209290920196919550909350505050565b600060208284031215611e8257600080fd5b8151611df5816121a5565b600060208284031215611e9f57600080fd5b5035919050565b600060208284031215611eb857600080fd5b5051919050565b60008060408385031215611ed257600080fd5b823591506020830135611ee481612190565b809150509250929050565b60008060008060808587031215611f0557600080fd5b843593506020850135611f1781612190565b92506040850135611f2781612190565b91506060850135611f3781612190565b939692955090935050565b600080600060608486031215611f5757600080fd5b83359250602084013591506040840135611f7081612190565b809150509250925092565b60008060008060808587031215611f9157600080fd5b84359350602085013592506040850135611faa81612190565b91506060850135611f37816121a5565b6000825160005b81811015611fdb5760208186018101518583015201611fc1565b81811115611fea576000828501525b509190910192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b600080821280156001600160ff1b038490038513161561207b5761207b612164565b600160ff1b839003841281161561209457612094612164565b50500190565b600082198211156120ad576120ad612164565b500190565b6000826120cf57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156120ee576120ee612164565b500290565b60008083128015600160ff1b85018412161561211157612111612164565b6001600160ff1b038401831381161561212c5761212c612164565b50500390565b60008282101561214457612144612164565b500390565b600060001982141561215d5761215d612164565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461181357600080fd5b801515811461181357600080fdfea2646970667358221220e610679f885ec401a5ad557450f166e0fef18ffe7aa3a6876397f866cc63d0d064736f6c6343000807003300000000000000000000000010010078a54396f62c96df8532dc2b4847d47ed3

Deployed Bytecode

0x60806040526004361061014f5760003560e01c8063715018a6116100b657806393f1a40b1161006f57806393f1a40b14610437578063a3bf224b1461048b578063d1abb907146104ab578063d7657ea7146104cb578063f2fde38b146104eb578063fcf8770f1461050b57600080fd5b8063715018a61461036457806379d12ffb1461037957806388bba42f146103b95780638aafbaf7146103d95780638da5cb5b146103f95780638dbdbe6d1461041757600080fd5b80631bb5e2dc116101085780631bb5e2dc146102725780631e0e20e514610292578063266f24b7146102a85780632f940c70146102c857806351eb05a6146102e857806357a5b58c1461034457600080fd5b8063081e3eda1461015b5780630ad58d2f1461017f57806312bd3962146101a15780631526fe27146101ed57806317caf6f11461023c57806318fccc761461025257600080fd5b3661015657005b600080fd5b34801561016757600080fd5b506001545b6040519081526020015b60405180910390f35b34801561018b57600080fd5b5061019f61019a366004611f42565b61052b565b005b3480156101ad57600080fd5b506101d57f00000000000000000000000010010078a54396f62c96df8532dc2b4847d47ed381565b6040516001600160a01b039091168152602001610176565b3480156101f957600080fd5b5061020d610208366004611e8d565b6106a2565b604080516001600160801b0390941684526001600160401b039283166020850152911690820152606001610176565b34801561024857600080fd5b5061016c60075481565b34801561025e57600080fd5b5061019f61026d366004611ebf565b6106e7565b34801561027e57600080fd5b506101d561028d366004611e8d565b61086b565b34801561029e57600080fd5b5061016c60085481565b3480156102b457600080fd5b5061019f6102c3366004611eef565b610895565b3480156102d457600080fd5b5061019f6102e3366004611ebf565b610af0565b3480156102f457600080fd5b50610308610303366004611e8d565b610c12565b6040805182516001600160801b031681526020808401516001600160401b03908116918301919091529282015190921690820152606001610176565b34801561035057600080fd5b5061019f61035f366004611dfc565b610eaf565b34801561037057600080fd5b5061019f610ef3565b34801561038557600080fd5b506103a9610394366004611dd8565b60066020526000908152604090205460ff1681565b6040519015158152602001610176565b3480156103c557600080fd5b5061019f6103d4366004611f7b565b610f29565b3480156103e557600080fd5b5061019f6103f4366004611e8d565b6110b6565b34801561040557600080fd5b506000546001600160a01b03166101d5565b34801561042357600080fd5b5061019f610432366004611f42565b61111b565b34801561044357600080fd5b50610476610452366004611ebf565b60056020908152600092835260408084209091529082529020805460019091015482565b60408051928352602083019190915201610176565b34801561049757600080fd5b506101d56104a6366004611e8d565b61154f565b3480156104b757600080fd5b5061019f6104c6366004611f42565b61155f565b3480156104d757600080fd5b5061016c6104e6366004611ebf565b611579565b3480156104f757600080fd5b5061019f610506366004611dd8565b61177b565b34801561051757600080fd5b506101d5610526366004611e8d565b611816565b600082116105805760405162461bcd60e51b815260206004820152601760248201527f43616e277420776974686472617720302073686172657300000000000000000060448201526064015b60405180910390fd5b600061058b84610c12565b6000858152600560209081526040808320338452909152902081519192509064e8d4a51000906105c4906001600160801b0316866120d4565b6105ce91906120b2565b81600101546105dd91906120f3565b600182015580546105ef908590612132565b81556003805460009190879081106106095761060961217a565b6000918252602090912001546001600160a01b03169050801561068f578154604051635547aa3560e11b81526001600160a01b0383169163aa8f546a9161065c918a9133918a916000919060040161202a565b600060405180830381600087803b15801561067657600080fd5b505af115801561068a573d6000803e3d6000fd5b505050505b61069a868686611826565b505050505050565b600181815481106106b257600080fd5b6000918252602090912001546001600160801b03811691506001600160401b03600160801b8204811691600160c01b90041683565b60006106f283610c12565b6000848152600560209081526040808320338452909152812082518154939450909264e8d4a5100091610730916001600160801b03909116906120d4565b61073a91906120b2565b9050600082600101548261074e91906120f3565b6001840183905590508015610791576107916001600160a01b037f00000000000000000000000010010078a54396f62c96df8532dc2b4847d47ed3168683611b2a565b6000600387815481106107a6576107a661217a565b6000918252602090912001546001600160a01b03169050801561082b578354604051635547aa3560e11b81526001600160a01b0383169163aa8f546a916107f8918b9133918c9189919060040161202a565b600060405180830381600087803b15801561081257600080fd5b505af1158015610826573d6000803e3d6000fd5b505050505b604051828152879033907f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249549060200160405180910390a350505050505050565b6002818154811061087b57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146108bf5760405162461bcd60e51b815260040161057790611ff5565b6001600160a01b03831660009081526006602052604090205460ff161561091e5760405162461bcd60e51b8152602060048201526013602482015272151bdad95b88185b1c9958591e481859191959606a1b6044820152606401610577565b8360075461092c919061209a565b60075560028054600181810183557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b038088166001600160a01b03199283168117909355600380548086019091557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180548783169084168117909155600480548087019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01805492891692909316919091179091556040805160608101825260008082526001600160401b0342811660208481019182528d83168587019081528954808b018b558a865295517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69096018054935191518516600160c01b026001600160c01b0392909516600160801b026001600160c01b03199094166001600160801b039790971696909617929092179190911691909117909255848152600690915220805460ff19168417905592549091610ab791612132565b6040518781527f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e59060200160405180910390a450505050565b60008281526005602090815260408083203384529091528120805482825560018201839055600380549293919286908110610b2d57610b2d61217a565b6000918252602090912001546001600160a01b031690508015610bb257604051635547aa3560e11b81526001600160a01b0382169063aa8f546a90610b7f90889033908990600090819060040161202a565b600060405180830381600087803b158015610b9957600080fd5b505af1158015610bad573d6000803e3d6000fd5b505050505b610bbd858386611826565b836001600160a01b031685336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b85604051610c0391815260200190565b60405180910390a45050505050565b604080516060810182526000808252602082018190529181019190915260018281548110610c4257610c4261217a565b60009182526020918290206040805160608101825292909101546001600160801b03811683526001600160401b03600160801b82048116948401859052600160c01b90910416908201529150421115610eaa57600060028381548110610caa57610caa61217a565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610cf657600080fd5b505afa158015610d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2e9190611ea6565b90508015801590610d40575060075415155b15610dd657600082602001516001600160401b031642610d609190612132565b9050600060075484604001516001600160401b031660085484610d8391906120d4565b610d8d91906120d4565b610d9791906120b2565b905082610da964e8d4a51000836120d4565b610db391906120b2565b8451610dc891906001600160801b031661209a565b6001600160801b0316845250505b6001600160401b03421660208301526001805483919085908110610dfc57610dfc61217a565b6000918252602091829020835191018054848401516040958601516001600160401b03908116600160c01b026001600160c01b03928216600160801b026001600160c01b03199094166001600160801b039687161793909317919091169190911790915585830151865185519190921681529283018590521681830152905184917f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad353919081900360600190a2505b919050565b8060005b81811015610eed57610edc848483818110610ed057610ed061217a565b90506020020135610c12565b50610ee681612149565b9050610eb3565b50505050565b6000546001600160a01b03163314610f1d5760405162461bcd60e51b815260040161057790611ff5565b610f276000611b8d565b565b6000546001600160a01b03163314610f535760405162461bcd60e51b815260040161057790611ff5565b8260018581548110610f6757610f6761217a565b600091825260209091200154600754610f9091600160c01b90046001600160401b031690612132565b610f9a919061209a565b6007819055508260018581548110610fb457610fb461217a565b9060005260206000200160000160186101000a8154816001600160401b0302191690836001600160401b03160217905550801561102e578160038581548110610fff57610fff61217a565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8061106057600384815481106110465761104661217a565b6000918252602090912001546001600160a01b0316611062565b815b6001600160a01b0316847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e186585846040516110a89291909182521515602082015260400190565b60405180910390a350505050565b6000546001600160a01b031633146110e05760405162461bcd60e51b815260040161057790611ff5565b60088190556040518181527fb52db2e58a94356d20ff3b2e588c68aaff0bae872a6bc0de65c7644f16d485049060200160405180910390a150565b611151333084600487815481106111345761113461217a565b6000918252602090912001546001600160a01b0316929190611bdd565b6000600284815481106111665761116661217a565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156111b257600080fd5b505afa1580156111c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ea9190611ea6565b9050600484815481106111ff576111ff61217a565b600091825260209091200154600280546001600160a01b039092169163095ea7b39190879081106112325761123261217a565b60009182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b03909116600482015260248101869052604401602060405180830381600087803b15801561128657600080fd5b505af115801561129a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112be9190611e70565b50600284815481106112d2576112d261217a565b60009182526020909120015460405163b6b55f2560e01b8152600481018590526001600160a01b039091169063b6b55f2590602401600060405180830381600087803b15801561132157600080fd5b505af1158015611335573d6000803e3d6000fd5b505050506000816002868154811061134f5761134f61217a565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561139b57600080fd5b505afa1580156113af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d39190611ea6565b6113dd9190612132565b905060006113ea86610c12565b60008781526005602090815260408083206001600160a01b0389168452909152902080549192509061141d90849061209a565b8155815164e8d4a510009061143b906001600160801b0316856120d4565b61144591906120b2565b81600101546114549190612059565b81600101819055506000600388815481106114715761147161217a565b6000918252602090912001546001600160a01b0316905080156114f7578154604051635547aa3560e11b81526001600160a01b0383169163aa8f546a916114c4918c918b9182916000919060040161202a565b600060405180830381600087803b1580156114de57600080fd5b505af11580156114f2573d6000803e3d6000fd5b505050505b856001600160a01b031688336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b478760405161153d91815260200190565b60405180910390a45050505050505050565b6004818154811061087b57600080fd5b61156a83838361052b565b61157483826106e7565b505050565b6000806001848154811061158f5761158f61217a565b600091825260208083206040805160608101825291909301546001600160801b0380821683526001600160401b03600160801b8304811684860152600160c01b90920490911682850152888552600583528385206001600160a01b03891686529092529183208251600280549496509194921692889081106116135761161361217a565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561165f57600080fd5b505afa158015611673573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116979190611ea6565b905083602001516001600160401b0316421180156116b457508015155b80156116c1575060075415155b1561174357600084602001516001600160401b0316426116e19190612132565b9050600060075486604001516001600160401b03166008548461170491906120d4565b61170e91906120d4565b61171891906120b2565b90508261172a64e8d4a51000836120d4565b61173491906120b2565b61173e908561209a565b935050505b6001830154835464e8d4a510009061175c9085906120d4565b61176691906120b2565b61177091906120f3565b979650505050505050565b6000546001600160a01b031633146117a55760405162461bcd60e51b815260040161057790611ff5565b6001600160a01b03811661180a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610577565b61181381611b8d565b50565b6003818154811061087b57600080fd5b60004790506000600485815481106118405761184061217a565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561188c57600080fd5b505afa1580156118a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c49190611ea6565b9050600285815481106118d9576118d961217a565b600091825260209091200154604051632e1a7d4d60e01b8152600481018690526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b15801561192857600080fd5b505af115801561193c573d6000803e3d6000fd5b50505050600081600487815481106119565761195661217a565b6000918252602090912001546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b1580156119a257600080fd5b505afa1580156119b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119da9190611ea6565b6119e49190612132565b9050611a1a8482600489815481106119fe576119fe61217a565b6000918252602090912001546001600160a01b03169190611b2a565b6000611a268447612132565b90508015611ad3576000856001600160a01b03168260405160006040518083038185875af1925050503d8060008114611a7b576040519150601f19603f3d011682016040523d82523d6000602084013e611a80565b606091505b5050905080611ad15760405162461bcd60e51b815260206004820152601c60248201527f77697468647261773a2073656e64696e6720455448206661696c6564000000006044820152606401610577565b505b846001600160a01b031687336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec213289604051611b1991815260200190565b60405180910390a450505050505050565b6040516001600160a01b03831660248201526044810182905261157490849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611c15565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052610eed9085906323b872dd60e01b90608401611b56565b611c27826001600160a01b0316611d9c565b611c735760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006044820152606401610577565b600080836001600160a01b031683604051611c8e9190611fba565b6000604051808303816000865af19150503d8060008114611ccb576040519150601f19603f3d011682016040523d82523d6000602084013e611cd0565b606091505b509150915081611d225760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646044820152606401610577565b805115610eed5780806020019051810190611d3d9190611e70565b610eed5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610577565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611dd05750808214155b949350505050565b600060208284031215611dea57600080fd5b8135611df581612190565b9392505050565b60008060208385031215611e0f57600080fd5b82356001600160401b0380821115611e2657600080fd5b818501915085601f830112611e3a57600080fd5b813581811115611e4957600080fd5b8660208260051b8501011115611e5e57600080fd5b60209290920196919550909350505050565b600060208284031215611e8257600080fd5b8151611df5816121a5565b600060208284031215611e9f57600080fd5b5035919050565b600060208284031215611eb857600080fd5b5051919050565b60008060408385031215611ed257600080fd5b823591506020830135611ee481612190565b809150509250929050565b60008060008060808587031215611f0557600080fd5b843593506020850135611f1781612190565b92506040850135611f2781612190565b91506060850135611f3781612190565b939692955090935050565b600080600060608486031215611f5757600080fd5b83359250602084013591506040840135611f7081612190565b809150509250925092565b60008060008060808587031215611f9157600080fd5b84359350602085013592506040850135611faa81612190565b91506060850135611f37816121a5565b6000825160005b81811015611fdb5760208186018101518583015201611fc1565b81811115611fea576000828501525b509190910192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b600080821280156001600160ff1b038490038513161561207b5761207b612164565b600160ff1b839003841281161561209457612094612164565b50500190565b600082198211156120ad576120ad612164565b500190565b6000826120cf57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156120ee576120ee612164565b500290565b60008083128015600160ff1b85018412161561211157612111612164565b6001600160ff1b038401831381161561212c5761212c612164565b50500390565b60008282101561214457612144612164565b500390565b600060001982141561215d5761215d612164565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461181357600080fd5b801515811461181357600080fdfea2646970667358221220e610679f885ec401a5ad557450f166e0fef18ffe7aa3a6876397f866cc63d0d064736f6c63430008070033

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

00000000000000000000000010010078a54396f62c96df8532dc2b4847d47ed3

-----Decoded View---------------
Arg [0] : _hundred (address): 0x10010078a54396F62c96dF8532dc2B4847d47ED3

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000010010078a54396f62c96df8532dc2b4847d47ed3


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.