Contract 0x983D4db882BdfB1B1624ed09670535907A27E112 1

 
Txn Hash Method
Block
From
To
Value
0xf52520388384fc3a610bf962749708c186ae07aa8194d768560abfd2c63428780x611e15611056472062023-06-16 5:26:29250 days 17 hrs agoGYSR: Deployer IN  Create: ERC20FriendlyRewardModuleInfo0 ETH0.0012306438510.000001054
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ERC20FriendlyRewardModuleInfo

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 10 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 2 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 3 of 10 : GysrUtils.sol
/*
GysrUtils

https://github.com/gysr-io/core

SPDX-License-Identifier: MIT
*/

pragma solidity 0.8.18;

import "./MathUtils.sol";

/**
 * @title GYSR utilities
 *
 * @notice this library implements utility methods for the GYSR multiplier
 * and spending mechanics
 */
library GysrUtils {
    using MathUtils for int128;

    // constants
    uint256 public constant GYSR_PROPORTION = 1e16; // 1%

    /**
     * @notice compute GYSR bonus as a function of usage ratio, stake amount,
     * and GYSR spent
     * @param gysr number of GYSR token applied to bonus
     * @param amount number of tokens or shares to unstake
     * @param total number of tokens or shares in overall pool
     * @param ratio usage ratio from 0 to 1
     * @return multiplier value
     */
    function gysrBonus(
        uint256 gysr,
        uint256 amount,
        uint256 total,
        uint256 ratio
    ) internal pure returns (uint256) {
        if (amount == 0) {
            return 0;
        }
        if (total == 0) {
            return 0;
        }
        if (gysr == 0) {
            return 1e18;
        }

        // scale GYSR amount with respect to proportion
        uint256 portion = (GYSR_PROPORTION * total) / 1e18;
        if (amount > portion) {
            gysr = (gysr * portion) / amount;
        }

        // 1 + gysr / (0.01 + ratio)
        uint256 x = 2 ** 64 + (2 ** 64 * gysr) / (1e16 + ratio);

        return
            1e18 +
            (uint256(int256(int128(uint128(x)).logbase10())) * 1e18) /
            2 ** 64;
    }
}

File 4 of 10 : ERC20FriendlyRewardModuleInfo.sol
/*
ERC20FriendlyRewardModuleInfo

https://github.com/gysr-io/core

SPDX-License-Identifier: MIT
*/

pragma solidity 0.8.18;

import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";

import "../interfaces/IRewardModule.sol";
import "./IERC20FriendlyRewardModuleV2.sol";
import "../GysrUtils.sol";
import "./TokenUtilsInfo.sol";

/**
 * @title ERC20 friendly reward module info library
 *
 * @notice this library provides read-only convenience functions to query
 * additional information about the ERC20FriendlyRewardModule contract.
 */
library ERC20FriendlyRewardModuleInfo {
    using GysrUtils for uint256;
    using TokenUtilsInfo for IERC20;

    /**
     * @notice get all token metadata
     * @param module address of reward module
     * @return addresses_
     * @return names_
     * @return symbols_
     * @return decimals_
     */
    function tokens(
        address module
    )
        external
        view
        returns (
            address[] memory addresses_,
            string[] memory names_,
            string[] memory symbols_,
            uint8[] memory decimals_
        )
    {
        addresses_ = new address[](1);
        names_ = new string[](1);
        symbols_ = new string[](1);
        decimals_ = new uint8[](1);
        (addresses_[0], names_[0], symbols_[0], decimals_[0]) = token(module);
    }

    /**
     * @notice convenience function to get token metadata in a single call
     * @param module address of reward module
     * @return address
     * @return name
     * @return symbol
     * @return decimals
     */
    function token(
        address module
    ) public view returns (address, string memory, string memory, uint8) {
        IRewardModule m = IRewardModule(module);
        IERC20Metadata tkn = IERC20Metadata(m.tokens()[0]);
        return (address(tkn), tkn.name(), tkn.symbol(), tkn.decimals());
    }

    /**
     * @notice generic function to get pending reward balances
     * @param module address of reward module
     * @param account bytes32 account of interest for preview
     * @param shares number of shares that would be used
     * @return rewards_ estimated reward balances
     */
    function rewards(
        address module,
        bytes32 account,
        uint256 shares,
        bytes calldata
    ) public view returns (uint256[] memory rewards_) {
        rewards_ = new uint256[](1);
        (rewards_[0], , ) = preview(module, account, shares);
    }

    /**
     * @notice preview estimated rewards
     * @param module address of reward module
     * @param account bytes32 account of interest for preview
     * @param shares number of shares that would be unstaked
     * @return estimated reward
     * @return estimated time multiplier weighted by rewards
     * @return estimated gysr multiplier weighted by rewards
     */
    function preview(
        address module,
        bytes32 account,
        uint256 shares
    ) public view returns (uint256, uint256, uint256) {
        require(shares > 0, "frmi1");
        IERC20FriendlyRewardModuleV2 m = IERC20FriendlyRewardModuleV2(module);
        address user = address(uint160(uint256(account)));

        uint256 reward;
        uint256 rawSum;
        uint256 bonusSum;

        uint256 i = m.stakeCount(user);

        // redeem first-in-last-out
        while (shares > 0) {
            require(i > 0, "frmi2");
            i -= 1;

            (uint256 s, , , , ) = m.stakes(user, i);

            // only redeem partial stake if more shares left than needed to burn
            s = s <= shares ? s : shares;

            uint256 r;
            {
                r = rewardsPerStakedShare(module);
            }

            {
                (, , , uint256 tally, ) = m.stakes(user, i);
                r = ((r - tally) * s) / 1e18;
                rawSum += r;
            }

            {
                (, , uint256 bonus, , ) = m.stakes(user, i);
                r = (r * bonus) / 1e18;
                bonusSum += r;
            }

            {
                (, , , , uint256 time) = m.stakes(user, i);
                r = (r * m.timeVestingCoefficient(time)) / 1e18;
            }
            reward += r;
            shares -= s;
        }

        address tkn = m.tokens()[0];
        return (
            IERC20(tkn).getAmount(module, m.totalShares(tkn), reward),
            reward > 0 ? (reward * 1e18) / bonusSum : 0,
            reward > 0 ? (bonusSum * 1e18) / rawSum : 0
        );
    }

    /**
     * @notice compute reward shares to be unlocked on the next update
     * @param module address of reward module
     * @return estimated unlockable rewards
     */
    function unlockable(address module) public view returns (uint256) {
        IERC20FriendlyRewardModuleV2 m = IERC20FriendlyRewardModuleV2(module);
        address tkn = m.tokens()[0];
        if (m.lockedShares(tkn) == 0) {
            return 0;
        }
        uint256 sharesToUnlock = 0;
        for (uint256 i = 0; i < m.fundingCount(tkn); i++) {
            sharesToUnlock = sharesToUnlock + m.unlockable(tkn, i);
        }
        return sharesToUnlock;
    }

    /**
     * @notice compute effective unlocked rewards
     * @param module address of reward module
     * @return estimated current unlocked rewards
     */
    function unlocked(address module) public view returns (uint256) {
        IERC20FriendlyRewardModuleV2 m = IERC20FriendlyRewardModuleV2(module);
        IERC20 tkn = IERC20(m.tokens()[0]);
        uint256 totalShares = m.totalShares(address(tkn));
        if (totalShares == 0) {
            return 0;
        }
        uint256 shares = unlockable(module);
        uint256 amount = tkn.getAmount(module, totalShares, shares);
        return m.totalUnlocked() + amount;
    }

    /**
     * @notice compute effective rewards per staked share
     * @param module module contract address
     * @return estimated rewards per staked share
     */
    function rewardsPerStakedShare(
        address module
    ) public view returns (uint256) {
        IERC20FriendlyRewardModuleV2 m = IERC20FriendlyRewardModuleV2(module);
        if (m.totalStakingShares() == 0) {
            return m.rewardsPerStakedShare();
        }
        uint256 rewardsToUnlock = unlockable(module) + m.rewardDust();
        return
            m.rewardsPerStakedShare() +
            (rewardsToUnlock * 1e18) /
            m.totalStakingShares();
    }

    /**
     * @notice compute estimated GYSR bonus for stake
     * @param module module contract address
     * @param shares number of shares that would be staked
     * @param gysr number of GYSR tokens that would be applied to stake
     * @return estimated GYSR multiplier
     */
    function gysrBonus(
        address module,
        uint256 shares,
        uint256 gysr
    ) public view returns (uint256) {
        IERC20FriendlyRewardModuleV2 m = IERC20FriendlyRewardModuleV2(module);
        return
            gysr.gysrBonus(
                shares,
                m.totalRawStakingShares() + shares,
                m.usage()
            );
    }
}

File 5 of 10 : IERC20FriendlyRewardModuleV2.sol
/*
IERC20FriendlyRewardModuleV2

https://github.com/gysr-io/core

SPDX-License-Identifier: MIT
*/

pragma solidity 0.8.18;

/**
 * @title Friendly reward module interface
 *
 * @notice this declares the interface for the v2 friendly reward module
 * to provide backwards compatibility in the pool info system
 */
interface IERC20FriendlyRewardModuleV2 {
    // -- IRewardModule -------------------------------------------------------
    function tokens() external view returns (address[] memory);

    function balances() external view returns (uint256[] memory);

    function usage() external view returns (uint256);

    function factory() external view returns (address);

    // -- IERC20FriendlyRewardModuleV2 ----------------------------------------

    function totalStakingShares() external view returns (uint256);

    function totalRawStakingShares() external view returns (uint256);

    function rewardsPerStakedShare() external view returns (uint256);

    function rewardDust() external view returns (uint256);

    function totalShares(address) external view returns (uint256);

    function lockedShares(address) external view returns (uint256);

    function fundingCount(address) external view returns (uint256);

    function unlockable(address, uint256) external view returns (uint256);

    function totalUnlocked() external view returns (uint256);

    function stakeCount(address) external view returns (uint256);

    function stakes(
        address,
        uint256
    ) external view returns (uint256, uint256, uint256, uint256, uint256);

    function timeVestingCoefficient(uint256) external view returns (uint256);
}

File 6 of 10 : TokenUtilsInfo.sol
/*
TokenUtilsInfo

https://github.com/gysr-io/core

SPDX-License-Identifier: MIT
*/

pragma solidity 0.8.18;

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

/**
 * @title Token utilities info
 *
 * @notice this library implements utility methods for token handling,
 * dynamic balance accounting, and fee processing.
 *
 * this is a modified version to be used by info libraries.
 */
library TokenUtilsInfo {
    uint256 constant INITIAL_SHARES_PER_TOKEN = 1e6;
    uint256 constant FLOOR_SHARES_PER_TOKEN = 1e3;

    /**
     * @notice get token shares from amount
     * @param token erc20 token interface
     * @param module address of module
     * @param total current total shares
     * @param amount balance of tokens
     */
    function getShares(
        IERC20 token,
        address module,
        uint256 total,
        uint256 amount
    ) internal view returns (uint256) {
        if (total == 0) return 0;
        uint256 balance = token.balanceOf(module);
        if (total < balance * FLOOR_SHARES_PER_TOKEN)
            return amount * FLOOR_SHARES_PER_TOKEN;
        return (total * amount) / balance;
    }

    /**
     * @notice get token amount from shares
     * @param token erc20 token interface
     * @param module address of module
     * @param total current total shares
     * @param shares balance of shares
     */
    function getAmount(
        IERC20 token,
        address module,
        uint256 total,
        uint256 shares
    ) internal view returns (uint256) {
        if (total == 0) return 0;
        uint256 balance = token.balanceOf(module);
        if (total < balance * FLOOR_SHARES_PER_TOKEN)
            return shares / FLOOR_SHARES_PER_TOKEN;
        return (balance * shares) / total;
    }
}

File 7 of 10 : IEvents.sol
/*
IEvents

https://github.com/gysr-io/core

SPDX-License-Identifier: MIT
 */

pragma solidity 0.8.18;

/**
 * @title GYSR event system
 *
 * @notice common interface to define GYSR event system
 */
interface IEvents {
    // staking
    event Staked(
        bytes32 indexed account,
        address indexed user,
        address indexed token,
        uint256 amount,
        uint256 shares
    );
    event Unstaked(
        bytes32 indexed account,
        address indexed user,
        address indexed token,
        uint256 amount,
        uint256 shares
    );
    event Claimed(
        bytes32 indexed account,
        address indexed user,
        address indexed token,
        uint256 amount,
        uint256 shares
    );
    event Updated(bytes32 indexed account, address indexed user);

    // rewards
    event RewardsDistributed(
        address indexed user,
        address indexed token,
        uint256 amount,
        uint256 shares
    );
    event RewardsFunded(
        address indexed token,
        uint256 amount,
        uint256 shares,
        uint256 timestamp
    );
    event RewardsExpired(
        address indexed token,
        uint256 amount,
        uint256 shares,
        uint256 timestamp
    );
    event RewardsWithdrawn(
        address indexed token,
        uint256 amount,
        uint256 shares,
        uint256 timestamp
    );
    event RewardsUpdated(bytes32 indexed account);

    // gysr
    event GysrSpent(address indexed user, uint256 amount);
    event GysrVested(address indexed user, uint256 amount);
    event GysrWithdrawn(uint256 amount);
    event Fee(address indexed receiver, address indexed token, uint256 amount);
}

File 8 of 10 : IOwnerController.sol
/*
IOwnerController

https://github.com/gysr-io/core

SPDX-License-Identifier: MIT
*/

pragma solidity 0.8.18;

/**
 * @title Owner controller interface
 *
 * @notice this defines the interface for any contracts that use the
 * owner controller access pattern
 */
interface IOwnerController {
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() external view returns (address);

    /**
     * @dev Returns the address of the current controller.
     */
    function controller() external view returns (address);

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`). This can
     * include renouncing ownership by transferring to the zero address.
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) external;

    /**
     * @dev Transfers control of the contract to a new account (`newController`).
     * Can only be called by the owner.
     */
    function transferControl(address newController) external;
}

File 9 of 10 : IRewardModule.sol
/*
IRewardModule

https://github.com/gysr-io/core

SPDX-License-Identifier: MIT
*/

pragma solidity 0.8.18;

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

import "./IEvents.sol";
import "./IOwnerController.sol";

/**
 * @title Reward module interface
 *
 * @notice this contract defines the common interface that any reward module
 * must implement to be compatible with the modular Pool architecture.
 */
interface IRewardModule is IOwnerController, IEvents {
    /**
     * @return array of reward tokens
     */
    function tokens() external view returns (address[] memory);

    /**
     * @return array of reward token balances
     */
    function balances() external view returns (uint256[] memory);

    /**
     * @return GYSR usage ratio for reward module
     */
    function usage() external view returns (uint256);

    /**
     * @return address of module factory
     */
    function factory() external view returns (address);

    /**
     * @notice perform any necessary accounting for new stake
     * @param account bytes32 id of staking account
     * @param sender address of sender
     * @param shares number of new shares minted
     * @param data addtional data
     * @return amount of gysr spent
     * @return amount of gysr vested
     */
    function stake(
        bytes32 account,
        address sender,
        uint256 shares,
        bytes calldata data
    ) external returns (uint256, uint256);

    /**
     * @notice reward user and perform any necessary accounting for unstake
     * @param account bytes32 id of staking account
     * @param sender address of sender
     * @param receiver address of reward receiver
     * @param shares number of shares burned
     * @param data additional data
     * @return amount of gysr spent
     * @return amount of gysr vested
     */
    function unstake(
        bytes32 account,
        address sender,
        address receiver,
        uint256 shares,
        bytes calldata data
    ) external returns (uint256, uint256);

    /**
     * @notice reward user and perform and necessary accounting for existing stake
     * @param account bytes32 id of staking account
     * @param sender address of sender
     * @param receiver address of reward receiver
     * @param shares number of shares being claimed against
     * @param data additional data
     * @return amount of gysr spent
     * @return amount of gysr vested
     */
    function claim(
        bytes32 account,
        address sender,
        address receiver,
        uint256 shares,
        bytes calldata data
    ) external returns (uint256, uint256);

    /**
     * @notice method called by anyone to update accounting
     * @dev will only be called ad hoc and should not contain essential logic
     * @param account bytes32 id of staking account for update
     * @param sender address of sender
     * @param data additional data
     */
    function update(
        bytes32 account,
        address sender,
        bytes calldata data
    ) external;

    /**
     * @notice method called by owner to clean up and perform additional accounting
     * @dev will only be called ad hoc and should not contain any essential logic
     * @param data additional data
     */
    function clean(bytes calldata data) external;
}

File 10 of 10 : MathUtils.sol
/*
MathUtils

https://github.com/gysr-io/core

SPDX-License-Identifier: BSD-4-Clause
*/

pragma solidity 0.8.18;

/**
 * @title Math utilities
 *
 * @notice this library implements various logarithmic math utilies which support
 * other contracts and specifically the GYSR multiplier calculation
 *
 * @dev h/t https://github.com/abdk-consulting/abdk-libraries-solidity
 */
library MathUtils {
    /**
     * @notice calculate binary logarithm of x
     *
     * @param x signed 64.64-bit fixed point number, require x > 0
     * @return signed 64.64-bit fixed point number
     */
    function logbase2(int128 x) internal pure returns (int128) {
        unchecked {
            require(x > 0);

            int256 msb = 0;
            int256 xc = x;
            if (xc >= 0x10000000000000000) {
                xc >>= 64;
                msb += 64;
            }
            if (xc >= 0x100000000) {
                xc >>= 32;
                msb += 32;
            }
            if (xc >= 0x10000) {
                xc >>= 16;
                msb += 16;
            }
            if (xc >= 0x100) {
                xc >>= 8;
                msb += 8;
            }
            if (xc >= 0x10) {
                xc >>= 4;
                msb += 4;
            }
            if (xc >= 0x4) {
                xc >>= 2;
                msb += 2;
            }
            if (xc >= 0x2) msb += 1; // No need to shift xc anymore

            int256 result = (msb - 64) << 64;
            uint256 ux = uint256(int256(x)) << uint256(127 - msb);
            for (int256 bit = 0x8000000000000000; bit > 0; bit >>= 1) {
                ux *= ux;
                uint256 b = ux >> 255;
                ux >>= 127 + b;
                result += bit * int256(b);
            }

            return int128(result);
        }
    }

    /**
     * @notice calculate natural logarithm of x
     * @dev magic constant comes from ln(2) * 2^128 -> hex
     * @param x signed 64.64-bit fixed point number, require x > 0
     * @return signed 64.64-bit fixed point number
     */
    function ln(int128 x) internal pure returns (int128) {
        unchecked {
            require(x > 0);

            return
                int128(
                    int256(
                        (uint256(int256(logbase2(x))) *
                            0xB17217F7D1CF79ABC9E3B39803F2F6AF) >> 128
                    )
                );
        }
    }

    /**
     * @notice calculate logarithm base 10 of x
     * @dev magic constant comes from log10(2) * 2^128 -> hex
     * @param x signed 64.64-bit fixed point number, require x > 0
     * @return signed 64.64-bit fixed point number
     */
    function logbase10(int128 x) internal pure returns (int128) {
        require(x > 0);

        return
            int128(
                int256(
                    (uint256(int256(logbase2(x))) *
                        0x4d104d427de7fce20a6e420e02236748) >> 128
                )
            );
    }

    // wrapper functions to allow testing
    function testlogbase2(int128 x) public pure returns (int128) {
        return logbase2(x);
    }

    function testlogbase10(int128 x) public pure returns (int128) {
        return logbase10(x);
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"module","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"gysr","type":"uint256"}],"name":"gysrBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes32","name":"account","type":"bytes32"},{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"preview","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes32","name":"account","type":"bytes32"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"rewards","outputs":[{"internalType":"uint256[]","name":"rewards_","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"rewardsPerStakedShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"tokens","outputs":[{"internalType":"address[]","name":"addresses_","type":"address[]"},{"internalType":"string[]","name":"names_","type":"string[]"},{"internalType":"string[]","name":"symbols_","type":"string[]"},{"internalType":"uint8[]","name":"decimals_","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"unlockable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"unlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

611e1561003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100925760003560e01c8063979129c511610065578063979129c51461012e578063d1846d0c14610141578063e486033914610154578063e97f80eb1461017757600080fd5b8063325f733f146100975780635651a29c146100bd57806366d98f7d146100eb5780636d46a1db1461010b575b600080fd5b6100aa6100a53660046117cd565b61018a565b6040519081526020015b60405180910390f35b6100d06100cb3660046117ea565b61040e565b604080519384526020840192909252908201526060016100b4565b6100fe6100f936600461181f565b610b1e565b6040516100b491906118b5565b61011e6101193660046117cd565b610b76565b6040516100b49493929190611949565b6100aa61013c3660046117cd565b610d79565b6100aa61014f3660046117cd565b61100f565b6101676101623660046117cd565b61120a565b6040516100b494939291906119f4565b6100aa6101853660046117ea565b611365565b6000808290508073ffffffffffffffffffffffffffffffffffffffff166370c6a17e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ff9190611ab2565b60000361027c578073ffffffffffffffffffffffffffffffffffffffff1663a049820a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102759190611ab2565b9392505050565b60008173ffffffffffffffffffffffffffffffffffffffff16631054b6706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ed9190611ab2565b6102f685610d79565b6103009190611afa565b90508173ffffffffffffffffffffffffffffffffffffffff166370c6a17e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561034d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103719190611ab2565b61038382670de0b6b3a7640000611b13565b61038d9190611b2a565b8273ffffffffffffffffffffffffffffffffffffffff1663a049820a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fc9190611ab2565b6104069190611afa565b949350505050565b6000806000808411610481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f66726d693100000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040517f33060d9000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152879187916000918291829182918716906333060d9090602401602060405180830381865afa1580156104fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051e9190611ab2565b90505b89156109665760008111610591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f66726d69320000000000000000000000000000000000000000000000000000006044820152606401610478565b61059c600182611b65565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820183905291925060009188169063584b62a19060440160a060405180830381865afa158015610615573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106399190611b78565b5050505090508a81111561064d578a61064f565b805b9050600061065c8e61018a565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018690529192506000918a169063584b62a19060440160a060405180830381865afa1580156106d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f99190611b78565b509350505050670de0b6b3a76400008382846107159190611b65565b61071f9190611b13565b6107299190611b2a565b91506107358287611afa565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301526024820187905291975060009250908a169063584b62a19060440160a060405180830381865afa1580156107b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d49190611b78565b505092505050670de0b6b3a764000081836107ef9190611b13565b6107f99190611b2a565b91506108058286611afa565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301526024820187905291965060009250908a169063584b62a19060440160a060405180830381865afa158015610880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a49190611b78565b945050505050670de0b6b3a76400008973ffffffffffffffffffffffffffffffffffffffff1663cecc46c8836040518263ffffffff1660e01b81526004016108ee91815260200190565b602060405180830381865afa15801561090b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092f9190611ab2565b6109399084611b13565b6109439190611b2a565b915061095190508187611afa565b955061095d828d611b65565b9b505050610521565b60008673ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156109b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109db9190810190611c18565b6000815181106109ed576109ed611cca565b60200260200101519050610ab08d8873ffffffffffffffffffffffffffffffffffffffff1663bf6b874e846040518263ffffffff1660e01b8152600401610a50919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b602060405180830381865afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a919190611ab2565b73ffffffffffffffffffffffffffffffffffffffff841691908861146a565b60008611610abf576000610adc565b83610ad287670de0b6b3a7640000611b13565b610adc9190611b2a565b60008711610aeb576000610b08565b85610afe86670de0b6b3a7640000611b13565b610b089190611b2a565b9950995099505050505050505093509350939050565b60408051600180825281830190925260609160208083019080368337019050509050610b4b86868661040e565b90505081600081518110610b6157610b61611cca565b60200260200101818152505095945050505050565b600060608060008085905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610bce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf69190810190611c18565b600081518110610c0857610c08611cca565b60200260200101519050808173ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c5e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c869190810190611cf9565b8273ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cd1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cf99190810190611cf9565b8373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d689190611d84565b955095509550955050509193509193565b60008082905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610dcc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610df49190810190611c18565b600081518110610e0657610e06611cca565b60209081029190910101516040517fe336ac4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192509083169063e336ac4490602401602060405180830381865afa158015610e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea59190611ab2565b600003610eb6575060009392505050565b6000805b6040517f04003d5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528516906304003d5b90602401602060405180830381865afa158015610f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4a9190611ab2565b811015611006576040517f3f265ddb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201839052851690633f265ddb90604401602060405180830381865afa158015610fc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe89190611ab2565b610ff29083611afa565b915080610ffe81611da7565b915050610eba565b50949350505050565b60008082905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa158015611062573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108a9190810190611c18565b60008151811061109c5761109c611cca565b60209081029190910101516040517fbf6b874e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015291925060009184169063bf6b874e90602401602060405180830381865afa158015611119573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113d9190611ab2565b90508060000361115257506000949350505050565b600061115d86610d79565b9050600061118373ffffffffffffffffffffffffffffffffffffffff851688858561146a565b9050808573ffffffffffffffffffffffffffffffffffffffff1663a779d0806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f59190611ab2565b6111ff9190611afa565b979650505050505050565b604080516001808252818301909252606091829182918291906020808301908036833701905050604080516001808252818301909252919550816020015b6060815260200190600190039081611248575050604080516001808252818301909252919450602082015b6060815260200190600190039081611273575050604080516001808252818301909252919350602080830190803683370190505090506112b285610b76565b876000815181106112c5576112c5611cca565b60200260200101876000815181106112df576112df611cca565b60200260200101876000815181106112f9576112f9611cca565b602002602001018760008151811061131357611313611cca565b602002602001018460ff1660ff168152508490528490528473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250505050509193509193565b60008084905061146184858373ffffffffffffffffffffffffffffffffffffffff1663221826986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113df9190611ab2565b6113e99190611afa565b8373ffffffffffffffffffffffffffffffffffffffff16636d811e716040518163ffffffff1660e01b8152600401602060405180830381865afa158015611434573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114589190611ab2565b86929190611558565b95945050505050565b60008260000361147c57506000610406565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152600091908716906370a0823190602401602060405180830381865afa1580156114ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115109190611ab2565b905061151e6103e882611b13565b841015611539576115316103e884611b2a565b915050610406565b836115448483611b13565b61154e9190611b2a565b9695505050505050565b60008360000361156a57506000610406565b8260000361157a57506000610406565b846000036115915750670de0b6b3a7640000610406565b6000670de0b6b3a76400006115ad85662386f26fc10000611b13565b6115b79190611b2a565b9050808511156115d957846115cc8288611b13565b6115d69190611b2a565b95505b60006115ec84662386f26fc10000611afa565b6115ff8868010000000000000000611b13565b6116099190611b2a565b61161c9068010000000000000000611afa565b90506801000000000000000061163482600f0b611665565b61164990600f0b670de0b6b3a7640000611b13565b6116539190611b2a565b6111ff90670de0b6b3a7640000611afa565b60008082600f0b1361167657600080fd5b6080611681836116a6565b61169e90600f0b6f4d104d427de7fce20a6e420e02236748611b13565b901c92915050565b60008082600f0b136116b757600080fd5b6000600f83900b6801000000000000000081126116d6576040918201911d5b64010000000081126116ea576020918201911d5b6201000081126116fc576010918201911d5b610100811261170d576008918201911d5b6010811261171d576004918201911d5b6004811261172d576002918201911d5b6002811261173c576001820191505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0820160401b600f85900b607f8490031b6780000000000000005b600081131561179d5790800260ff81901c8281029390930192607f011c9060011d611777565b509095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146117ca57600080fd5b50565b6000602082840312156117df57600080fd5b8135610275816117a8565b6000806000606084860312156117ff57600080fd5b833561180a816117a8565b95602085013595506040909401359392505050565b60008060008060006080868803121561183757600080fd5b8535611842816117a8565b94506020860135935060408601359250606086013567ffffffffffffffff8082111561186d57600080fd5b818801915088601f83011261188157600080fd5b81358181111561189057600080fd5b8960208285010111156118a257600080fd5b9699959850939650602001949392505050565b6020808252825182820181905260009190848201906040850190845b818110156118ed578351835292840192918401916001016118d1565b50909695505050505050565b60005b838110156119145781810151838201526020016118fc565b50506000910152565b600081518084526119358160208601602086016118f9565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000611978608083018661191d565b828103604084015261198a818661191d565b91505060ff8316606083015295945050505050565b600081518084526020808501808196508360051b8101915082860160005b858110156119e75782840389526119d584835161191d565b988501989350908401906001016119bd565b5091979650505050505050565b6080808252855190820181905260009060209060a0840190828901845b82811015611a4357815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101611a11565b50505083810382850152611a57818861199f565b90508381036040850152611a6b818761199f565b8481036060860152855180825283870192509083019060005b81811015611aa357835160ff1683529284019291840191600101611a84565b50909998505050505050505050565b600060208284031215611ac457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b0d57611b0d611acb565b92915050565b8082028115828204841417611b0d57611b0d611acb565b600082611b60577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b0d57611b0d611acb565b600080600080600060a08688031215611b9057600080fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611c1057611c10611bb8565b604052919050565b60006020808385031215611c2b57600080fd5b825167ffffffffffffffff80821115611c4357600080fd5b818501915085601f830112611c5757600080fd5b815181811115611c6957611c69611bb8565b8060051b9150611c7a848301611be7565b8181529183018401918481019088841115611c9457600080fd5b938501935b83851015611cbe5784519250611cae836117a8565b8282529385019390850190611c99565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611d0b57600080fd5b815167ffffffffffffffff80821115611d2357600080fd5b818401915084601f830112611d3757600080fd5b815181811115611d4957611d49611bb8565b611d5c6020601f19601f84011601611be7565b9150808252856020828501011115611d7357600080fd5b6110068160208401602086016118f9565b600060208284031215611d9657600080fd5b815160ff8116811461027557600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611dd857611dd8611acb565b506001019056fea26469706673582212201a057d6a314487a020ce30b5c4c62020c60a3659afff2ff7e7b0dfd8a2a90ad564736f6c63430008120033

Deployed Bytecode

0x73983d4db882bdfb1b1624ed09670535907a27e11230146080604052600436106100925760003560e01c8063979129c511610065578063979129c51461012e578063d1846d0c14610141578063e486033914610154578063e97f80eb1461017757600080fd5b8063325f733f146100975780635651a29c146100bd57806366d98f7d146100eb5780636d46a1db1461010b575b600080fd5b6100aa6100a53660046117cd565b61018a565b6040519081526020015b60405180910390f35b6100d06100cb3660046117ea565b61040e565b604080519384526020840192909252908201526060016100b4565b6100fe6100f936600461181f565b610b1e565b6040516100b491906118b5565b61011e6101193660046117cd565b610b76565b6040516100b49493929190611949565b6100aa61013c3660046117cd565b610d79565b6100aa61014f3660046117cd565b61100f565b6101676101623660046117cd565b61120a565b6040516100b494939291906119f4565b6100aa6101853660046117ea565b611365565b6000808290508073ffffffffffffffffffffffffffffffffffffffff166370c6a17e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101ff9190611ab2565b60000361027c578073ffffffffffffffffffffffffffffffffffffffff1663a049820a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102759190611ab2565b9392505050565b60008173ffffffffffffffffffffffffffffffffffffffff16631054b6706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ed9190611ab2565b6102f685610d79565b6103009190611afa565b90508173ffffffffffffffffffffffffffffffffffffffff166370c6a17e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561034d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103719190611ab2565b61038382670de0b6b3a7640000611b13565b61038d9190611b2a565b8273ffffffffffffffffffffffffffffffffffffffff1663a049820a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fc9190611ab2565b6104069190611afa565b949350505050565b6000806000808411610481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f66726d693100000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040517f33060d9000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152879187916000918291829182918716906333060d9090602401602060405180830381865afa1580156104fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051e9190611ab2565b90505b89156109665760008111610591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f66726d69320000000000000000000000000000000000000000000000000000006044820152606401610478565b61059c600182611b65565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526024820183905291925060009188169063584b62a19060440160a060405180830381865afa158015610615573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106399190611b78565b5050505090508a81111561064d578a61064f565b805b9050600061065c8e61018a565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018690529192506000918a169063584b62a19060440160a060405180830381865afa1580156106d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f99190611b78565b509350505050670de0b6b3a76400008382846107159190611b65565b61071f9190611b13565b6107299190611b2a565b91506107358287611afa565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301526024820187905291975060009250908a169063584b62a19060440160a060405180830381865afa1580156107b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d49190611b78565b505092505050670de0b6b3a764000081836107ef9190611b13565b6107f99190611b2a565b91506108058286611afa565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301526024820187905291965060009250908a169063584b62a19060440160a060405180830381865afa158015610880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a49190611b78565b945050505050670de0b6b3a76400008973ffffffffffffffffffffffffffffffffffffffff1663cecc46c8836040518263ffffffff1660e01b81526004016108ee91815260200190565b602060405180830381865afa15801561090b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092f9190611ab2565b6109399084611b13565b6109439190611b2a565b915061095190508187611afa565b955061095d828d611b65565b9b505050610521565b60008673ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156109b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109db9190810190611c18565b6000815181106109ed576109ed611cca565b60200260200101519050610ab08d8873ffffffffffffffffffffffffffffffffffffffff1663bf6b874e846040518263ffffffff1660e01b8152600401610a50919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b602060405180830381865afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a919190611ab2565b73ffffffffffffffffffffffffffffffffffffffff841691908861146a565b60008611610abf576000610adc565b83610ad287670de0b6b3a7640000611b13565b610adc9190611b2a565b60008711610aeb576000610b08565b85610afe86670de0b6b3a7640000611b13565b610b089190611b2a565b9950995099505050505050505093509350939050565b60408051600180825281830190925260609160208083019080368337019050509050610b4b86868661040e565b90505081600081518110610b6157610b61611cca565b60200260200101818152505095945050505050565b600060608060008085905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610bce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bf69190810190611c18565b600081518110610c0857610c08611cca565b60200260200101519050808173ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c5e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c869190810190611cf9565b8273ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cd1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cf99190810190611cf9565b8373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d689190611d84565b955095509550955050509193509193565b60008082905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610dcc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610df49190810190611c18565b600081518110610e0657610e06611cca565b60209081029190910101516040517fe336ac4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192509083169063e336ac4490602401602060405180830381865afa158015610e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea59190611ab2565b600003610eb6575060009392505050565b6000805b6040517f04003d5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528516906304003d5b90602401602060405180830381865afa158015610f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4a9190611ab2565b811015611006576040517f3f265ddb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201839052851690633f265ddb90604401602060405180830381865afa158015610fc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe89190611ab2565b610ff29083611afa565b915080610ffe81611da7565b915050610eba565b50949350505050565b60008082905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa158015611062573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261108a9190810190611c18565b60008151811061109c5761109c611cca565b60209081029190910101516040517fbf6b874e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015291925060009184169063bf6b874e90602401602060405180830381865afa158015611119573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113d9190611ab2565b90508060000361115257506000949350505050565b600061115d86610d79565b9050600061118373ffffffffffffffffffffffffffffffffffffffff851688858561146a565b9050808573ffffffffffffffffffffffffffffffffffffffff1663a779d0806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f59190611ab2565b6111ff9190611afa565b979650505050505050565b604080516001808252818301909252606091829182918291906020808301908036833701905050604080516001808252818301909252919550816020015b6060815260200190600190039081611248575050604080516001808252818301909252919450602082015b6060815260200190600190039081611273575050604080516001808252818301909252919350602080830190803683370190505090506112b285610b76565b876000815181106112c5576112c5611cca565b60200260200101876000815181106112df576112df611cca565b60200260200101876000815181106112f9576112f9611cca565b602002602001018760008151811061131357611313611cca565b602002602001018460ff1660ff168152508490528490528473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250505050509193509193565b60008084905061146184858373ffffffffffffffffffffffffffffffffffffffff1663221826986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113df9190611ab2565b6113e99190611afa565b8373ffffffffffffffffffffffffffffffffffffffff16636d811e716040518163ffffffff1660e01b8152600401602060405180830381865afa158015611434573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114589190611ab2565b86929190611558565b95945050505050565b60008260000361147c57506000610406565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152600091908716906370a0823190602401602060405180830381865afa1580156114ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115109190611ab2565b905061151e6103e882611b13565b841015611539576115316103e884611b2a565b915050610406565b836115448483611b13565b61154e9190611b2a565b9695505050505050565b60008360000361156a57506000610406565b8260000361157a57506000610406565b846000036115915750670de0b6b3a7640000610406565b6000670de0b6b3a76400006115ad85662386f26fc10000611b13565b6115b79190611b2a565b9050808511156115d957846115cc8288611b13565b6115d69190611b2a565b95505b60006115ec84662386f26fc10000611afa565b6115ff8868010000000000000000611b13565b6116099190611b2a565b61161c9068010000000000000000611afa565b90506801000000000000000061163482600f0b611665565b61164990600f0b670de0b6b3a7640000611b13565b6116539190611b2a565b6111ff90670de0b6b3a7640000611afa565b60008082600f0b1361167657600080fd5b6080611681836116a6565b61169e90600f0b6f4d104d427de7fce20a6e420e02236748611b13565b901c92915050565b60008082600f0b136116b757600080fd5b6000600f83900b6801000000000000000081126116d6576040918201911d5b64010000000081126116ea576020918201911d5b6201000081126116fc576010918201911d5b610100811261170d576008918201911d5b6010811261171d576004918201911d5b6004811261172d576002918201911d5b6002811261173c576001820191505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0820160401b600f85900b607f8490031b6780000000000000005b600081131561179d5790800260ff81901c8281029390930192607f011c9060011d611777565b509095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146117ca57600080fd5b50565b6000602082840312156117df57600080fd5b8135610275816117a8565b6000806000606084860312156117ff57600080fd5b833561180a816117a8565b95602085013595506040909401359392505050565b60008060008060006080868803121561183757600080fd5b8535611842816117a8565b94506020860135935060408601359250606086013567ffffffffffffffff8082111561186d57600080fd5b818801915088601f83011261188157600080fd5b81358181111561189057600080fd5b8960208285010111156118a257600080fd5b9699959850939650602001949392505050565b6020808252825182820181905260009190848201906040850190845b818110156118ed578351835292840192918401916001016118d1565b50909695505050505050565b60005b838110156119145781810151838201526020016118fc565b50506000910152565b600081518084526119358160208601602086016118f9565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff85168152608060208201526000611978608083018661191d565b828103604084015261198a818661191d565b91505060ff8316606083015295945050505050565b600081518084526020808501808196508360051b8101915082860160005b858110156119e75782840389526119d584835161191d565b988501989350908401906001016119bd565b5091979650505050505050565b6080808252855190820181905260009060209060a0840190828901845b82811015611a4357815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101611a11565b50505083810382850152611a57818861199f565b90508381036040850152611a6b818761199f565b8481036060860152855180825283870192509083019060005b81811015611aa357835160ff1683529284019291840191600101611a84565b50909998505050505050505050565b600060208284031215611ac457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611b0d57611b0d611acb565b92915050565b8082028115828204841417611b0d57611b0d611acb565b600082611b60577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611b0d57611b0d611acb565b600080600080600060a08688031215611b9057600080fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611c1057611c10611bb8565b604052919050565b60006020808385031215611c2b57600080fd5b825167ffffffffffffffff80821115611c4357600080fd5b818501915085601f830112611c5757600080fd5b815181811115611c6957611c69611bb8565b8060051b9150611c7a848301611be7565b8181529183018401918481019088841115611c9457600080fd5b938501935b83851015611cbe5784519250611cae836117a8565b8282529385019390850190611c99565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611d0b57600080fd5b815167ffffffffffffffff80821115611d2357600080fd5b818401915084601f830112611d3757600080fd5b815181811115611d4957611d49611bb8565b611d5c6020601f19601f84011601611be7565b9150808252856020828501011115611d7357600080fd5b6110068160208401602086016118f9565b600060208284031215611d9657600080fd5b815160ff8116811461027557600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611dd857611dd8611acb565b506001019056fea26469706673582212201a057d6a314487a020ce30b5c4c62020c60a3659afff2ff7e7b0dfd8a2a90ad564736f6c63430008120033

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.