ETH Price: $2,575.24 (+0.80%)

Contract

0xcbE5F4E8a112F25C2F902714e3cBB7955F19Bb36
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Farm Deposit210932162024-11-01 13:52:4740 mins ago1730469167IN
0xcbE5F4E8...55F19Bb36
0 ETH0.0018197515.25242133
Farm Deposit210931782024-11-01 13:45:1148 mins ago1730468711IN
0xcbE5F4E8...55F19Bb36
0 ETH0.0013188115
Farm Deposit210930522024-11-01 13:19:471 hr ago1730467187IN
0xcbE5F4E8...55F19Bb36
0 ETH0.0011025611
Farm Deposit210928272024-11-01 12:34:231 hr ago1730464463IN
0xcbE5F4E8...55F19Bb36
0 ETH0.0013123911
Claim Rewards210914642024-11-01 8:00:476 hrs ago1730448047IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000575317.43721405
Claim Rewards210912462024-11-01 7:17:117 hrs ago1730445431IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000542157.0085828
Farm Withdraw210906892024-11-01 5:24:599 hrs ago1730438699IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000477595.57654395
Farm Deposit210904842024-11-01 4:43:599 hrs ago1730436239IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000506355.55401779
Farm Deposit210892652024-11-01 0:39:2313 hrs ago1730421563IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000760086.37005963
Farm Deposit210890892024-11-01 0:04:1114 hrs ago1730419451IN
0xcbE5F4E8...55F19Bb36
0 ETH0.001073679
Farm Deposit210888282024-10-31 23:11:5915 hrs ago1730416319IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000839727.33171177
Farm Deposit210884932024-10-31 22:04:3516 hrs ago1730412275IN
0xcbE5F4E8...55F19Bb36
0 ETH0.001099739.60092284
Farm Deposit210879612024-10-31 20:17:3518 hrs ago1730405855IN
0xcbE5F4E8...55F19Bb36
0 ETH0.0013149611.48110934
Farm Deposit210879212024-10-31 20:09:3518 hrs ago1730405375IN
0xcbE5F4E8...55F19Bb36
0 ETH0.0013234411.55755586
Farm Deposit210870732024-10-31 17:19:4721 hrs ago1730395187IN
0xcbE5F4E8...55F19Bb36
0 ETH0.0017178115
Farm Deposit210839932024-10-31 7:02:3531 hrs ago1730358155IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000832487.26924362
Farm Deposit210834232024-10-31 5:06:5933 hrs ago1730351219IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000802798.00932955
Claim Rewards210834202024-10-31 5:06:2333 hrs ago1730351183IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000694487.396364
Farm Deposit210833712024-10-31 4:56:3533 hrs ago1730350595IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000987448.62235491
Farm Deposit210821492024-10-31 0:50:5937 hrs ago1730335859IN
0xcbE5F4E8...55F19Bb36
0 ETH0.0012034610.50645284
Farm Deposit210818972024-10-31 0:00:3538 hrs ago1730332835IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000990798.65073642
Farm Deposit210812742024-10-30 21:55:3540 hrs ago1730325335IN
0xcbE5F4E8...55F19Bb36
0 ETH0.0013204512.57469252
Farm Deposit210812472024-10-30 21:50:1140 hrs ago1730325011IN
0xcbE5F4E8...55F19Bb36
0 ETH0.0015815613.25472419
Farm Deposit210804542024-10-30 19:10:5943 hrs ago1730315459IN
0xcbE5F4E8...55F19Bb36
0 ETH0.0021475618
Farm Deposit210798292024-10-30 17:05:4745 hrs ago1730307947IN
0xcbE5F4E8...55F19Bb36
0 ETH0.0021473418
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DynamicRewardFarm

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 9999999 runs

Other Settings:
cancun EvmVersion
File 1 of 4 : DynamicRewardFarm.sol
// SPDX-License-Identifier: -- BCOM --

pragma solidity =0.8.26;

import "./TokenWrapper.sol";

error NoRewards();
error UnknownToken();
error ExistingToken();
error InvalidAddress();

contract DynamicRewardFarm is TokenWrapper {

    IERC20 public stakeToken;

    uint256 public periodFinished;
    uint256 public rewardDuration;
    uint256 public lastUpdateTime;

    uint256 constant MAX_TOKENS = 20;
    uint256 constant PRECISIONS = 1E18;

    address public ownerAddress;
    address public proposedOwner;
    address public managerAddress;

    uint256 public tokenCount;
    address[] public rewardTokens;

    address constant DEAD_ADDRESS = address(
        0x000000000000000000000000000000000000dEaD
    );

    struct RewardData {
        uint256 rewardRate;
        uint256 perTokenStored;
        mapping(address => uint256) userRewards;
        mapping(address => uint256) perTokenPaid;
    }

    mapping(address => RewardData) public rewards;

    modifier onlyOwner() {
        _onlyOwner();
        _;
    }

    modifier onlyManager() {
        _onlyManager();
        _;
    }

    modifier updateFarm() {
        _updateFarm();
        _;
    }

    modifier updateUser() {
        _updateUser(msg.sender);
        _;
    }

    modifier updateSender(address _sender) {
        _updateUser(_sender);
        _;
    }

    event RewardTokenAdded(
        address indexed rewardToken,
        uint256 tokenCount
    );

    /**
     * @dev No modifier necessary since this contract is
     * cloned by the factory contract calling initialize
     */
    function initialize(
        address _stakeToken,
        uint256 _defaultDuration,
        address _ownerAddress,
        address _managerAddress,
        string calldata _name,
        string calldata _symbol
    )
        external
        // onlyFactory
    {
        require(
            _defaultDuration > 0,
            "DynamicRewardFarm: INVALID_DURATION"
        );

        require(
            rewardDuration == 0,
            "DynamicRewardFarm: ALREADY_INITIALIZED"
        );

        rewardDuration = _defaultDuration;

        name = _name;
        symbol = _symbol;

        stakeToken = IERC20(
            _stakeToken
        );

        ownerAddress = _ownerAddress;
        managerAddress = _managerAddress;

        _stake(
            PRECISIONS,
            DEAD_ADDRESS
        );
    }

    /**
     * @dev Adds a new reward token to the farm
     */
    function addRewardToken(
        address _rewardToken
    )
        external
        onlyOwner
    {
        require(
            tokenCount < MAX_TOKENS,
            "DynamicRewardFarm: MAX_TOKENS_REACHED"
        );

        _validateRewardToken(
            _rewardToken
        );

        rewardTokens.push(
            _rewardToken
        );

        tokenCount = tokenCount + 1;

        emit RewardTokenAdded(
            _rewardToken,
            tokenCount
        );
    }

    /**
     * @dev Checks if the token is already added
     */
    function _validateRewardToken(
        address _tokenAddress
    )
        private
        view
    {
        if (_tokenAddress == ZERO_ADDRESS) {
            revert InvalidAddress();
        }

        for (uint256 i; i < rewardTokens.length; i++) {
            if (_tokenAddress == rewardTokens[i]) {
                revert ExistingToken();
            }
        }
    }

    function getRewardTokens()
        external
        view
        returns (address[] memory)
    {
        address[] memory tokens = new address[](
            rewardTokens.length
        );

        for (uint256 i; i < rewardTokens.length; i++) {
            tokens[i] = rewardTokens[i];
        }

        return tokens;
    }

    /**
     * @dev Tracks timestamp for when reward was applied last time
     */
    function lastTimeRewardApplicable()
        public
        view
        returns (uint256 res)
    {
        res = block.timestamp < periodFinished
            ? block.timestamp
            : periodFinished;
    }

    /**
     * @dev Relative value on reward for single
     * staked token for a given {_rewardToken}
     */
    function rewardPerToken(
        address _rewardToken
    )
        public
        view
        returns (uint256)
    {
        RewardData storage r = rewards[
            _rewardToken
        ];

        uint256 timeFrame = lastTimeRewardApplicable()
            - lastUpdateTime;

        uint256 extraFund = timeFrame
            * r.rewardRate
            * PRECISIONS
            / _totalStaked;

        return r.perTokenStored
            + extraFund;
    }

    /**
     * @dev Returns an array of earned amounts for
     * all reward tokens by given {_walletAddress}
     */
    function earned(
        address _walletAddress
    )
        external
        view
        returns (uint256[] memory)
    {
        uint256[] memory earnedAmounts = new uint256[](
            rewardTokens.length
        );

        for (uint256 i; i < rewardTokens.length; i++) {
            earnedAmounts[i] = earnedByToken(
                rewardTokens[i],
                _walletAddress
            );
        }

        return earnedAmounts;
    }

    /**
     * @dev Reports earned amount of a reward
     * token by wallet address not yet collected
     */
    function earnedByToken(
        address _rewardToken,
        address _walletAddress
    )
        public
        view
        returns (uint256)
    {
        RewardData storage r = rewards[
            _rewardToken
        ];

        uint256 difference = rewardPerToken(_rewardToken)
            - r.perTokenPaid[_walletAddress];

        return _balances[_walletAddress]
            * difference
            / PRECISIONS
            + r.userRewards[_walletAddress];
    }

    /**
     * @dev Performs deposit of staked token into the farm
     */
    function farmDeposit(
        uint256 _stakeAmount
    )
        external
        updateFarm()
        updateUser()
    {
        address senderAddress = msg.sender;

        _stake(
            _stakeAmount,
            senderAddress
        );

        safeTransferFrom(
            stakeToken,
            senderAddress,
            address(this),
            _stakeAmount
        );

        emit Staked(
            senderAddress,
            _stakeAmount
        );
    }

    function farmWithdraw(
        uint256 _withdrawAmount
    )
        public
        updateFarm()
        updateUser()
    {
        address senderAddress = msg.sender;

        _withdraw(
            _withdrawAmount,
            senderAddress
        );

        safeTransfer(
            stakeToken,
            senderAddress,
            _withdrawAmount
        );

        emit Withdrawn(
            senderAddress,
            _withdrawAmount
        );
    }

    function exitFarm()
        external
    {
        uint256 withdrawAmount = _balances[
            msg.sender
        ];

        farmWithdraw(
            withdrawAmount
        );

        claimRewards();
    }

    function claimRewards()
        public
        updateFarm()
        updateUser()
    {
        address senderAddress = msg.sender;

        for (uint256 i; i < rewardTokens.length; i++) {

            address tokenAddress = rewardTokens[i];

            RewardData storage r = rewards[
                tokenAddress
            ];

            uint256 rewardAmount = earnedByToken(
                tokenAddress,
                senderAddress
            );

            if (rewardAmount > 0) {

                r.userRewards[senderAddress] = 0;

                safeTransfer(
                    IERC20(tokenAddress),
                    senderAddress,
                    rewardAmount
                );

                emit RewardPaid(
                    senderAddress,
                    tokenAddress,
                    rewardAmount
                );
            }
        }
    }

    function proposeNewOwner(
        address _newOwner
    )
        external
        onlyOwner
    {
        if (_newOwner == ZERO_ADDRESS) {
            revert InvalidAddress();
        }

        proposedOwner = _newOwner;

        emit OwnerProposed(
            _newOwner
        );
    }

    function claimOwnership()
        external
    {
        require(
            msg.sender == proposedOwner,
            "DynamicRewardFarm: INVALID_CANDIDATE"
        );

        ownerAddress = proposedOwner;

        emit OwnerChanged(
            ownerAddress
        );
    }

    function changeManager(
        address _newManager
    )
        external
        onlyOwner
    {
        if (_newManager == ZERO_ADDRESS) {
            revert InvalidAddress();
        }

        managerAddress = _newManager;

        emit ManagerChanged(
            _newManager
        );
    }

    function recoverToken(
        address _tokenAddress,
        uint256 _recoveryAmount
    )
        external
        onlyOwner
    {
        IERC20 tokenAddress = IERC20(
            _tokenAddress
        );

        if (tokenAddress == stakeToken) {
            revert("DynamicRewardFarm: STAKE_TOKEN");
        }

        for (uint256 i; i < rewardTokens.length; i++) {
            if (_tokenAddress == rewardTokens[i]) {

                uint256 earnedByDead = earnedByToken(
                    _tokenAddress,
                    DEAD_ADDRESS
                );

                require(
                    _recoveryAmount <= earnedByDead,
                    "DynamicRewardFarm: NOT_ENOUGH_REWARDS"
                );

                _updateFarm();
                _updateUser(DEAD_ADDRESS);

                rewards[_tokenAddress].userRewards[DEAD_ADDRESS] =
                rewards[_tokenAddress].userRewards[DEAD_ADDRESS] - _recoveryAmount;

                break;
            }
        }

        safeTransfer(
            tokenAddress,
            ownerAddress,
            _recoveryAmount
        );

        emit Recovered(
            tokenAddress,
            _recoveryAmount
        );
    }

    function setRewardDuration(
        uint256 _rewardDuration
    )
        external
        onlyOwner
    {
        require(
            _rewardDuration > 0,
            "DynamicRewardFarm: INVALID_DURATION"
        );

        require(
            block.timestamp > periodFinished,
            "DynamicRewardFarm: ONGOING_DISTRIBUTION"
        );

        rewardDuration = _rewardDuration;

        emit RewardsDurationUpdated(
            _rewardDuration
        );
    }

    function _onlyExistingToken(
        address _tokenAddress
    )
        private
        view
    {
        for (uint256 i; i < rewardTokens.length; i++) {
            if (_tokenAddress == rewardTokens[i]) {
                return;
            }
        }

        revert UnknownToken();
    }

    /**
     * @dev Internal function to set reward rate for a token
     */
    function _setRewardRate(
        address _rewardToken,
        uint256 _newRewardRate
    )
        private
    {
        _onlyExistingToken(
            _rewardToken
        );

        IERC20 tokenAddress = IERC20(
            _rewardToken
        );

        RewardData storage r = rewards[
            _rewardToken
        ];

        if (block.timestamp < periodFinished) {

            require(
                r.rewardRate <= _newRewardRate,
                "DynamicRewardFarm: RATE_CANT_DECREASE"
            );

            uint256 remainingTime = periodFinished
                - block.timestamp;

            uint256 remainingRewards = remainingTime
                * r.rewardRate;

            safeTransfer(
                tokenAddress,
                managerAddress,
                remainingRewards
            );
        }

        r.rewardRate = _newRewardRate;

        uint256 newRewardAmount = rewardDuration
            * _newRewardRate;

        safeTransferFrom(
            tokenAddress,
            managerAddress,
            address(this),
            newRewardAmount
        );

        emit RewardAdded(
            _rewardToken,
            _newRewardRate,
            newRewardAmount
        );
    }

    /**
     * @dev Sets the reward rates for multiple reward tokens
     */
    function setRewardRates(
        address[] calldata _rewardTokens,
        uint256[] calldata _newRewardRates
    )
        external
        onlyManager
        updateFarm()
    {
        require(
            _rewardTokens.length == _newRewardRates.length,
            "DynamicRewardFarm: ARRAY_LENGTH_MISMATCH"
        );

        require(
            _rewardTokens.length == rewardTokens.length,
            "DynamicRewardFarm: TOKEN_LENGTH_MISMATCH"
        );

        _shouldHaveSomeRewards(
            _newRewardRates
        );

        for (uint256 i; i < _rewardTokens.length; i++) {

            require(
                _rewardTokens[i] == rewardTokens[i],
                "DynamicRewardFarm: INVALID_TOKEN_ORDER"
            );

            _setRewardRate(
                _rewardTokens[i],
                _newRewardRates[i]
            );
        }

        lastUpdateTime = block.timestamp;
        periodFinished = block.timestamp + rewardDuration;
    }

    /**
     * @dev Checks if there are any rewards to distribute
     */
    function _shouldHaveSomeRewards(
        uint256[] calldata _newRewardRates
    )
        private
        pure
    {
        for (uint256 i; i < _newRewardRates.length; i++) {
            if (_newRewardRates[i] > 0) {
                return;
            }
        }

        revert NoRewards();
    }

    /**
     * @dev Allows to transfer receipt tokens
     */
    function transfer(
        address _recipient,
        uint256 _amount
    )
        external
        updateFarm()
        updateUser()
        updateSender(_recipient)
        returns (bool)
    {
        _transfer(
            msg.sender,
            _recipient,
            _amount
        );

        return true;
    }

    /**
     * @dev Allows to transfer receipt tokens on owner's behalf
     */
    function transferFrom(
        address _sender,
        address _recipient,
        uint256 _amount
    )
        external
        updateFarm()
        updateSender(_sender)
        updateSender(_recipient)
        returns (bool)
    {
        if (_allowances[_sender][msg.sender] != type(uint256).max) {
            _allowances[_sender][msg.sender] -= _amount;
        }

        _transfer(
            _sender,
            _recipient,
            _amount
        );

        return true;
    }

    function _updateFarm()
        private
    {
        for (uint256 i; i < rewardTokens.length; i++) {
            address rewardToken = rewardTokens[i];
            rewards[rewardToken].perTokenStored = rewardPerToken(
                rewardToken
            );
        }

        lastUpdateTime = lastTimeRewardApplicable();
    }

    function _updateUser(
        address _user
    )
        private
    {
        for (uint256 i; i < rewardTokens.length; i++) {

            address tokenAddress = rewardTokens[i];

            RewardData storage r = rewards[
                tokenAddress
            ];

            r.userRewards[_user] = earnedByToken(
                tokenAddress,
                _user
            );

            r.perTokenPaid[_user] = r.perTokenStored;
        }
    }

    function _onlyOwner()
        private
        view
    {
        require(
            msg.sender == ownerAddress,
            "DynamicRewardFarm: INVALID_OWNER"
        );
    }

    function _onlyManager()
        private
        view
    {
        require(
            msg.sender == managerAddress,
            "DynamicRewardFarm: INVALID_MANAGER"
        );
    }
}

File 2 of 4 : TokenWrapper.sol
// SPDX-License-Identifier: -- BCOM --

pragma solidity =0.8.26;

import "./SafeERC20.sol";

contract TokenWrapper is SafeERC20 {

    string public name;
    string public symbol;

    uint8 public constant decimals = 18;

    uint256 _totalStaked;

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

    address constant ZERO_ADDRESS = address(0x0);

    event Transfer(
        address indexed from,
        address indexed to,
        uint256 value
    );

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    event Staked(
        address indexed user,
        uint256 tokenAmount
    );

    event Withdrawn(
        address indexed user,
        uint256 tokenAmount
    );

    event RewardAdded(
        address indexed rewardToken,
        uint256 rewardRate,
        uint256 tokenAmount
    );

    event RewardPaid(
        address indexed user,
        address indexed rewardToken,
        uint256 tokenAmount
    );

    event Recovered(
        IERC20 indexed token,
        uint256 tokenAmount
    );

    event RewardsDurationUpdated(
        uint256 newRewardDuration
    );

    event OwnerProposed(
        address proposedOwner
    );

    event OwnerChanged(
        address newOwner
    );

    event ManagerChanged(
        address newManager
    );

    /**
     * @dev Returns total amount of staked tokens
     */
    function totalSupply()
        external
        view
        returns (uint256)
    {
        return _totalStaked;
    }

    /**
     * @dev Returns staked amount by wallet address
     */
    function balanceOf(
        address _walletAddress
    )
        external
        view
        returns (uint256)
    {
        return _balances[_walletAddress];
    }

    /**
     * @dev Increases staked amount by wallet address
     */
    function _stake(
        uint256 _amount,
        address _address
    )
        internal
    {
        _totalStaked =
        _totalStaked + _amount;

        unchecked {
            _balances[_address] =
            _balances[_address] + _amount;
        }

        emit Transfer(
            ZERO_ADDRESS,
            _address,
            _amount
        );
    }

    /**
     * @dev Decreases total staked amount
     */
    function _withdraw(
        uint256 _amount,
        address _address
    )
        internal
    {
        _burn(
            _amount,
            _address
        );
    }

    /**
     * @dev Decreases total staked amount
     */
    function _burn(
        uint256 _amount,
        address _address
    )
        internal
    {
        unchecked {
            _totalStaked =
            _totalStaked - _amount;
        }

        _balances[_address] =
        _balances[_address] - _amount;

        emit Transfer(
            _address,
            ZERO_ADDRESS,
            _amount
        );
    }

    /**
     * @dev Updates balances during transfer
     */
    function _transfer(
        address _sender,
        address _recipient,
        uint256 _amount
    )
        internal
    {
        _balances[_sender] =
        _balances[_sender] - _amount;

        unchecked {
            _balances[_recipient] =
            _balances[_recipient] + _amount;
        }

        emit Transfer(
            _sender,
            _recipient,
            _amount
        );
    }

    /**
     * @dev Grants permission for receipt tokens transfer on owner's behalf
     */
    function approve(
        address _spender,
        uint256 _amount
    )
        external
        returns (bool)
    {
        _approve(
            msg.sender,
            _spender,
            _amount
        );

        return true;
    }

    /**
     * @dev Checks value for receipt tokens transfer on owner's behalf
     */
    function allowance(
        address _owner,
        address _spender
    )
        external
        view
        returns (uint256)
    {
        return _allowances[_owner][_spender];
    }

    /**
     * @dev Allowance update for receipt tokens transfer on owner's behalf
     */
    function _approve(
        address _owner,
        address _spender,
        uint256 _amount
    )
        internal
    {
        _allowances[_owner][_spender] = _amount;

        emit Approval(
            _owner,
            _spender,
            _amount
        );
    }

    /**
     * @dev Increases value for receipt tokens transfer on owner's behalf
     */
    function increaseAllowance(
        address _spender,
        uint256 _addedValue
    )
        external
        returns (bool)
    {
        _approve(
            msg.sender,
            _spender,
            _allowances[msg.sender][_spender] + _addedValue
        );

        return true;
    }

    /**
     * @dev Decreases value for receipt tokens transfer on owner's behalf
     */
    function decreaseAllowance(
        address _spender,
        uint256 _subtractedValue
    )
        external
        returns (bool)
    {
        _approve(
            msg.sender,
            _spender,
            _allowances[msg.sender][_spender] - _subtractedValue
        );

        return true;
    }
}

File 3 of 4 : SafeERC20.sol
// SPDX-License-Identifier: -- BCOM --

pragma solidity =0.8.26;

import "./IERC20.sol";

error SafeERC20FailedOperation(
    address token
);

contract SafeERC20 {

    /**
     * @dev Allows to execute transfer for a token
     */
    function safeTransfer(
        IERC20 _token,
        address _to,
        uint256 _value
    )
        internal
    {
        _callOptionalReturn(
            _token,
            abi.encodeWithSelector(
                _token.transfer.selector,
                _to,
                _value
            )
        );
    }

    /**
     * @dev Allows to execute transferFrom for a token
     */
    function safeTransferFrom(
        IERC20 _token,
        address _from,
        address _to,
        uint256 _value
    )
        internal
    {
        _callOptionalReturn(
            _token,
            abi.encodeWithSelector(
                _token.transferFrom.selector,
                _from,
                _to,
                _value
            )
        );
    }

    function _callOptionalReturn(
        IERC20 _token,
        bytes memory _data
    )
        private
    {
        uint256 returnSize;
        uint256 returnValue;

        assembly ("memory-safe") {

            let success := call(
                gas(),
                _token,
                0,
                add(_data, 0x20),
                mload(_data),
                0,
                0x20
            )

            // bubble errors
            if iszero(success) {
                let ptr := mload(0x40)
                returndatacopy(
                    ptr,
                    0,
                    returndatasize()
                )
                revert(
                    ptr,
                    returndatasize()
                )
            }
            returnSize := returndatasize()
            returnValue := mload(0)
        }

        if (returnSize == 0
            ? address(_token).code.length == 0
            : returnValue != 1
        ) {
            revert SafeERC20FailedOperation(
                address(_token)
            );
        }
    }
}

File 4 of 4 : IERC20.sol
// SPDX-License-Identifier: -- BCOM --

pragma solidity =0.8.26;

interface IERC20 {

    /**
     * @dev Interface fo transfer function
     */
    function transfer(
        address _recipient,
        uint256 _amount
    )
        external
        returns (bool);

    /**
     * @dev Interface for transferFrom function
     */
    function transferFrom(
        address _sender,
        address _recipient,
        uint256 _amount
    )
        external
        returns (bool);

    /**
     * @dev Interface for approve function
     */
    function approve(
        address _spender,
        uint256 _amount
    )
        external
        returns (bool);

    function balanceOf(
        address _account
    )
        external
        view
        returns (uint256);

    function mint(
        address _user,
        uint256 _amount
    )
        external;
}

Settings
{
  "remappings": [
    "@chainlink/=node_modules/@chainlink/",
    "@ensdomains/=node_modules/@ensdomains/",
    "@eth-optimism/=node_modules/@eth-optimism/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "eth-gas-reporter/=node_modules/eth-gas-reporter/",
    "forge-std/=lib/forge-std/src/",
    "hardhat/=node_modules/hardhat/",
    "truffle/=node_modules/truffle/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 9999999
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"ExistingToken","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"NoRewards","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UnknownToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newManager","type":"address"}],"name":"ManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"proposedOwner","type":"address"}],"name":"OwnerProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenCount","type":"uint256"}],"name":"RewardTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRewardDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"addRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletAddress","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newManager","type":"address"}],"name":"changeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletAddress","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_walletAddress","type":"address"}],"name":"earnedByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exitFarm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeAmount","type":"uint256"}],"name":"farmDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawAmount","type":"uint256"}],"name":"farmWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_defaultDuration","type":"uint256"},{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"address","name":"_managerAddress","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"res","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinished","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"proposeNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_recoveryAmount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"perTokenStored","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardDuration","type":"uint256"}],"name":"setRewardDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"_newRewardRates","type":"uint256[]"}],"name":"setRewardRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCount","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":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6080604052348015600e575f80fd5b50612a4b8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610282575f3560e01c806390717dd311610157578063b29a8140116100d2578063cf73a1bc11610088578063dd62ed3e1161006e578063dd62ed3e146105a3578063f1229777146105e8578063f520e7e5146105fb575f80fd5b8063cf73a1bc14610563578063d153b60c14610583575f80fd5b8063c4f59f9b116100b8578063c4f59f9b1461053d578063c8f33c9114610552578063cddaf3581461055b575f80fd5b8063b29a814014610517578063c0ed00c91461052a575f80fd5b8063a457c2d711610127578063a9a901971161010d578063a9a90197146104de578063b1899bd6146104f1578063b1f8100d14610504575f80fd5b8063a457c2d7146104b8578063a9059cbb146104cb575f80fd5b806390717dd31461048157806395d89b41146104945780639f181b5e1461049c578063a3fbbaae146104a5575f80fd5b8063313ce5671161020157806351ed6a30116101b75780637bb7bed11161019d5780637bb7bed11461044657806380faa57d146104595780638f84aa0914610461575f80fd5b806351ed6a30146103cc57806370a0823114610411575f80fd5b806339509351116101e7578063395093511461039e5780633b9e9b45146103b15780634e71e0c8146103c4575f80fd5b8063313ce5671461037c578063372500ab14610396575f80fd5b80630962c4f9116102565780631c03e6cc1161023c5780631c03e6cc1461034157806323b872dd146103565780632b8c8a6414610369575f80fd5b80630962c4f91461032257806318160ddd14610339575f80fd5b80628cc2621461028657806306fdde03146102af5780630700037d146102c4578063095ea7b3146102ff575b5f80fd5b610299610294366004612426565b610604565b6040516102a69190612446565b60405180910390f35b6102b76106c5565b6040516102a69190612488565b6102ea6102d2366004612426565b600e6020525f90815260409020805460019091015482565b604080519283526020830191909152016102a6565b61031261030d3660046124db565b610750565b60405190151581526020016102a6565b61032b60065481565b6040519081526020016102a6565b60025461032b565b61035461034f366004612426565b610766565b005b610312610364366004612503565b6108dd565b61035461037736600461253d565b6109ac565b610384601281565b60405160ff90911681526020016102a6565b610354610a40565b6103126103ac3660046124db565b610b60565b61032b6103bf366004612554565b610ba8565b610354610c60565b6005546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102a6565b61032b61041f366004612426565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b6103ec61045436600461253d565b610d81565b61032b610db6565b6009546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b61035461048f36600461253d565b610dcc565b6102b7610e55565b61032b600c5481565b6103546104b3366004612426565b610e62565b6103126104c63660046124db565b610f31565b6103126104d93660046124db565b610f74565b6103546104ec3660046125ca565b610fa5565b6103546104ff3660046126b4565b611164565b610354610512366004612426565b611412565b6103546105253660046124db565b6114da565b61035461053836600461253d565b611763565b6105456118c0565b6040516102a69190612720565b61032b60085481565b610354611998565b600b546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b600a546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b61032b6105b1366004612554565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260046020908152604080832093909416825291909152205490565b61032b6105f6366004612426565b6119bb565b61032b60075481565b600d546060905f9067ffffffffffffffff8111156106245761062461276d565b60405190808252806020026020018201604052801561064d578160200160208202803683370190505b5090505f5b600d548110156106be57610699600d82815481106106725761067261279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff1685610ba8565b8282815181106106ab576106ab61279a565b6020908102919091010152600101610652565b5092915050565b5f80546106d1906127c7565b80601f01602080910402602001604051908101604052809291908181526020018280546106fd906127c7565b80156107485780601f1061071f57610100808354040283529160200191610748565b820191905f5260205f20905b81548152906001019060200180831161072b57829003601f168201915b505050505081565b5f61075c338484611a3a565b5060015b92915050565b61076e611aa8565b6014600c5410610805576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44796e616d69635265776172644661726d3a204d41585f544f4b454e535f524560448201527f414348454400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61080e81611b2b565b600d8054600180820183555f929092527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055600c5461088a9161283f565b600c81905560405190815273ffffffffffffffffffffffffffffffffffffffff8216907f68e3e9397770d9dfa88c0953a34e1a70a05416b3895957f5b689787a920791c49060200160405180910390a250565b5f6108e6611bfc565b836108f081611c8a565b836108fa81611c8a565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146109955773ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091528120805486929061098f908490612852565b90915550505b6109a0868686611d34565b50600195945050505050565b6109b4611bfc565b6109bd33611c8a565b336109c88282611dcf565b6005546109ec9073ffffffffffffffffffffffffffffffffffffffff168284611dd9565b8073ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d583604051610a3491815260200190565b60405180910390a25050565b610a48611bfc565b610a5133611c8a565b335f5b600d54811015610b5c575f600d8281548110610a7257610a7261279a565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600e9091526040822090925090610aaf8386610ba8565b90508015610b515773ffffffffffffffffffffffffffffffffffffffff85165f908152600283016020526040812055610ae9838683611dd9565b8273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610b4891815260200190565b60405180910390a35b505050600101610a54565b5050565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161075c918590610ba390869061283f565b611a3a565b73ffffffffffffffffffffffffffffffffffffffff8083165f908152600e602090815260408083209385168352600384019091528120549091908290610bed866119bb565b610bf79190612852565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260028401602090815260408083205460039092529091205491925090670de0b6b3a764000090610c43908490612865565b610c4d919061287c565b610c57919061283f565b95945050505050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44796e616d69635265776172644661726d3a20494e56414c49445f43414e444960448201527f444154450000000000000000000000000000000000000000000000000000000060648201526084016107fc565b600a54600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf369060200160405180910390a1565b600d8181548110610d90575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f6006544210610dc7575060065490565b504290565b610dd4611bfc565b610ddd33611c8a565b33610de88282611eb2565b600554610e0d9073ffffffffffffffffffffffffffffffffffffffff16823085611f24565b8073ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d83604051610a3491815260200190565b600180546106d1906127c7565b610e6a611aa8565b73ffffffffffffffffffffffffffffffffffffffff8116610eb7576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f198db6e425fb8aafd1823c6ca50be2d51e5764571a5ae0f0f21c6812e45def0b906020015b60405180910390a150565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161075c918590610ba3908690612852565b5f610f7d611bfc565b610f8633611c8a565b82610f9081611c8a565b610f9b338585611d34565b5060019392505050565b5f8711611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f44796e616d69635265776172644661726d3a20494e56414c49445f445552415460448201527f494f4e000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b600754156110c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f44796e616d69635265776172644661726d3a20414c52454144595f494e49544960448201527f414c495a4544000000000000000000000000000000000000000000000000000060648201526084016107fc565b60078790555f6110d58486836128ff565b5060016110e38284836128ff565b506005805473ffffffffffffffffffffffffffffffffffffffff808b167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560098054898416908316179055600b80549288169290911691909117905561115a670de0b6b3a764000061dead611eb2565b5050505050505050565b61116c611f88565b611174611bfc565b828114611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f44796e616d69635265776172644661726d3a2041525241595f4c454e4754485f60448201527f4d49534d4154434800000000000000000000000000000000000000000000000060648201526084016107fc565b600d548314611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f44796e616d69635265776172644661726d3a20544f4b454e5f4c454e4754485f60448201527f4d49534d4154434800000000000000000000000000000000000000000000000060648201526084016107fc565b61129e828261202f565b5f5b838110156113f657600d81815481106112bb576112bb61279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff168585838181106112ee576112ee61279a565b90506020020160208101906113039190612426565b73ffffffffffffffffffffffffffffffffffffffff16146113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f44796e616d69635265776172644661726d3a20494e56414c49445f544f4b454e60448201527f5f4f52444552000000000000000000000000000000000000000000000000000060648201526084016107fc565b6113ee8585838181106113bb576113bb61279a565b90506020020160208101906113d09190612426565b8484848181106113e2576113e261279a565b90506020020135612099565b6001016112a0565b504260088190556007546114099161283f565b60065550505050565b61141a611aa8565b73ffffffffffffffffffffffffffffffffffffffff8116611467576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f35b5da26a401fdbef2e1cfabeec2c10a6121d56f136be501a393c284cdd1af5890602001610f26565b6114e2611aa8565b600554829073ffffffffffffffffffffffffffffffffffffffff90811690821603611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f44796e616d69635265776172644661726d3a205354414b455f544f4b454e000060448201526064016107fc565b5f5b600d548110156116e857600d81815481106115885761158861279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff908116908516036116e0575f6115c08561dead610ba8565b905080841115611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44796e616d69635265776172644661726d3a204e4f545f454e4f5547485f524560448201527f574152445300000000000000000000000000000000000000000000000000000060648201526084016107fc565b61165a611bfc565b61166561dead611c8a565b73ffffffffffffffffffffffffffffffffffffffff85165f908152600e6020908152604080832061dead84526002019091529020546116a5908590612852565b73ffffffffffffffffffffffffffffffffffffffff86165f908152600e6020908152604080832061dead8452600201909152902055506116e8565b60010161156b565b5060095461170e90829073ffffffffffffffffffffffffffffffffffffffff1684611dd9565b8073ffffffffffffffffffffffffffffffffffffffff167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288360405161175691815260200190565b60405180910390a2505050565b61176b611aa8565b5f81116117fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f44796e616d69635265776172644661726d3a20494e56414c49445f445552415460448201527f494f4e000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b600654421161188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f44796e616d69635265776172644661726d3a204f4e474f494e475f444953545260448201527f49425554494f4e0000000000000000000000000000000000000000000000000060648201526084016107fc565b60078190556040518181527ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d390602001610f26565b600d546060905f9067ffffffffffffffff8111156118e0576118e061276d565b604051908082528060200260200182016040528015611909578160200160208202803683370190505b5090505f5b600d5481101561199257600d818154811061192b5761192b61279a565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168282815181106119655761196561279a565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161190e565b50919050565b335f908152600360205260409020546119b0816109ac565b6119b8610a40565b50565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600e6020526040812060085482906119ec610db6565b6119f69190612852565b90505f600254670de0b6b3a7640000845f015484611a149190612865565b611a1e9190612865565b611a28919061287c565b9050808360010154610c57919061283f565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60095473ffffffffffffffffffffffffffffffffffffffff163314611b29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f44796e616d69635265776172644661726d3a20494e56414c49445f4f574e455260448201526064016107fc565b565b73ffffffffffffffffffffffffffffffffffffffff8116611b78576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b600d54811015610b5c57600d8181548110611b9757611b9761279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff90811690831603611bf4576040517fe4ed28f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101611b7a565b5f5b600d54811015611c7c575f600d8281548110611c1c57611c1c61279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050611c48816119bb565b73ffffffffffffffffffffffffffffffffffffffff9091165f908152600e6020526040902060019081019190915501611bfe565b50611c85610db6565b600855565b5f5b600d54811015610b5c575f600d8281548110611caa57611caa61279a565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600e9091526040909120909150611ce78285610ba8565b73ffffffffffffffffffffffffffffffffffffffff85165f908152600283016020908152604080832093909355600180850154600390950190915291902091909155919091019050611c8c565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260036020526040902054611d64908290612852565b73ffffffffffffffffffffffffffffffffffffffff8481165f8181526003602090815260408083209590955592861680825290849020805486019055925184815290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611a9b565b610b5c8282612243565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611ead9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526122d6565b505050565b81600254611ec0919061283f565b60025573ffffffffffffffffffffffffffffffffffffffff81165f818152600360209081526040808320805487019055518581527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611f829085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611e2b565b50505050565b600b5473ffffffffffffffffffffffffffffffffffffffff163314611b29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f44796e616d69635265776172644661726d3a20494e56414c49445f4d414e414760448201527f455200000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b5f5b81811015612066575f83838381811061204c5761204c61279a565b90506020020135111561205e57505050565b600101612031565b506040517f3fb087f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120a282612375565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600e602052604090206006548391904210156121af578054831015612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44796e616d69635265776172644661726d3a20524154455f43414e545f44454360448201527f524541534500000000000000000000000000000000000000000000000000000060648201526084016107fc565b5f426006546121739190612852565b82549091505f906121849083612865565b600b549091506121ac90859073ffffffffffffffffffffffffffffffffffffffff1683611dd9565b50505b8281556007545f906121c2908590612865565b600b549091506121eb90849073ffffffffffffffffffffffffffffffffffffffff163084611f24565b604080518581526020810183905273ffffffffffffffffffffffffffffffffffffffff8716917f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474910160405180910390a25050505050565b60028054839003905573ffffffffffffffffffffffffffffffffffffffff81165f9081526003602052604090205461227c908390612852565b73ffffffffffffffffffffffffffffffffffffffff82165f818152600360205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f189086815260200190565b5f8060205f8451602086015f885af1806122f5576040513d5f823e3d81fd5b50505f513d9150811561230c578060011415612326565b73ffffffffffffffffffffffffffffffffffffffff84163b155b15611f82576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107fc565b5f5b600d548110156123cb57600d81815481106123945761239461279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff908116908316036123c3575050565b600101612377565b506040517f8698bf3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114612421575f80fd5b919050565b5f60208284031215612436575f80fd5b61243f826123fe565b9392505050565b602080825282518282018190525f918401906040840190835b8181101561247d57835183526020938401939092019160010161245f565b509095945050505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f80604083850312156124ec575f80fd5b6124f5836123fe565b946020939093013593505050565b5f805f60608486031215612515575f80fd5b61251e846123fe565b925061252c602085016123fe565b929592945050506040919091013590565b5f6020828403121561254d575f80fd5b5035919050565b5f8060408385031215612565575f80fd5b61256e836123fe565b915061257c602084016123fe565b90509250929050565b5f8083601f840112612595575f80fd5b50813567ffffffffffffffff8111156125ac575f80fd5b6020830191508360208285010111156125c3575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156125e1575f80fd5b6125ea896123fe565b9750602089013596506125ff60408a016123fe565b955061260d60608a016123fe565b9450608089013567ffffffffffffffff811115612628575f80fd5b6126348b828c01612585565b90955093505060a089013567ffffffffffffffff811115612653575f80fd5b61265f8b828c01612585565b999c989b5096995094979396929594505050565b5f8083601f840112612683575f80fd5b50813567ffffffffffffffff81111561269a575f80fd5b6020830191508360208260051b85010111156125c3575f80fd5b5f805f80604085870312156126c7575f80fd5b843567ffffffffffffffff8111156126dd575f80fd5b6126e987828801612673565b909550935050602085013567ffffffffffffffff811115612708575f80fd5b61271487828801612673565b95989497509550505050565b602080825282518282018190525f918401906040840190835b8181101561247d57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612739565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b600181811c908216806127db57607f821691505b602082108103611992577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561076057610760612812565b8181038181111561076057610760612812565b808202811582820484141761076057610760612812565b5f826128af577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b601f821115611ead57805f5260205f20601f840160051c810160208510156128d95750805b601f840160051c820191505b818110156128f8575f81556001016128e5565b5050505050565b67ffffffffffffffff8311156129175761291761276d565b61292b8361292583546127c7565b836128b4565b5f601f84116001811461297b575f85156129455750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556128f8565b5f838152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08716915b828110156129c857868501358255602094850194600190920191016129a8565b5086821015612a03577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b018355505050505056fea2646970667358221220193db1e50b18e8f491ff2df84acc986d4aabf5810f8182f61b04f15f52412d6964736f6c634300081a0033

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610282575f3560e01c806390717dd311610157578063b29a8140116100d2578063cf73a1bc11610088578063dd62ed3e1161006e578063dd62ed3e146105a3578063f1229777146105e8578063f520e7e5146105fb575f80fd5b8063cf73a1bc14610563578063d153b60c14610583575f80fd5b8063c4f59f9b116100b8578063c4f59f9b1461053d578063c8f33c9114610552578063cddaf3581461055b575f80fd5b8063b29a814014610517578063c0ed00c91461052a575f80fd5b8063a457c2d711610127578063a9a901971161010d578063a9a90197146104de578063b1899bd6146104f1578063b1f8100d14610504575f80fd5b8063a457c2d7146104b8578063a9059cbb146104cb575f80fd5b806390717dd31461048157806395d89b41146104945780639f181b5e1461049c578063a3fbbaae146104a5575f80fd5b8063313ce5671161020157806351ed6a30116101b75780637bb7bed11161019d5780637bb7bed11461044657806380faa57d146104595780638f84aa0914610461575f80fd5b806351ed6a30146103cc57806370a0823114610411575f80fd5b806339509351116101e7578063395093511461039e5780633b9e9b45146103b15780634e71e0c8146103c4575f80fd5b8063313ce5671461037c578063372500ab14610396575f80fd5b80630962c4f9116102565780631c03e6cc1161023c5780631c03e6cc1461034157806323b872dd146103565780632b8c8a6414610369575f80fd5b80630962c4f91461032257806318160ddd14610339575f80fd5b80628cc2621461028657806306fdde03146102af5780630700037d146102c4578063095ea7b3146102ff575b5f80fd5b610299610294366004612426565b610604565b6040516102a69190612446565b60405180910390f35b6102b76106c5565b6040516102a69190612488565b6102ea6102d2366004612426565b600e6020525f90815260409020805460019091015482565b604080519283526020830191909152016102a6565b61031261030d3660046124db565b610750565b60405190151581526020016102a6565b61032b60065481565b6040519081526020016102a6565b60025461032b565b61035461034f366004612426565b610766565b005b610312610364366004612503565b6108dd565b61035461037736600461253d565b6109ac565b610384601281565b60405160ff90911681526020016102a6565b610354610a40565b6103126103ac3660046124db565b610b60565b61032b6103bf366004612554565b610ba8565b610354610c60565b6005546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102a6565b61032b61041f366004612426565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b6103ec61045436600461253d565b610d81565b61032b610db6565b6009546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b61035461048f36600461253d565b610dcc565b6102b7610e55565b61032b600c5481565b6103546104b3366004612426565b610e62565b6103126104c63660046124db565b610f31565b6103126104d93660046124db565b610f74565b6103546104ec3660046125ca565b610fa5565b6103546104ff3660046126b4565b611164565b610354610512366004612426565b611412565b6103546105253660046124db565b6114da565b61035461053836600461253d565b611763565b6105456118c0565b6040516102a69190612720565b61032b60085481565b610354611998565b600b546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b600a546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b61032b6105b1366004612554565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260046020908152604080832093909416825291909152205490565b61032b6105f6366004612426565b6119bb565b61032b60075481565b600d546060905f9067ffffffffffffffff8111156106245761062461276d565b60405190808252806020026020018201604052801561064d578160200160208202803683370190505b5090505f5b600d548110156106be57610699600d82815481106106725761067261279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff1685610ba8565b8282815181106106ab576106ab61279a565b6020908102919091010152600101610652565b5092915050565b5f80546106d1906127c7565b80601f01602080910402602001604051908101604052809291908181526020018280546106fd906127c7565b80156107485780601f1061071f57610100808354040283529160200191610748565b820191905f5260205f20905b81548152906001019060200180831161072b57829003601f168201915b505050505081565b5f61075c338484611a3a565b5060015b92915050565b61076e611aa8565b6014600c5410610805576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44796e616d69635265776172644661726d3a204d41585f544f4b454e535f524560448201527f414348454400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61080e81611b2b565b600d8054600180820183555f929092527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055600c5461088a9161283f565b600c81905560405190815273ffffffffffffffffffffffffffffffffffffffff8216907f68e3e9397770d9dfa88c0953a34e1a70a05416b3895957f5b689787a920791c49060200160405180910390a250565b5f6108e6611bfc565b836108f081611c8a565b836108fa81611c8a565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146109955773ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091528120805486929061098f908490612852565b90915550505b6109a0868686611d34565b50600195945050505050565b6109b4611bfc565b6109bd33611c8a565b336109c88282611dcf565b6005546109ec9073ffffffffffffffffffffffffffffffffffffffff168284611dd9565b8073ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d583604051610a3491815260200190565b60405180910390a25050565b610a48611bfc565b610a5133611c8a565b335f5b600d54811015610b5c575f600d8281548110610a7257610a7261279a565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600e9091526040822090925090610aaf8386610ba8565b90508015610b515773ffffffffffffffffffffffffffffffffffffffff85165f908152600283016020526040812055610ae9838683611dd9565b8273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610b4891815260200190565b60405180910390a35b505050600101610a54565b5050565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161075c918590610ba390869061283f565b611a3a565b73ffffffffffffffffffffffffffffffffffffffff8083165f908152600e602090815260408083209385168352600384019091528120549091908290610bed866119bb565b610bf79190612852565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260028401602090815260408083205460039092529091205491925090670de0b6b3a764000090610c43908490612865565b610c4d919061287c565b610c57919061283f565b95945050505050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44796e616d69635265776172644661726d3a20494e56414c49445f43414e444960448201527f444154450000000000000000000000000000000000000000000000000000000060648201526084016107fc565b600a54600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf369060200160405180910390a1565b600d8181548110610d90575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f6006544210610dc7575060065490565b504290565b610dd4611bfc565b610ddd33611c8a565b33610de88282611eb2565b600554610e0d9073ffffffffffffffffffffffffffffffffffffffff16823085611f24565b8073ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d83604051610a3491815260200190565b600180546106d1906127c7565b610e6a611aa8565b73ffffffffffffffffffffffffffffffffffffffff8116610eb7576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f198db6e425fb8aafd1823c6ca50be2d51e5764571a5ae0f0f21c6812e45def0b906020015b60405180910390a150565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161075c918590610ba3908690612852565b5f610f7d611bfc565b610f8633611c8a565b82610f9081611c8a565b610f9b338585611d34565b5060019392505050565b5f8711611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f44796e616d69635265776172644661726d3a20494e56414c49445f445552415460448201527f494f4e000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b600754156110c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f44796e616d69635265776172644661726d3a20414c52454144595f494e49544960448201527f414c495a4544000000000000000000000000000000000000000000000000000060648201526084016107fc565b60078790555f6110d58486836128ff565b5060016110e38284836128ff565b506005805473ffffffffffffffffffffffffffffffffffffffff808b167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560098054898416908316179055600b80549288169290911691909117905561115a670de0b6b3a764000061dead611eb2565b5050505050505050565b61116c611f88565b611174611bfc565b828114611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f44796e616d69635265776172644661726d3a2041525241595f4c454e4754485f60448201527f4d49534d4154434800000000000000000000000000000000000000000000000060648201526084016107fc565b600d548314611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f44796e616d69635265776172644661726d3a20544f4b454e5f4c454e4754485f60448201527f4d49534d4154434800000000000000000000000000000000000000000000000060648201526084016107fc565b61129e828261202f565b5f5b838110156113f657600d81815481106112bb576112bb61279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff168585838181106112ee576112ee61279a565b90506020020160208101906113039190612426565b73ffffffffffffffffffffffffffffffffffffffff16146113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f44796e616d69635265776172644661726d3a20494e56414c49445f544f4b454e60448201527f5f4f52444552000000000000000000000000000000000000000000000000000060648201526084016107fc565b6113ee8585838181106113bb576113bb61279a565b90506020020160208101906113d09190612426565b8484848181106113e2576113e261279a565b90506020020135612099565b6001016112a0565b504260088190556007546114099161283f565b60065550505050565b61141a611aa8565b73ffffffffffffffffffffffffffffffffffffffff8116611467576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f35b5da26a401fdbef2e1cfabeec2c10a6121d56f136be501a393c284cdd1af5890602001610f26565b6114e2611aa8565b600554829073ffffffffffffffffffffffffffffffffffffffff90811690821603611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f44796e616d69635265776172644661726d3a205354414b455f544f4b454e000060448201526064016107fc565b5f5b600d548110156116e857600d81815481106115885761158861279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff908116908516036116e0575f6115c08561dead610ba8565b905080841115611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44796e616d69635265776172644661726d3a204e4f545f454e4f5547485f524560448201527f574152445300000000000000000000000000000000000000000000000000000060648201526084016107fc565b61165a611bfc565b61166561dead611c8a565b73ffffffffffffffffffffffffffffffffffffffff85165f908152600e6020908152604080832061dead84526002019091529020546116a5908590612852565b73ffffffffffffffffffffffffffffffffffffffff86165f908152600e6020908152604080832061dead8452600201909152902055506116e8565b60010161156b565b5060095461170e90829073ffffffffffffffffffffffffffffffffffffffff1684611dd9565b8073ffffffffffffffffffffffffffffffffffffffff167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288360405161175691815260200190565b60405180910390a2505050565b61176b611aa8565b5f81116117fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f44796e616d69635265776172644661726d3a20494e56414c49445f445552415460448201527f494f4e000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b600654421161188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f44796e616d69635265776172644661726d3a204f4e474f494e475f444953545260448201527f49425554494f4e0000000000000000000000000000000000000000000000000060648201526084016107fc565b60078190556040518181527ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d390602001610f26565b600d546060905f9067ffffffffffffffff8111156118e0576118e061276d565b604051908082528060200260200182016040528015611909578160200160208202803683370190505b5090505f5b600d5481101561199257600d818154811061192b5761192b61279a565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168282815181106119655761196561279a565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161190e565b50919050565b335f908152600360205260409020546119b0816109ac565b6119b8610a40565b50565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600e6020526040812060085482906119ec610db6565b6119f69190612852565b90505f600254670de0b6b3a7640000845f015484611a149190612865565b611a1e9190612865565b611a28919061287c565b9050808360010154610c57919061283f565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60095473ffffffffffffffffffffffffffffffffffffffff163314611b29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f44796e616d69635265776172644661726d3a20494e56414c49445f4f574e455260448201526064016107fc565b565b73ffffffffffffffffffffffffffffffffffffffff8116611b78576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b600d54811015610b5c57600d8181548110611b9757611b9761279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff90811690831603611bf4576040517fe4ed28f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101611b7a565b5f5b600d54811015611c7c575f600d8281548110611c1c57611c1c61279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050611c48816119bb565b73ffffffffffffffffffffffffffffffffffffffff9091165f908152600e6020526040902060019081019190915501611bfe565b50611c85610db6565b600855565b5f5b600d54811015610b5c575f600d8281548110611caa57611caa61279a565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600e9091526040909120909150611ce78285610ba8565b73ffffffffffffffffffffffffffffffffffffffff85165f908152600283016020908152604080832093909355600180850154600390950190915291902091909155919091019050611c8c565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260036020526040902054611d64908290612852565b73ffffffffffffffffffffffffffffffffffffffff8481165f8181526003602090815260408083209590955592861680825290849020805486019055925184815290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611a9b565b610b5c8282612243565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611ead9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526122d6565b505050565b81600254611ec0919061283f565b60025573ffffffffffffffffffffffffffffffffffffffff81165f818152600360209081526040808320805487019055518581527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611f829085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611e2b565b50505050565b600b5473ffffffffffffffffffffffffffffffffffffffff163314611b29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f44796e616d69635265776172644661726d3a20494e56414c49445f4d414e414760448201527f455200000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b5f5b81811015612066575f83838381811061204c5761204c61279a565b90506020020135111561205e57505050565b600101612031565b506040517f3fb087f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120a282612375565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600e602052604090206006548391904210156121af578054831015612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44796e616d69635265776172644661726d3a20524154455f43414e545f44454360448201527f524541534500000000000000000000000000000000000000000000000000000060648201526084016107fc565b5f426006546121739190612852565b82549091505f906121849083612865565b600b549091506121ac90859073ffffffffffffffffffffffffffffffffffffffff1683611dd9565b50505b8281556007545f906121c2908590612865565b600b549091506121eb90849073ffffffffffffffffffffffffffffffffffffffff163084611f24565b604080518581526020810183905273ffffffffffffffffffffffffffffffffffffffff8716917f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474910160405180910390a25050505050565b60028054839003905573ffffffffffffffffffffffffffffffffffffffff81165f9081526003602052604090205461227c908390612852565b73ffffffffffffffffffffffffffffffffffffffff82165f818152600360205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f189086815260200190565b5f8060205f8451602086015f885af1806122f5576040513d5f823e3d81fd5b50505f513d9150811561230c578060011415612326565b73ffffffffffffffffffffffffffffffffffffffff84163b155b15611f82576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107fc565b5f5b600d548110156123cb57600d81815481106123945761239461279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff908116908316036123c3575050565b600101612377565b506040517f8698bf3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114612421575f80fd5b919050565b5f60208284031215612436575f80fd5b61243f826123fe565b9392505050565b602080825282518282018190525f918401906040840190835b8181101561247d57835183526020938401939092019160010161245f565b509095945050505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f80604083850312156124ec575f80fd5b6124f5836123fe565b946020939093013593505050565b5f805f60608486031215612515575f80fd5b61251e846123fe565b925061252c602085016123fe565b929592945050506040919091013590565b5f6020828403121561254d575f80fd5b5035919050565b5f8060408385031215612565575f80fd5b61256e836123fe565b915061257c602084016123fe565b90509250929050565b5f8083601f840112612595575f80fd5b50813567ffffffffffffffff8111156125ac575f80fd5b6020830191508360208285010111156125c3575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156125e1575f80fd5b6125ea896123fe565b9750602089013596506125ff60408a016123fe565b955061260d60608a016123fe565b9450608089013567ffffffffffffffff811115612628575f80fd5b6126348b828c01612585565b90955093505060a089013567ffffffffffffffff811115612653575f80fd5b61265f8b828c01612585565b999c989b5096995094979396929594505050565b5f8083601f840112612683575f80fd5b50813567ffffffffffffffff81111561269a575f80fd5b6020830191508360208260051b85010111156125c3575f80fd5b5f805f80604085870312156126c7575f80fd5b843567ffffffffffffffff8111156126dd575f80fd5b6126e987828801612673565b909550935050602085013567ffffffffffffffff811115612708575f80fd5b61271487828801612673565b95989497509550505050565b602080825282518282018190525f918401906040840190835b8181101561247d57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612739565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b600181811c908216806127db57607f821691505b602082108103611992577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561076057610760612812565b8181038181111561076057610760612812565b808202811582820484141761076057610760612812565b5f826128af577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b601f821115611ead57805f5260205f20601f840160051c810160208510156128d95750805b601f840160051c820191505b818110156128f8575f81556001016128e5565b5050505050565b67ffffffffffffffff8311156129175761291761276d565b61292b8361292583546127c7565b836128b4565b5f601f84116001811461297b575f85156129455750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556128f8565b5f838152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08716915b828110156129c857868501358255602094850194600190920191016129a8565b5086821015612a03577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b018355505050505056fea2646970667358221220193db1e50b18e8f491ff2df84acc986d4aabf5810f8182f61b04f15f52412d6964736f6c634300081a0033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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  ]

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.