Contract 0x3b902a8A1e04F1e6957F589804Ed2d8A9f9489c1 1

 
Txn Hash Method
Block
From
To
Value
0xf87fc6fbe7db65ce3880b4227188aa8f9345e98f37866e4f3724d2719157910a0x611837611056471722023-06-16 5:25:21250 days 16 hrs agoGYSR: Deployer IN  Create: ERC20CompetitiveRewardModuleInfo0 ETH0.0009550625830.000001053
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ERC20CompetitiveRewardModuleInfo

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 9 : 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 9 : 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 9 : 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 9 : ERC20CompetitiveRewardModuleInfo.sol
/*
ERC20CompetitiveRewardModuleInfo

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 "./IERC20CompetitiveRewardModuleV2.sol";
import "../GysrUtils.sol";

/**
 * @title ERC20 competitive reward module info library
 *
 * @notice this library provides read-only convenience functions to query
 * additional information about the ERC20CompetitiveRewardModule contract.
 */
library ERC20CompetitiveRewardModuleInfo {
    using GysrUtils for uint256;

    /**
     * @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, 0);
    }

    /**
     * @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
     * @param gysr number of GYSR tokens that would be applied
     * @return estimated reward
     * @return estimated time multiplier
     * @return estimated gysr multiplier
     */
    function preview(
        address module,
        bytes32 account,
        uint256 shares,
        uint256 gysr
    ) public view returns (uint256, uint256, uint256) {
        IERC20CompetitiveRewardModuleV2 m = IERC20CompetitiveRewardModuleV2(
            module
        );

        // get associated share seconds
        uint256 rawShareSeconds;
        uint256 bonusShareSeconds;
        (rawShareSeconds, bonusShareSeconds) = userShareSeconds(
            module,
            account,
            shares
        );
        if (rawShareSeconds == 0) {
            return (0, 0, 0);
        }

        uint256 timeBonus = (bonusShareSeconds * 1e18) / rawShareSeconds;

        // apply gysr bonus
        uint256 gysrBonus = gysr.gysrBonus(
            shares,
            m.totalStakingShares(),
            m.usage()
        );
        bonusShareSeconds = (gysrBonus * bonusShareSeconds) / 1e18;

        // compute rewards based on expected updates
        uint256 reward = (unlocked(module) * bonusShareSeconds) /
            (totalShareSeconds(module) + bonusShareSeconds - rawShareSeconds);

        return (reward, timeBonus, gysrBonus);
    }

    /**
     * @notice compute effective unlocked rewards
     * @param module address of reward module
     * @return estimated current unlocked rewards
     */
    function unlocked(address module) public view returns (uint256) {
        IERC20CompetitiveRewardModuleV2 m = IERC20CompetitiveRewardModuleV2(
            module
        );

        // compute expected updates to global totals
        uint256 deltaUnlocked;
        address tkn = m.tokens()[0];
        uint256 totalLockedShares = m.lockedShares(tkn);
        if (totalLockedShares != 0) {
            uint256 sharesToUnlock;
            for (uint256 i = 0; i < m.fundingCount(tkn); i++) {
                sharesToUnlock = sharesToUnlock + m.unlockable(tkn, i);
            }
            deltaUnlocked =
                (sharesToUnlock * m.totalLocked()) /
                totalLockedShares;
        }
        return m.totalUnlocked() + deltaUnlocked;
    }

    /**
     * @notice compute user share seconds for given number of shares
     * @param module module contract address
     * @param account user account
     * @param shares number of shares
     * @return raw share seconds
     * @return time bonus share seconds
     */
    function userShareSeconds(
        address module,
        bytes32 account,
        uint256 shares
    ) public view returns (uint256, uint256) {
        require(shares > 0, "crmi1");

        IERC20CompetitiveRewardModuleV2 m = IERC20CompetitiveRewardModuleV2(
            module
        );
        address user = address(uint160(uint256(account)));

        uint256 rawShareSeconds;
        uint256 timeBonusShareSeconds;

        // compute first-in-last-out, time bonus weighted, share seconds
        uint256 i = m.stakeCount(user);
        while (shares > 0) {
            require(i > 0, "crmi2");
            i -= 1;
            uint256 s;
            uint256 time;
            (s, time) = m.stakes(user, i);
            time = block.timestamp - time;

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

            rawShareSeconds += (s * time);
            timeBonusShareSeconds += ((s * time * m.timeBonus(time)) / 1e18);
            shares -= s;
        }
        return (rawShareSeconds, timeBonusShareSeconds);
    }

    /**
     * @notice compute total expected share seconds for a rewards module
     * @param module address for reward module
     * @return expected total shares seconds
     */
    function totalShareSeconds(address module) public view returns (uint256) {
        IERC20CompetitiveRewardModuleV2 m = IERC20CompetitiveRewardModuleV2(
            module
        );

        return
            m.totalStakingShareSeconds() +
            (block.timestamp - m.lastUpdated()) *
            m.totalStakingShares();
    }
}

File 5 of 9 : IERC20CompetitiveRewardModuleV2.sol
/*
IERC20CompetitiveRewardModuleV2

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

SPDX-License-Identifier: MIT
*/

pragma solidity 0.8.18;

/**
 * @title Competitive reward module interface
 *
 * @notice this declares the interface for the v2 competitive reward module
 * to provide backwards compatibility in the pool info system
 */
interface IERC20CompetitiveRewardModuleV2 {
    // -- 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);

    // -- IERC20CompetitiveRewardModuleV2 -------------------------------------

    function totalStakingShares() external view returns (uint256);

    function totalStakingShareSeconds() 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 totalLocked() 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);

    function timeBonus(uint256) external view returns (uint256);

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

File 6 of 9 : 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 7 of 9 : 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 8 of 9 : 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 9 of 9 : 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":"bytes32","name":"account","type":"bytes32"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"gysr","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":"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":"totalShareSeconds","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"},{"inputs":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes32","name":"account","type":"bytes32"},{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"userShareSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

61183761003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100875760003560e01c80636d46a1db116100655780636d46a1db146100fa578063d1846d0c1461011d578063e18a09e914610130578063e48603391461015e57600080fd5b806322d00fda1461008c5780634064b81f146100b257806366d98f7d146100da575b600080fd5b61009f61009a3660046111c7565b610181565b6040519081526020015b60405180910390f35b6100c56100c03660046111e4565b6102f9565b604080519283526020830191909152016100a9565b6100ed6100e8366004611219565b610642565b6040516100a991906112af565b61010d6101083660046111c7565b61069c565b6040516100a99493929190611343565b61009f61012b3660046111c7565b61089f565b61014361013e366004611399565b610c33565b604080519384526020840192909252908201526060016100a9565b61017161016c3660046111c7565b610dea565b6040516100a99493929190611429565b6000808290508073ffffffffffffffffffffffffffffffffffffffff166370c6a17e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f691906114e7565b8173ffffffffffffffffffffffffffffffffffffffff1663d0b06f5d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610241573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026591906114e7565b61026f904261152f565b6102799190611548565b8173ffffffffffffffffffffffffffffffffffffffff1663a5be655c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e891906114e7565b6102f2919061155f565b9392505050565b6000806000831161036b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f63726d693100000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040517f33060d9000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80861660048301528691869160009182918291908616906333060d9090602401602060405180830381865afa1580156103e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040791906114e7565b90505b8715610633576000811161047a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f63726d69320000000000000000000000000000000000000000000000000000006044820152606401610362565b61048560018261152f565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526024820183905291925060009182919088169063584b62a1906044016040805180830381865afa158015610500573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105249190611572565b9092509050610533814261152f565b90508982106105425789610544565b815b91506105508183611548565b61055a908661155f565b6040517f9e57e49100000000000000000000000000000000000000000000000000000000815260048101839052909550670de0b6b3a76400009073ffffffffffffffffffffffffffffffffffffffff891690639e57e49190602401602060405180830381865afa1580156105d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f691906114e7565b6106008385611548565b61060a9190611548565b6106149190611596565b61061e908561155f565b935061062a828b61152f565b9950505061040a565b50909890975095505050505050565b604080516001808252818301909252606091602080830190803683370190505090506106718686866000610c33565b9050508160008151811061068757610687611600565b60200260200101818152505095945050505050565b600060608060008085905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261071c9190810190611660565b60008151811061072e5761072e611600565b60200260200101519050808173ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107ac9190810190611712565b8273ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156107f7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261081f9190810190611712565b8373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088e91906117a6565b955095509550955050509193509193565b6000808290506000808273ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261091b9190810190611660565b60008151811061092d5761092d611600565b60209081029190910101516040517fe336ac4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015291925060009185169063e336ac4490602401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce91906114e7565b90508015610baf576000805b6040517f04003d5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528716906304003d5b90602401602060405180830381865afa158015610a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6a91906114e7565b811015610b26576040517f3f265ddb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260248201839052871690633f265ddb90604401602060405180830381865afa158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0891906114e7565b610b12908361155f565b915080610b1e816117c9565b9150506109da565b50818573ffffffffffffffffffffffffffffffffffffffff1663568914126040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9791906114e7565b610ba19083611548565b610bab9190611596565b9350505b828473ffffffffffffffffffffffffffffffffffffffff1663a779d0806040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f91906114e7565b610c29919061155f565b9695505050505050565b60008080868180610c45838a8a6102f9565b90925090506000829003610c66576000806000955095509550505050610de0565b600082610c7b83670de0b6b3a7640000611548565b610c859190611596565b90506000610d748a8673ffffffffffffffffffffffffffffffffffffffff166370c6a17e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfc91906114e7565b8773ffffffffffffffffffffffffffffffffffffffff16636d811e716040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b91906114e7565b8c929190610f45565b9050670de0b6b3a7640000610d898483611548565b610d939190611596565b925060008484610da28f610181565b610dac919061155f565b610db6919061152f565b84610dc08f61089f565b610dca9190611548565b610dd49190611596565b98509196509450505050505b9450945094915050565b604080516001808252818301909252606091829182918291906020808301908036833701905050604080516001808252818301909252919550816020015b6060815260200190600190039081610e28575050604080516001808252818301909252919450602082015b6060815260200190600190039081610e5357505060408051600180825281830190925291935060208083019080368337019050509050610e928561069c565b87600081518110610ea557610ea5611600565b6020026020010187600081518110610ebf57610ebf611600565b6020026020010187600081518110610ed957610ed9611600565b6020026020010187600081518110610ef357610ef3611600565b602002602001018460ff1660ff168152508490528490528473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250505050509193509193565b600083600003610f5757506000611057565b82600003610f6757506000611057565b84600003610f7e5750670de0b6b3a7640000611057565b6000670de0b6b3a7640000610f9a85662386f26fc10000611548565b610fa49190611596565b905080851115610fc65784610fb98288611548565b610fc39190611596565b95505b6000610fd984662386f26fc1000061155f565b610fec8868010000000000000000611548565b610ff69190611596565b611009906801000000000000000061155f565b90506801000000000000000061102182600f0b61105f565b61103690600f0b670de0b6b3a7640000611548565b6110409190611596565b61105290670de0b6b3a764000061155f565b925050505b949350505050565b60008082600f0b1361107057600080fd5b608061107b836110a0565b61109890600f0b6f4d104d427de7fce20a6e420e02236748611548565b901c92915050565b60008082600f0b136110b157600080fd5b6000600f83900b6801000000000000000081126110d0576040918201911d5b64010000000081126110e4576020918201911d5b6201000081126110f6576010918201911d5b6101008112611107576008918201911d5b60108112611117576004918201911d5b60048112611127576002918201911d5b60028112611136576001820191505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0820160401b600f85900b607f8490031b6780000000000000005b60008113156111975790800260ff81901c8281029390930192607f011c9060011d611171565b509095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b50565b6000602082840312156111d957600080fd5b81356102f2816111a2565b6000806000606084860312156111f957600080fd5b8335611204816111a2565b95602085013595506040909401359392505050565b60008060008060006080868803121561123157600080fd5b853561123c816111a2565b94506020860135935060408601359250606086013567ffffffffffffffff8082111561126757600080fd5b818801915088601f83011261127b57600080fd5b81358181111561128a57600080fd5b89602082850101111561129c57600080fd5b9699959850939650602001949392505050565b6020808252825182820181905260009190848201906040850190845b818110156112e7578351835292840192918401916001016112cb565b50909695505050505050565b60005b8381101561130e5781810151838201526020016112f6565b50506000910152565b6000815180845261132f8160208601602086016112f3565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006113726080830186611317565b82810360408401526113848186611317565b91505060ff8316606083015295945050505050565b600080600080608085870312156113af57600080fd5b84356113ba816111a2565b966020860135965060408601359560600135945092505050565b600081518084526020808501808196508360051b8101915082860160005b8581101561141c57828403895261140a848351611317565b988501989350908401906001016113f2565b5091979650505050505050565b6080808252855190820181905260009060209060a0840190828901845b8281101561147857815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101611446565b5050508381038285015261148c81886113d4565b905083810360408501526114a081876113d4565b8481036060860152855180825283870192509083019060005b818110156114d857835160ff16835292840192918401916001016114b9565b50909998505050505050505050565b6000602082840312156114f957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561154257611542611500565b92915050565b808202811582820484141761154257611542611500565b8082018082111561154257611542611500565b6000806040838503121561158557600080fd5b505080516020909101519092909150565b6000826115cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611658576116586115d1565b604052919050565b6000602080838503121561167357600080fd5b825167ffffffffffffffff8082111561168b57600080fd5b818501915085601f83011261169f57600080fd5b8151818111156116b1576116b16115d1565b8060051b91506116c284830161162f565b81815291830184019184810190888411156116dc57600080fd5b938501935b8385101561170657845192506116f6836111a2565b82825293850193908501906116e1565b98975050505050505050565b60006020828403121561172457600080fd5b815167ffffffffffffffff8082111561173c57600080fd5b818401915084601f83011261175057600080fd5b815181811115611762576117626115d1565b6117756020601f19601f8401160161162f565b915080825285602082850101111561178c57600080fd5b61179d8160208401602086016112f3565b50949350505050565b6000602082840312156117b857600080fd5b815160ff811681146102f257600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036117fa576117fa611500565b506001019056fea264697066735822122094438a7a41d3d14215b02065553bb1dd7b8db9d64df6643a131176e627dcb20764736f6c63430008120033

Deployed Bytecode

0x733b902a8a1e04f1e6957f589804ed2d8a9f9489c130146080604052600436106100875760003560e01c80636d46a1db116100655780636d46a1db146100fa578063d1846d0c1461011d578063e18a09e914610130578063e48603391461015e57600080fd5b806322d00fda1461008c5780634064b81f146100b257806366d98f7d146100da575b600080fd5b61009f61009a3660046111c7565b610181565b6040519081526020015b60405180910390f35b6100c56100c03660046111e4565b6102f9565b604080519283526020830191909152016100a9565b6100ed6100e8366004611219565b610642565b6040516100a991906112af565b61010d6101083660046111c7565b61069c565b6040516100a99493929190611343565b61009f61012b3660046111c7565b61089f565b61014361013e366004611399565b610c33565b604080519384526020840192909252908201526060016100a9565b61017161016c3660046111c7565b610dea565b6040516100a99493929190611429565b6000808290508073ffffffffffffffffffffffffffffffffffffffff166370c6a17e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f691906114e7565b8173ffffffffffffffffffffffffffffffffffffffff1663d0b06f5d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610241573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026591906114e7565b61026f904261152f565b6102799190611548565b8173ffffffffffffffffffffffffffffffffffffffff1663a5be655c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e891906114e7565b6102f2919061155f565b9392505050565b6000806000831161036b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f63726d693100000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040517f33060d9000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80861660048301528691869160009182918291908616906333060d9090602401602060405180830381865afa1580156103e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040791906114e7565b90505b8715610633576000811161047a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600560248201527f63726d69320000000000000000000000000000000000000000000000000000006044820152606401610362565b61048560018261152f565b6040517f584b62a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526024820183905291925060009182919088169063584b62a1906044016040805180830381865afa158015610500573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105249190611572565b9092509050610533814261152f565b90508982106105425789610544565b815b91506105508183611548565b61055a908661155f565b6040517f9e57e49100000000000000000000000000000000000000000000000000000000815260048101839052909550670de0b6b3a76400009073ffffffffffffffffffffffffffffffffffffffff891690639e57e49190602401602060405180830381865afa1580156105d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f691906114e7565b6106008385611548565b61060a9190611548565b6106149190611596565b61061e908561155f565b935061062a828b61152f565b9950505061040a565b50909890975095505050505050565b604080516001808252818301909252606091602080830190803683370190505090506106718686866000610c33565b9050508160008151811061068757610687611600565b60200260200101818152505095945050505050565b600060608060008085905060008173ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261071c9190810190611660565b60008151811061072e5761072e611600565b60200260200101519050808173ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015610784573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107ac9190810190611712565b8273ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156107f7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261081f9190810190611712565b8373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088e91906117a6565b955095509550955050509193509193565b6000808290506000808273ffffffffffffffffffffffffffffffffffffffff16639d63848a6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156108f3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261091b9190810190611660565b60008151811061092d5761092d611600565b60209081029190910101516040517fe336ac4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015291925060009185169063e336ac4490602401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce91906114e7565b90508015610baf576000805b6040517f04003d5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528716906304003d5b90602401602060405180830381865afa158015610a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6a91906114e7565b811015610b26576040517f3f265ddb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260248201839052871690633f265ddb90604401602060405180830381865afa158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0891906114e7565b610b12908361155f565b915080610b1e816117c9565b9150506109da565b50818573ffffffffffffffffffffffffffffffffffffffff1663568914126040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9791906114e7565b610ba19083611548565b610bab9190611596565b9350505b828473ffffffffffffffffffffffffffffffffffffffff1663a779d0806040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f91906114e7565b610c29919061155f565b9695505050505050565b60008080868180610c45838a8a6102f9565b90925090506000829003610c66576000806000955095509550505050610de0565b600082610c7b83670de0b6b3a7640000611548565b610c859190611596565b90506000610d748a8673ffffffffffffffffffffffffffffffffffffffff166370c6a17e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfc91906114e7565b8773ffffffffffffffffffffffffffffffffffffffff16636d811e716040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b91906114e7565b8c929190610f45565b9050670de0b6b3a7640000610d898483611548565b610d939190611596565b925060008484610da28f610181565b610dac919061155f565b610db6919061152f565b84610dc08f61089f565b610dca9190611548565b610dd49190611596565b98509196509450505050505b9450945094915050565b604080516001808252818301909252606091829182918291906020808301908036833701905050604080516001808252818301909252919550816020015b6060815260200190600190039081610e28575050604080516001808252818301909252919450602082015b6060815260200190600190039081610e5357505060408051600180825281830190925291935060208083019080368337019050509050610e928561069c565b87600081518110610ea557610ea5611600565b6020026020010187600081518110610ebf57610ebf611600565b6020026020010187600081518110610ed957610ed9611600565b6020026020010187600081518110610ef357610ef3611600565b602002602001018460ff1660ff168152508490528490528473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250505050509193509193565b600083600003610f5757506000611057565b82600003610f6757506000611057565b84600003610f7e5750670de0b6b3a7640000611057565b6000670de0b6b3a7640000610f9a85662386f26fc10000611548565b610fa49190611596565b905080851115610fc65784610fb98288611548565b610fc39190611596565b95505b6000610fd984662386f26fc1000061155f565b610fec8868010000000000000000611548565b610ff69190611596565b611009906801000000000000000061155f565b90506801000000000000000061102182600f0b61105f565b61103690600f0b670de0b6b3a7640000611548565b6110409190611596565b61105290670de0b6b3a764000061155f565b925050505b949350505050565b60008082600f0b1361107057600080fd5b608061107b836110a0565b61109890600f0b6f4d104d427de7fce20a6e420e02236748611548565b901c92915050565b60008082600f0b136110b157600080fd5b6000600f83900b6801000000000000000081126110d0576040918201911d5b64010000000081126110e4576020918201911d5b6201000081126110f6576010918201911d5b6101008112611107576008918201911d5b60108112611117576004918201911d5b60048112611127576002918201911d5b60028112611136576001820191505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0820160401b600f85900b607f8490031b6780000000000000005b60008113156111975790800260ff81901c8281029390930192607f011c9060011d611171565b509095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146111c457600080fd5b50565b6000602082840312156111d957600080fd5b81356102f2816111a2565b6000806000606084860312156111f957600080fd5b8335611204816111a2565b95602085013595506040909401359392505050565b60008060008060006080868803121561123157600080fd5b853561123c816111a2565b94506020860135935060408601359250606086013567ffffffffffffffff8082111561126757600080fd5b818801915088601f83011261127b57600080fd5b81358181111561128a57600080fd5b89602082850101111561129c57600080fd5b9699959850939650602001949392505050565b6020808252825182820181905260009190848201906040850190845b818110156112e7578351835292840192918401916001016112cb565b50909695505050505050565b60005b8381101561130e5781810151838201526020016112f6565b50506000910152565b6000815180845261132f8160208601602086016112f3565b601f01601f19169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff851681526080602082015260006113726080830186611317565b82810360408401526113848186611317565b91505060ff8316606083015295945050505050565b600080600080608085870312156113af57600080fd5b84356113ba816111a2565b966020860135965060408601359560600135945092505050565b600081518084526020808501808196508360051b8101915082860160005b8581101561141c57828403895261140a848351611317565b988501989350908401906001016113f2565b5091979650505050505050565b6080808252855190820181905260009060209060a0840190828901845b8281101561147857815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101611446565b5050508381038285015261148c81886113d4565b905083810360408501526114a081876113d4565b8481036060860152855180825283870192509083019060005b818110156114d857835160ff16835292840192918401916001016114b9565b50909998505050505050505050565b6000602082840312156114f957600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561154257611542611500565b92915050565b808202811582820484141761154257611542611500565b8082018082111561154257611542611500565b6000806040838503121561158557600080fd5b505080516020909101519092909150565b6000826115cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611658576116586115d1565b604052919050565b6000602080838503121561167357600080fd5b825167ffffffffffffffff8082111561168b57600080fd5b818501915085601f83011261169f57600080fd5b8151818111156116b1576116b16115d1565b8060051b91506116c284830161162f565b81815291830184019184810190888411156116dc57600080fd5b938501935b8385101561170657845192506116f6836111a2565b82825293850193908501906116e1565b98975050505050505050565b60006020828403121561172457600080fd5b815167ffffffffffffffff8082111561173c57600080fd5b818401915084601f83011261175057600080fd5b815181811115611762576117626115d1565b6117756020601f19601f8401160161162f565b915080825285602082850101111561178c57600080fd5b61179d8160208401602086016112f3565b50949350505050565b6000602082840312156117b857600080fd5b815160ff811681146102f257600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036117fa576117fa611500565b506001019056fea264697066735822122094438a7a41d3d14215b02065553bb1dd7b8db9d64df6643a131176e627dcb20764736f6c63430008120033

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.