ETH Price: $2,164.15 (+1.77%)

Contract

0xcbE5F4E8a112F25C2F902714e3cBB7955F19Bb36
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Exit Farm247354232026-03-25 15:21:231 hr ago1774452083IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000029170.27769028
Claim Rewards247353642026-03-25 15:09:351 hr ago1774451375IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000012630.16893349
Claim Rewards247348122026-03-25 13:17:233 hrs ago1774444643IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000084891.09747059
Claim Rewards247336762026-03-25 9:28:476 hrs ago1774430927IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000097421.0375878
Claim Rewards247328052026-03-25 6:33:599 hrs ago1774420439IN
0xcbE5F4E8...55F19Bb36
0 ETH0.00000270.03490747
Claim Rewards247327872026-03-25 6:30:239 hrs ago1774420223IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000002940.03804254
Claim Rewards247326492026-03-25 6:02:4710 hrs ago1774418567IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000003010.04036802
Farm Deposit247326442026-03-25 6:01:4710 hrs ago1774418507IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000003790.0431397
Farm Deposit247326412026-03-25 6:01:1110 hrs ago1774418471IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000003750.04275394
Farm Deposit247326392026-03-25 6:00:4710 hrs ago1774418447IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000003820.0435437
Farm Deposit247326342026-03-25 5:59:4710 hrs ago1774418387IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000003640.04150522
Farm Deposit247326322026-03-25 5:59:2310 hrs ago1774418363IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000003850.03671495
Claim Rewards247326252026-03-25 5:57:5910 hrs ago1774418279IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000002930.03799368
Claim Rewards247323672026-03-25 5:06:2311 hrs ago1774415183IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000003010.03891392
Claim Rewards247311102026-03-25 0:54:1115 hrs ago1774400051IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000003560.0460211
Farm Deposit247306622026-03-24 23:24:2316 hrs ago1774394663IN
0xcbE5F4E8...55F19Bb36
0 ETH0.00000510.04454894
Exit Farm247304782026-03-24 22:47:2317 hrs ago1774392443IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000127611.04461953
Claim Rewards247304742026-03-24 22:46:3517 hrs ago1774392395IN
0xcbE5F4E8...55F19Bb36
0 ETH0.00007821.04553286
Farm Deposit247301342026-03-24 21:38:3518 hrs ago1774388315IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000092011.0467354
Claim Rewards247299462026-03-24 21:00:4719 hrs ago1774386047IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000006420.08306417
Exit Farm247291432026-03-24 18:19:2322 hrs ago1774376363IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000013230.12596516
Claim Rewards247291372026-03-24 18:18:1122 hrs ago1774376291IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000011870.12648421
Claim Rewards247290382026-03-24 17:58:1122 hrs ago1774375091IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000012980.16780613
Claim Rewards247290222026-03-24 17:54:5922 hrs ago1774374899IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000012240.1582802
Farm Deposit247280252026-03-24 14:34:5925 hrs ago1774362899IN
0xcbE5F4E8...55F19Bb36
0 ETH0.000131081.14459541
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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
// 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"
        );
    }
}

// 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;
    }
}

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

// 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

API
[{"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 Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.