Contract 0x9613d0389dbE4f4F3E52b6C38E3980BCF498A782 1

 
Txn Hash Method
Block
From
To
Value
0x505f9324d3262d5240f8435cff9b3467bd42a5837a2f57cecf52f6c91523108d0x608060401056450192023-06-16 4:13:35250 days 18 hrs agoGYSR: Deployer IN  Create: AssignmentStakingModuleFactory0 ETH0.0008032278940.000001072
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AssignmentStakingModuleFactory

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 8 : 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 2 of 8 : AssignmentStakingModule.sol
/*
ERC20StakingModule

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

SPDX-License-Identifier: MIT
*/

pragma solidity 0.8.18;

import "./interfaces/IStakingModule.sol";
import "./OwnerController.sol";

/**
 * @title Assignment staking module
 *
 * @notice this staking module allows an administrator to set a fixed rate of
 * earnings for a specific user.
 */
contract AssignmentStakingModule is IStakingModule, OwnerController {
    // constant
    uint256 public constant SHARES_COEFF = 1e6;

    // members
    address private immutable _factory;

    uint256 public totalRate;
    mapping(address => uint256) public rates;

    /**
     * @param factory_ address of module factory
     */
    constructor(address factory_) {
        _factory = factory_;
    }

    /**
     * @inheritdoc IStakingModule
     */
    function tokens()
        external
        pure
        override
        returns (address[] memory tokens_)
    {
        tokens_ = new address[](1);
        tokens_[0] = address(0x0);
    }

    /**
     * @inheritdoc IStakingModule
     */
    function balances(
        address user
    ) external view override returns (uint256[] memory balances_) {
        balances_ = new uint256[](1);
        balances_[0] = rates[user];
    }

    /**
     * @inheritdoc IStakingModule
     */
    function factory() external view override returns (address) {
        return _factory;
    }

    /**
     * @inheritdoc IStakingModule
     */
    function totals()
        external
        view
        override
        returns (uint256[] memory totals_)
    {
        totals_ = new uint256[](1);
        totals_[0] = totalRate;
    }

    /**
     * @inheritdoc IStakingModule
     */
    function stake(
        address sender,
        uint256 amount,
        bytes calldata data
    ) external override onlyOwner returns (bytes32, uint256) {
        // validate
        require(amount > 0, "asm1");
        require(sender == controller(), "asm2");
        require(data.length == 32, "asm3");

        address assignee;
        assembly {
            assignee := calldataload(132)
        }

        // increase rate
        rates[assignee] += amount;
        totalRate += amount;

        // emit
        bytes32 account = bytes32(uint256(uint160(assignee)));
        uint256 shares = amount * SHARES_COEFF;
        emit Staked(account, sender, address(0x0), amount, shares);

        return (account, shares);
    }

    /**
     * @inheritdoc IStakingModule
     */
    function unstake(
        address sender,
        uint256 amount,
        bytes calldata data
    ) external override onlyOwner returns (bytes32, address, uint256) {
        // validate
        require(amount > 0, "asm4");
        require(sender == controller(), "asm5");
        require(data.length == 32, "asm6");

        address assignee;
        assembly {
            assignee := calldataload(132)
        }
        uint256 r = rates[assignee];
        require(amount <= r, "asm7");

        // decrease rate
        rates[assignee] = r - amount;
        totalRate -= amount;

        // emit
        bytes32 account = bytes32(uint256(uint160(assignee)));
        uint256 shares = amount * SHARES_COEFF;
        emit Unstaked(account, sender, address(0x0), amount, shares);

        return (account, assignee, shares);
    }

    /**
     * @inheritdoc IStakingModule
     */
    function claim(
        address sender,
        uint256 amount,
        bytes calldata
    ) external override onlyOwner returns (bytes32, address, uint256) {
        require(amount > 0, "asm8");
        require(amount <= rates[sender], "asm9");
        bytes32 account = bytes32(uint256(uint160(sender)));
        uint256 shares = amount * SHARES_COEFF;
        emit Claimed(account, sender, address(0x0), amount, shares);
        return (account, sender, shares);
    }

    /**
     * @inheritdoc IStakingModule
     */
    function update(
        address sender,
        bytes calldata
    ) external pure override returns (bytes32) {
        return (bytes32(uint256(uint160(sender))));
    }

    /**
     * @inheritdoc IStakingModule
     */
    function clean(bytes calldata) external override {}
}

File 3 of 8 : AssignmentStakingModuleFactory.sol
/*
AssignmentStakingModuleFactory

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

SPDX-License-Identifier: MIT
*/

pragma solidity 0.8.18;

import "./interfaces/IModuleFactory.sol";
import "./AssignmentStakingModule.sol";

/**
 * @title Assignment staking module factory
 *
 * @notice this factory contract handles deployment for the
 * AssignmentStakingModule contract
 *
 * @dev it is called by the parent PoolFactory and is responsible
 * for parsing constructor arguments before creating a new contract
 */
contract AssignmentStakingModuleFactory is IModuleFactory {
    /**
     * @inheritdoc IModuleFactory
     */
    function createModule(address, bytes calldata)
        external
        override
        returns (address)
    {
        // create module
        AssignmentStakingModule module =
            new AssignmentStakingModule(address(this));
        module.transferOwnership(msg.sender);

        // output
        emit ModuleCreated(msg.sender, address(module));
        return address(module);
    }
}

File 4 of 8 : 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 5 of 8 : IModuleFactory.sol
/*
IModuleFactory

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

SPDX-License-Identifier: MIT
*/

pragma solidity 0.8.18;

/**
 * @title Module factory interface
 *
 * @notice this defines the common module factory interface used by the
 * main factory to create the staking and reward modules for a new Pool.
 */
interface IModuleFactory {
    // events
    event ModuleCreated(address indexed user, address module);

    /**
     * @notice create a new Pool module
     * @param config address for configuration contract
     * @param data binary encoded construction parameters
     * @return address of newly created module
     */
    function createModule(address config, bytes calldata data)
        external
        returns (address);
}

File 6 of 8 : 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 7 of 8 : IStakingModule.sol
/*
IStakingModule

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 Staking module interface
 *
 * @notice this contract defines the common interface that any staking module
 * must implement to be compatible with the modular Pool architecture.
 */
interface IStakingModule is IOwnerController, IEvents {
    /**
     * @return array of staking tokens
     */
    function tokens() external view returns (address[] memory);

    /**
     * @notice get balance of user
     * @param user address of user
     * @return balances of each staking token
     */
    function balances(address user) external view returns (uint256[] memory);

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

    /**
     * @notice get total staked amount
     * @return totals for each staking token
     */
    function totals() external view returns (uint256[] memory);

    /**
     * @notice stake an amount of tokens for user
     * @param sender address of sender
     * @param amount number of tokens to stake
     * @param data additional data
     * @return bytes32 id of staking account
     * @return number of shares minted for stake
     */
    function stake(
        address sender,
        uint256 amount,
        bytes calldata data
    ) external returns (bytes32, uint256);

    /**
     * @notice unstake an amount of tokens for user
     * @param sender address of sender
     * @param amount number of tokens to unstake
     * @param data additional data
     * @return bytes32 id of staking account
     * @return address of reward receiver
     * @return number of shares burned for unstake
     */
    function unstake(
        address sender,
        uint256 amount,
        bytes calldata data
    ) external returns (bytes32, address, uint256);

    /**
     * @notice quote the share value for an amount of tokens without unstaking
     * @param sender address of sender
     * @param amount number of tokens to claim with
     * @param data additional data
     * @return bytes32 id of staking account
     * @return address of reward receiver
     * @return number of shares that the claim amount is worth
     */
    function claim(
        address sender,
        uint256 amount,
        bytes calldata data
    ) external returns (bytes32, address, uint256);

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

    /**
     * @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 8 of 8 : OwnerController.sol
/*
OwnerController

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

SPDX-License-Identifier: MIT
*/

pragma solidity 0.8.18;

import "./interfaces/IOwnerController.sol";

/**
 * @title Owner controller
 *
 * @notice this base contract implements an owner-controller access model.
 *
 * @dev the contract is an adapted version of the OpenZeppelin Ownable contract.
 * It allows the owner to designate an additional account as the controller to
 * perform restricted operations.
 *
 * Other changes include supporting role verification with a require method
 * in addition to the modifier option, and removing some unneeded functionality.
 *
 * Original contract here:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol
 */
contract OwnerController is IOwnerController {
    address private _owner;
    address private _controller;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    event ControlTransferred(
        address indexed previousController,
        address indexed newController
    );

    constructor() {
        _owner = msg.sender;
        _controller = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
        emit ControlTransferred(address(0), _owner);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view override returns (address) {
        return _owner;
    }

    /**
     * @dev Returns the address of the current controller.
     */
    function controller() public view override returns (address) {
        return _controller;
    }

    /**
     * @dev Modifier that throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == msg.sender, "oc1");
        _;
    }

    /**
     * @dev Modifier that throws if called by any account other than the controller.
     */
    modifier onlyController() {
        require(_controller == msg.sender, "oc2");
        _;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    function requireOwner() internal view {
        require(_owner == msg.sender, "oc1");
    }

    /**
     * @dev Throws if called by any account other than the controller.
     */
    function requireController() internal view {
        require(_controller == msg.sender, "oc2");
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual override {
        requireOwner();
        require(newOwner != address(0), "oc3");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    /**
     * @dev Transfers control of the contract to a new account (`newController`).
     * Can only be called by the owner.
     */
    function transferControl(address newController) public virtual override {
        requireOwner();
        require(newController != address(0), "oc4");
        emit ControlTransferred(_controller, newController);
        _controller = newController;
    }
}

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

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"module","type":"address"}],"name":"ModuleCreated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"createModule","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506113c8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c806320868d1814610030575b600080fd5b61004361003e366004610198565b61006c565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000803060405161007c9061018b565b73ffffffffffffffffffffffffffffffffffffffff9091168152602001604051809103906000f0801580156100b5573d6000803e3d6000fd5b506040517ff2fde38b00000000000000000000000000000000000000000000000000000000815233600482015290915073ffffffffffffffffffffffffffffffffffffffff82169063f2fde38b90602401600060405180830381600087803b15801561012057600080fd5b505af1158015610134573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff841681523392507ff708942ec477396a151a5285651961dcab8e8a82ea4f5b31a5236f92f6c92710915060200160405180910390a2949350505050565b61115c8061023783390190565b6000806000604084860312156101ad57600080fd5b833573ffffffffffffffffffffffffffffffffffffffff811681146101d157600080fd5b9250602084013567ffffffffffffffff808211156101ee57600080fd5b818601915086601f83011261020257600080fd5b81358181111561021157600080fd5b87602082850101111561022357600080fd5b602083019450809350505050925092509256fe60a060405234801561001057600080fd5b5060405161115c38038061115c83398101604081905261002f916100c5565b60008054336001600160a01b0319918216811783556001805490921681179091556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600080546040516001600160a01b0390911691907fa06677f7b64342b4bcbde423684dbdb5356acfe41ad0285b6ecbe6dc4bf427f2908290a36001600160a01b03166080526100f5565b6000602082840312156100d757600080fd5b81516001600160a01b03811681146100ee57600080fd5b9392505050565b60805161104c6101106000396000610297015261104c6000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638f0bc15211610097578063c4113b8811610066578063c4113b8814610282578063c45a015514610295578063f2fde38b146102bb578063f77c4791146102ce57600080fd5b80638f0bc152146102025780639d63848a14610245578063a8734f0b1461025a578063c038a38e1461027a57600080fd5b80636c83ecca116100d35780636c83ecca146101925780636d16fa411461019c5780636fd366b8146101b15780638da5cb5b146101c357600080fd5b806302a688ed1461010557806327e235e3146101415780633e12170f1461016157806342a66f6814610189575b600080fd5b61012e610113366004610dd2565b505073ffffffffffffffffffffffffffffffffffffffff1690565b6040519081526020015b60405180910390f35b61015461014f366004610e25565b6102ec565b6040516101389190610e47565b61017461016f366004610e8b565b610357565b60408051928352602083019190915201610138565b61012e60025481565b61012e620f424081565b6101af6101aa366004610e25565b6105b9565b005b6101af6101bf366004610ee5565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610138565b610215610210366004610e8b565b6106b2565b6040805193845273ffffffffffffffffffffffffffffffffffffffff909216602084015290820152606001610138565b61024d610873565b6040516101389190610f27565b61012e610268366004610e25565b60036020526000908152604090205481565b6101546108e7565b610215610290366004610e8b565b61092e565b7f00000000000000000000000000000000000000000000000000000000000000006101dd565b6101af6102c9366004610e25565b610bff565b60015473ffffffffffffffffffffffffffffffffffffffff166101dd565b6040805160018082528183019092526060916020808301908036833750505073ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081205482519293509183919061034657610346610f75565b602002602001018181525050919050565b60008054819073ffffffffffffffffffffffffffffffffffffffff1633146103c65760405162461bcd60e51b815260206004820152600360248201527f6f6331000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600085116104185760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3100000000000000000000000000000000000000000000000000000000604082015260600190565b60015473ffffffffffffffffffffffffffffffffffffffff8781169116146104845760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3200000000000000000000000000000000000000000000000000000000604082015260600190565b602083146104d65760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3300000000000000000000000000000000000000000000000000000000604082015260600190565b60843573ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120805488929061050e908490610fd3565b9250508190555085600260008282546105279190610fd3565b909155505073ffffffffffffffffffffffffffffffffffffffff81166000610552620f424089610fec565b604080518a81526020810183905291925060009173ffffffffffffffffffffffffffffffffffffffff8c169185917f020c82fffaa7f476edc4d209bc47371cb11635b2077978c27e7c39360146d2ed910160405180910390a4909890975095505050505050565b6105c1610cf7565b73ffffffffffffffffffffffffffffffffffffffff81166106245760405162461bcd60e51b815260206004820152600360248201527f6f6334000000000000000000000000000000000000000000000000000000000060448201526064016103bd565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907fa06677f7b64342b4bcbde423684dbdb5356acfe41ad0285b6ecbe6dc4bf427f290600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080548190819073ffffffffffffffffffffffffffffffffffffffff16331461071e5760405162461bcd60e51b815260206004820152600360248201527f6f6331000000000000000000000000000000000000000000000000000000000060448201526064016103bd565b600086116107705760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3800000000000000000000000000000000000000000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600360205260409020548611156107e75760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3900000000000000000000000000000000000000000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8716600061080d620f424089610fec565b604080518a81526020810183905291925060009173ffffffffffffffffffffffffffffffffffffffff8c169185917f636cc28d1dc3c5f8610bbd1cabdf6585ab2ef79f4b9ae78e840c1b8fd5ac887a910160405180910390a49098909650945050505050565b604080516001808252818301909252606091602080830190803683370190505090506000816000815181106108aa576108aa610f75565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b604080516001808252818301909252606091602080830190803683370190505090506002548160008151811061091f5761091f610f75565b60200260200101818152505090565b600080548190819073ffffffffffffffffffffffffffffffffffffffff16331461099a5760405162461bcd60e51b815260206004820152600360248201527f6f6331000000000000000000000000000000000000000000000000000000000060448201526064016103bd565b600086116109ec5760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3400000000000000000000000000000000000000000000000000000000604082015260600190565b60015473ffffffffffffffffffffffffffffffffffffffff888116911614610a585760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3500000000000000000000000000000000000000000000000000000000604082015260600190565b60208414610aaa5760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3600000000000000000000000000000000000000000000000000000000604082015260600190565b60843573ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205480881115610b255760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3700000000000000000000000000000000000000000000000000000000604082015260600190565b610b2f8882611003565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812091909155600280548a9290610b6a908490611003565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000610b95620f42408b610fec565b604080518c81526020810183905291925060009173ffffffffffffffffffffffffffffffffffffffff8e169185917f31d5ceefd9ae9f1d896ec09a203f74a59524f36c970d3ede03478bb30c550a21910160405180910390a4909a92995097509095505050505050565b610c07610cf7565b73ffffffffffffffffffffffffffffffffffffffff8116610c6a5760405162461bcd60e51b815260206004820152600360248201527f6f6333000000000000000000000000000000000000000000000000000000000060448201526064016103bd565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d5e5760405162461bcd60e51b815260206004820152600360248201527f6f6331000000000000000000000000000000000000000000000000000000000060448201526064016103bd565b565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d8457600080fd5b919050565b60008083601f840112610d9b57600080fd5b50813567ffffffffffffffff811115610db357600080fd5b602083019150836020828501011115610dcb57600080fd5b9250929050565b600080600060408486031215610de757600080fd5b610df084610d60565b9250602084013567ffffffffffffffff811115610e0c57600080fd5b610e1886828701610d89565b9497909650939450505050565b600060208284031215610e3757600080fd5b610e4082610d60565b9392505050565b6020808252825182820181905260009190848201906040850190845b81811015610e7f57835183529284019291840191600101610e63565b50909695505050505050565b60008060008060608587031215610ea157600080fd5b610eaa85610d60565b935060208501359250604085013567ffffffffffffffff811115610ecd57600080fd5b610ed987828801610d89565b95989497509550505050565b60008060208385031215610ef857600080fd5b823567ffffffffffffffff811115610f0f57600080fd5b610f1b85828601610d89565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b81811015610e7f57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101610f43565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610fe657610fe6610fa4565b92915050565b8082028115828204841417610fe657610fe6610fa4565b81810381811115610fe657610fe6610fa456fea264697066735822122067b264f99da1add812ba4e5e3d9adab1b670d8e654ebfc819b41feffad522dd664736f6c63430008120033a26469706673582212209cbad4cdc410eebd471112e6e0d8e00f6bf536ac9ab602ad697e58e6cd6dd01e64736f6c63430008120033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061002b5760003560e01c806320868d1814610030575b600080fd5b61004361003e366004610198565b61006c565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000803060405161007c9061018b565b73ffffffffffffffffffffffffffffffffffffffff9091168152602001604051809103906000f0801580156100b5573d6000803e3d6000fd5b506040517ff2fde38b00000000000000000000000000000000000000000000000000000000815233600482015290915073ffffffffffffffffffffffffffffffffffffffff82169063f2fde38b90602401600060405180830381600087803b15801561012057600080fd5b505af1158015610134573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff841681523392507ff708942ec477396a151a5285651961dcab8e8a82ea4f5b31a5236f92f6c92710915060200160405180910390a2949350505050565b61115c8061023783390190565b6000806000604084860312156101ad57600080fd5b833573ffffffffffffffffffffffffffffffffffffffff811681146101d157600080fd5b9250602084013567ffffffffffffffff808211156101ee57600080fd5b818601915086601f83011261020257600080fd5b81358181111561021157600080fd5b87602082850101111561022357600080fd5b602083019450809350505050925092509256fe60a060405234801561001057600080fd5b5060405161115c38038061115c83398101604081905261002f916100c5565b60008054336001600160a01b0319918216811783556001805490921681179091556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600080546040516001600160a01b0390911691907fa06677f7b64342b4bcbde423684dbdb5356acfe41ad0285b6ecbe6dc4bf427f2908290a36001600160a01b03166080526100f5565b6000602082840312156100d757600080fd5b81516001600160a01b03811681146100ee57600080fd5b9392505050565b60805161104c6101106000396000610297015261104c6000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638f0bc15211610097578063c4113b8811610066578063c4113b8814610282578063c45a015514610295578063f2fde38b146102bb578063f77c4791146102ce57600080fd5b80638f0bc152146102025780639d63848a14610245578063a8734f0b1461025a578063c038a38e1461027a57600080fd5b80636c83ecca116100d35780636c83ecca146101925780636d16fa411461019c5780636fd366b8146101b15780638da5cb5b146101c357600080fd5b806302a688ed1461010557806327e235e3146101415780633e12170f1461016157806342a66f6814610189575b600080fd5b61012e610113366004610dd2565b505073ffffffffffffffffffffffffffffffffffffffff1690565b6040519081526020015b60405180910390f35b61015461014f366004610e25565b6102ec565b6040516101389190610e47565b61017461016f366004610e8b565b610357565b60408051928352602083019190915201610138565b61012e60025481565b61012e620f424081565b6101af6101aa366004610e25565b6105b9565b005b6101af6101bf366004610ee5565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610138565b610215610210366004610e8b565b6106b2565b6040805193845273ffffffffffffffffffffffffffffffffffffffff909216602084015290820152606001610138565b61024d610873565b6040516101389190610f27565b61012e610268366004610e25565b60036020526000908152604090205481565b6101546108e7565b610215610290366004610e8b565b61092e565b7f00000000000000000000000000000000000000000000000000000000000000006101dd565b6101af6102c9366004610e25565b610bff565b60015473ffffffffffffffffffffffffffffffffffffffff166101dd565b6040805160018082528183019092526060916020808301908036833750505073ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081205482519293509183919061034657610346610f75565b602002602001018181525050919050565b60008054819073ffffffffffffffffffffffffffffffffffffffff1633146103c65760405162461bcd60e51b815260206004820152600360248201527f6f6331000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600085116104185760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3100000000000000000000000000000000000000000000000000000000604082015260600190565b60015473ffffffffffffffffffffffffffffffffffffffff8781169116146104845760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3200000000000000000000000000000000000000000000000000000000604082015260600190565b602083146104d65760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3300000000000000000000000000000000000000000000000000000000604082015260600190565b60843573ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120805488929061050e908490610fd3565b9250508190555085600260008282546105279190610fd3565b909155505073ffffffffffffffffffffffffffffffffffffffff81166000610552620f424089610fec565b604080518a81526020810183905291925060009173ffffffffffffffffffffffffffffffffffffffff8c169185917f020c82fffaa7f476edc4d209bc47371cb11635b2077978c27e7c39360146d2ed910160405180910390a4909890975095505050505050565b6105c1610cf7565b73ffffffffffffffffffffffffffffffffffffffff81166106245760405162461bcd60e51b815260206004820152600360248201527f6f6334000000000000000000000000000000000000000000000000000000000060448201526064016103bd565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907fa06677f7b64342b4bcbde423684dbdb5356acfe41ad0285b6ecbe6dc4bf427f290600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080548190819073ffffffffffffffffffffffffffffffffffffffff16331461071e5760405162461bcd60e51b815260206004820152600360248201527f6f6331000000000000000000000000000000000000000000000000000000000060448201526064016103bd565b600086116107705760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3800000000000000000000000000000000000000000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600360205260409020548611156107e75760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3900000000000000000000000000000000000000000000000000000000604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff8716600061080d620f424089610fec565b604080518a81526020810183905291925060009173ffffffffffffffffffffffffffffffffffffffff8c169185917f636cc28d1dc3c5f8610bbd1cabdf6585ab2ef79f4b9ae78e840c1b8fd5ac887a910160405180910390a49098909650945050505050565b604080516001808252818301909252606091602080830190803683370190505090506000816000815181106108aa576108aa610f75565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b604080516001808252818301909252606091602080830190803683370190505090506002548160008151811061091f5761091f610f75565b60200260200101818152505090565b600080548190819073ffffffffffffffffffffffffffffffffffffffff16331461099a5760405162461bcd60e51b815260206004820152600360248201527f6f6331000000000000000000000000000000000000000000000000000000000060448201526064016103bd565b600086116109ec5760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3400000000000000000000000000000000000000000000000000000000604082015260600190565b60015473ffffffffffffffffffffffffffffffffffffffff888116911614610a585760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3500000000000000000000000000000000000000000000000000000000604082015260600190565b60208414610aaa5760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3600000000000000000000000000000000000000000000000000000000604082015260600190565b60843573ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205480881115610b255760405162461bcd60e51b81526004016103bd9060208082526004908201527f61736d3700000000000000000000000000000000000000000000000000000000604082015260600190565b610b2f8882611003565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812091909155600280548a9290610b6a908490611003565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000610b95620f42408b610fec565b604080518c81526020810183905291925060009173ffffffffffffffffffffffffffffffffffffffff8e169185917f31d5ceefd9ae9f1d896ec09a203f74a59524f36c970d3ede03478bb30c550a21910160405180910390a4909a92995097509095505050505050565b610c07610cf7565b73ffffffffffffffffffffffffffffffffffffffff8116610c6a5760405162461bcd60e51b815260206004820152600360248201527f6f6333000000000000000000000000000000000000000000000000000000000060448201526064016103bd565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d5e5760405162461bcd60e51b815260206004820152600360248201527f6f6331000000000000000000000000000000000000000000000000000000000060448201526064016103bd565b565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d8457600080fd5b919050565b60008083601f840112610d9b57600080fd5b50813567ffffffffffffffff811115610db357600080fd5b602083019150836020828501011115610dcb57600080fd5b9250929050565b600080600060408486031215610de757600080fd5b610df084610d60565b9250602084013567ffffffffffffffff811115610e0c57600080fd5b610e1886828701610d89565b9497909650939450505050565b600060208284031215610e3757600080fd5b610e4082610d60565b9392505050565b6020808252825182820181905260009190848201906040850190845b81811015610e7f57835183529284019291840191600101610e63565b50909695505050505050565b60008060008060608587031215610ea157600080fd5b610eaa85610d60565b935060208501359250604085013567ffffffffffffffff811115610ecd57600080fd5b610ed987828801610d89565b95989497509550505050565b60008060208385031215610ef857600080fd5b823567ffffffffffffffff811115610f0f57600080fd5b610f1b85828601610d89565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b81811015610e7f57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101610f43565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610fe657610fe6610fa4565b92915050565b8082028115828204841417610fe657610fe6610fa4565b81810381811115610fe657610fe6610fa456fea264697066735822122067b264f99da1add812ba4e5e3d9adab1b670d8e654ebfc819b41feffad522dd664736f6c63430008120033a26469706673582212209cbad4cdc410eebd471112e6e0d8e00f6bf536ac9ab602ad697e58e6cd6dd01e64736f6c63430008120033

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.