Contract Overview
Balance:
0 CLV
CLV Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x9b1f9f0b505d76ee9f637791d1d76a1583559bc4806343d28f3ece5f7ae2dd5b | 0x60806040 | 2711677 | 12 days 14 hrs ago | 0xd134a7d9485c1aac0cbf82718cf6d6e3fd130945 | IN | Create: ERC721StakingModuleFactory | 0 CLV | 0.01459631 |
[ Download CSV Export ]
Contract Name:
ERC721StakingModuleFactory
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
/* ERC721StakingModule https://github.com/FanbaseEU/Staking_Ethereum_SmartContracts SPDX-License-Identifier: MIT */ pragma solidity 0.8.4; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "./interfaces/IStakingModule.sol"; /** * @title ERC721 staking module * * @notice this staking module allows users to deposit one or more ERC721 * tokens in exchange for shares credited to their address. When the user * unstakes, these shares will be burned and a reward will be distributed. */ contract ERC721StakingModule is IStakingModule { // constant uint256 public constant SHARES_PER_TOKEN = 10**18; // members IERC721 private immutable _token; address public immutable _factory; mapping(address => uint256) public counts; mapping(uint256 => address) public owners; mapping(address => mapping(uint256 => uint256)) public tokenByOwner; mapping(uint256 => uint256) public tokenIndex; /** * @param token_ the token that will be rewarded */ constructor(address token_, address factory_) { require( IERC165(token_).supportsInterface(0x80ac58cd), "Interface ID not matched" ); _token = IERC721(token_); _factory = factory_; } /** * @inheritdoc IStakingModule */ function tokens() external view override returns (address[] memory tokens_) { tokens_ = new address[](1); tokens_[0] = address(_token); } /** * @inheritdoc IStakingModule */ function balances(address user) external view override returns (uint256[] memory balances_) { balances_ = new uint256[](1); balances_[0] = counts[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] = _token.balanceOf(address(this)); } /** * @inheritdoc IStakingModule */ function stake( address user, uint256 amount, bytes calldata data ) external override onlyOwner returns (address, uint256) { // validate require(amount > 0, "Staking amount must be greater than 0"); require(amount <= _token.balanceOf(user), "Insufficient balance"); require(data.length == 32 * amount, "Invalid calldata"); uint256 count = counts[user]; // stake for (uint256 i = 0; i < amount; i++) { // get token id uint256 id; uint256 pos = 132 + 32 * i; assembly { id := calldataload(pos) } // ownership mappings owners[id] = user; uint256 len = count + i; tokenByOwner[user][len] = id; tokenIndex[id] = len; // transfer to module _token.transferFrom(user, address(this), id); } // update position counts[user] = count + amount; // emit uint256 shares = amount * SHARES_PER_TOKEN; emit Staked(user, address(_token), amount, shares); return (user, shares); } /** * @inheritdoc IStakingModule */ function unstake( address user, uint256 amount, bytes calldata data ) external override onlyOwner returns (address, uint256) { // validate require(amount > 0, "Unstaking amount must be greater than 0"); uint256 count = counts[user]; require(amount <= count, "Insufficient staked balance"); require(data.length == 32 * amount, "Invalid calldata"); // unstake for (uint256 i = 0; i < amount; i++) { // get token id uint256 id; uint256 pos = 132 + 32 * i; assembly { id := calldataload(pos) } // ownership require(owners[id] == user, "Only owner can unstake"); delete owners[id]; // clean up ownership mappings uint256 lastIndex = count - 1 - i; if (amount != count) { // reindex on partial unstake uint256 index = tokenIndex[id]; if (index != lastIndex) { uint256 lastId = tokenByOwner[user][lastIndex]; tokenByOwner[user][index] = lastId; tokenIndex[lastId] = index; } } delete tokenByOwner[user][lastIndex]; delete tokenIndex[id]; // transfer to user _token.safeTransferFrom(address(this), user, id); } // update position counts[user] = count - amount; // emit uint256 shares = amount * SHARES_PER_TOKEN; emit Unstaked(user, address(_token), amount, shares); return (user, shares); } /** * @inheritdoc IStakingModule */ function claim( address user, uint256 amount, bytes calldata ) external override onlyOwner returns (address, uint256) { // validate require(amount > 0, "Claiming amount must be greater than 0"); require(amount <= counts[user], "Insufficient balance"); uint256 shares = amount * SHARES_PER_TOKEN; emit Claimed(user, address(_token), amount, shares); return (user, shares); } /** * @inheritdoc IStakingModule */ function update(address) external override {} /** * @inheritdoc IStakingModule */ function clean() external override {} }
/* ERC721StakingModuleFactory https://github.com/FanbaseEU/Staking_Ethereum_SmartContracts SPDX-License-Identifier: MIT */ pragma solidity 0.8.4; import "./interfaces/IModuleFactory.sol"; import "./ERC721StakingModule.sol"; /** * @title ERC721 staking module factory * * @notice this factory contract handles deployment for the * ERC721StakingModule contract * * @dev it is called by the parent PoolFactory and is responsible * for parsing constructor arguments before creating a new contract */ contract ERC721StakingModuleFactory is IModuleFactory { /** * @inheritdoc IModuleFactory */ function createModule(bytes calldata data) external override returns (address) { // validate require(data.length == 32, "Invalid calldata"); // parse staking token address token; assembly { token := calldataload(68) } // create module ERC721StakingModule module = new ERC721StakingModule(token, address(this)); module.transferOwnership(msg.sender); // output emit ModuleCreated(msg.sender, address(module)); return address(module); } }
/* IEvents https://github.com/FanbaseEU/Staking_Ethereum_SmartContracts SPDX-License-Identifier: MIT */ pragma solidity 0.8.4; /** * @title GYSR event system * * @notice common interface to define GYSR event system */ interface IEvents { // staking event Staked( address indexed user, address indexed token, uint256 amount, uint256 shares ); event Unstaked( address indexed user, address indexed token, uint256 amount, uint256 shares ); event Claimed( address indexed user, address indexed token, uint256 amount, uint256 shares ); // 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 RewardsUnlocked(address indexed token, uint256 shares); event RewardsExpired( address indexed token, uint256 amount, uint256 shares, uint256 timestamp ); // gysr event GysrSpent(address indexed user, uint256 amount); event GysrVested(address indexed user, uint256 amount); event GysrWithdrawn(uint256 amount); }
/* IModuleFactory https://github.com/FanbaseEU/Staking_Ethereum_SmartContracts SPDX-License-Identifier: MIT */ pragma solidity 0.8.4; /** * @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 data binary encoded construction parameters * @return address of newly created module */ function createModule(bytes calldata data) external returns (address); }
/* IStakingModule https://github.com/FanbaseEU/Staking_Ethereum_SmartContracts SPDX-License-Identifier: MIT */ pragma solidity 0.8.4; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./IEvents.sol"; import "../OwnerController.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. */ abstract contract IStakingModule is OwnerController, IEvents { // constants uint256 public constant DECIMALS = 18; /** * @return array of staking tokens */ function tokens() external view virtual 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 virtual returns (uint256[] memory); /** * @return address of module factory */ function factory() external view virtual returns (address); /** * @notice get total staked amount * @return totals for each staking token */ function totals() external view virtual returns (uint256[] memory); /** * @notice stake an amount of tokens for user * @param user address of user * @param amount number of tokens to stake * @param data additional data * @return address of staking account * @return number of shares minted for stake */ function stake( address user, uint256 amount, bytes calldata data ) external virtual returns (address, uint256); /** * @notice unstake an amount of tokens for user * @param user address of user * @param amount number of tokens to unstake * @param data additional data * @return address of staking account * @return number of shares burned for unstake */ function unstake( address user, uint256 amount, bytes calldata data ) external virtual returns (address, uint256); /** * @notice quote the share value for an amount of tokens without unstaking * @param user address of user * @param amount number of tokens to claim with * @param data additional data * @return address of staking account * @return number of shares that the claim amount is worth */ function claim( address user, uint256 amount, bytes calldata data ) external virtual returns (address, uint256); /** * @notice method called by anyone to update accounting * @param user address of user for update * @dev will only be called ad hoc and should not contain essential logic */ function update(address user) external virtual; /** * @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 */ function clean() external virtual; }
/* OwnerController https://github.com/FanbaseEU/Staking_Ethereum_SmartContracts SPDX-License-Identifier: MIT */ pragma solidity 0.8.4; /** * @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 { 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 returns (address) { return _owner; } /** * @dev Returns the address of the current controller. */ function controller() public view returns (address) { return _controller; } /** * @dev Modifier that throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == msg.sender, "Only owner can perform this action"); _; } /** * @dev Modifier that throws if called by any account other than the controller. */ modifier onlyController() { require(_controller == msg.sender, "Only controller can perform this action"); _; } /** * @dev Throws if called by any account other than the owner. */ function requireOwner() internal view { require(_owner == msg.sender, "Only owner can perform this action"); } /** * @dev Throws if called by any account other than the controller. */ function requireController() internal view { require(_controller == msg.sender, "Only controller can perform this action"); } /** * @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) public virtual { requireOwner(); require(newOwner != address(0), "New owner address can't be zero"); 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 { requireOwner(); require(newController != address(0), "New controller address can't be zero"); emit ControlTransferred(_controller, newController); _controller = newController; } }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"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":"bytes","name":"data","type":"bytes"}],"name":"createModule","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611994806100206000396000f3fe608060405234801561001057600080fd5b506004361061002a5760003560e01c8062ee8fe51461002f575b600080fd5b61004261003d366004610215565b61006b565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6000602082146100db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c69642063616c6c6461746100000000000000000000000000000000604482015260640160405180910390fd5b60006044359050600081306040516100f290610208565b73ffffffffffffffffffffffffffffffffffffffff928316815291166020820152604001604051809103906000f080158015610132573d6000803e3d6000fd5b506040517ff2fde38b00000000000000000000000000000000000000000000000000000000815233600482015290915073ffffffffffffffffffffffffffffffffffffffff82169063f2fde38b90602401600060405180830381600087803b15801561019d57600080fd5b505af11580156101b1573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff841681523392507ff708942ec477396a151a5285651961dcab8e8a82ea4f5b31a5236f92f6c92710915060200160405180910390a2949350505050565b6116dc8061028383390190565b60008060208385031215610227578182fd5b823567ffffffffffffffff8082111561023e578384fd5b818501915085601f830112610251578384fd5b81358181111561025f578485fd5b866020828501011115610270578485fd5b6020929092019691955090935050505056fe60c06040523480156200001157600080fd5b50604051620016dc380380620016dc8339810160408190526200003491620001c8565b60008054336001600160a01b0319918216811783556001805490921681179091556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600080546040516001600160a01b0390911691907fa06677f7b64342b4bcbde423684dbdb5356acfe41ad0285b6ecbe6dc4bf427f2908290a36040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038316906301ffc9a79060240160206040518083038186803b1580156200010057600080fd5b505afa15801562000115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200013b9190620001ff565b6200018c5760405162461bcd60e51b815260206004820152601860248201527f496e74657266616365204944206e6f74206d6174636865640000000000000000604482015260640160405180910390fd5b6001600160601b0319606092831b8116608052911b1660a05262000228565b80516001600160a01b0381168114620001c357600080fd5b919050565b60008060408385031215620001db578182fd5b620001e683620001ab565b9150620001f660208401620001ab565b90509250929050565b60006020828403121562000211578081fd5b8151801515811462000221578182fd5b9392505050565b60805160601c60a05160601c6114506200028c60003960008181610315015261033e0152600081816104f20152818161070a015281816107b901528181610a8201528181610b2401528181610bbf01528181610fb4015261106501526114506000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c80638da5cb5b116100cd578063c45a015511610081578063f2fde38b11610066578063f2fde38b14610360578063f77c479114610373578063fc4333cd1461021657600080fd5b8063c45a015514610313578063c5cc6b6a1461033957600080fd5b80639d63848a116100b25780639d63848a146102e3578063c038a38e146102f8578063c4113b881461030057600080fd5b80638da5cb5b146102bf5780638f0bc152146102d057600080fd5b806327e235e3116101245780633e12170f116101095780633e12170f1461026b5780636d16fa411461029d5780638c7a4638146102b057600080fd5b806327e235e3146102435780632e0f26251461026357600080fd5b80630583e9f8116101555780630583e9f8146101e55780631c1b877214610205578063259fd2211461021857600080fd5b8063025e7c27146101715780630568e65e146101b7575b600080fd5b61019a61017f3660046112e6565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101d76101c536600461121a565b60026020526000908152604090205481565b6040519081526020016101ae565b6101d76101f33660046112e6565b60056020526000908152604090205481565b61021661021336600461121a565b50565b005b6101d761022636600461123b565b600460209081526000928352604080842090915290825290205481565b61025661025136600461121a565b610384565b6040516101ae9190611363565b6101d7601281565b61027e610279366004611264565b6103f0565b604080516001600160a01b0390931683526020830191909152016101ae565b6102166102ab36600461121a565b610838565b6101d7670de0b6b3a764000081565b6000546001600160a01b031661019a565b61027e6102de366004611264565b610924565b6102eb610b00565b6040516101ae9190611316565b610256610b87565b61027e61030e366004611264565b610c71565b7f000000000000000000000000000000000000000000000000000000000000000061019a565b61019a7f000000000000000000000000000000000000000000000000000000000000000081565b61021661036e36600461121a565b6110d1565b6001546001600160a01b031661019a565b604080516001808252818301909252606091602080830190803683375050506001600160a01b0383166000908152600260205260408120548251929350918391906103df57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050919050565b6000805481906001600160a01b0316331461045d5760405162461bcd60e51b815260206004820152602260248201527f4f6e6c79206f776e65722063616e20706572666f726d2074686973206163746960448201526137b760f11b60648201526084015b60405180910390fd5b600085116104d35760405162461bcd60e51b815260206004820152602560248201527f5374616b696e6720616d6f756e74206d7573742062652067726561746572207460448201527f68616e20300000000000000000000000000000000000000000000000000000006064820152608401610454565b6040516370a0823160e01b81526001600160a01b0387811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561053457600080fd5b505afa158015610548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056c91906112fe565b8511156105bb5760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610454565b6105c68560206113b3565b83146106145760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642063616c6c64617461000000000000000000000000000000006044820152606401610454565b6001600160a01b038616600090815260026020526040812054905b8681101561077c576000806106458360206113b3565b61065090608461139b565b80356000818152600360205260408120805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038f16179055909350909150610696848661139b565b6001600160a01b038c8116600081815260046020818152604080842087855282528084208a905589845260059091529182902085905590517f23b872dd00000000000000000000000000000000000000000000000000000000815290810191909152306024820152604481018690529192507f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401600060405180830381600087803b15801561074e57600080fd5b505af1158015610762573d6000803e3d6000fd5b505050505050508080610774906113e9565b91505061062f565b50610787868261139b565b6001600160a01b0388166000908152600260205260408120919091556107b5670de0b6b3a7640000886113b3565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316886001600160a01b03167f6c86f3fd5118b3aa8bb4f389a617046de0a3d3d477de1a1673d227f802f616dc8984604051610825929190918252602082015260400190565b60405180910390a3969795505050505050565b610840611199565b6001600160a01b0381166108bb5760405162461bcd60e51b8152602060048201526024808201527f4e657720636f6e74726f6c6c657220616464726573732063616e27742062652060448201527f7a65726f000000000000000000000000000000000000000000000000000000006064820152608401610454565b6001546040516001600160a01b038084169216907fa06677f7b64342b4bcbde423684dbdb5356acfe41ad0285b6ecbe6dc4bf427f290600090a36001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000805481906001600160a01b0316331461098c5760405162461bcd60e51b815260206004820152602260248201527f4f6e6c79206f776e65722063616e20706572666f726d2074686973206163746960448201526137b760f11b6064820152608401610454565b60008511610a025760405162461bcd60e51b815260206004820152602660248201527f436c61696d696e6720616d6f756e74206d75737420626520677265617465722060448201527f7468616e203000000000000000000000000000000000000000000000000000006064820152608401610454565b6001600160a01b038616600090815260026020526040902054851115610a6a5760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610454565b6000610a7e670de0b6b3a7640000876113b3565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b03167f2f6639d24651730c7bf57c95ddbf96d66d11477e4ec626876f92c22e5f365e688884604051610aee929190918252602082015260400190565b60405180910390a39596945050505050565b604080516001808252818301909252606091602080830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110610b6457634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b03168152505090565b60408051600180825281830190925260609160208083019080368337019050506040516370a0823160e01b81523060048201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610c0957600080fd5b505afa158015610c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4191906112fe565b81600081518110610c6257634e487b7160e01b600052603260045260246000fd5b60200260200101818152505090565b6000805481906001600160a01b03163314610cd95760405162461bcd60e51b815260206004820152602260248201527f4f6e6c79206f776e65722063616e20706572666f726d2074686973206163746960448201526137b760f11b6064820152608401610454565b60008511610d4f5760405162461bcd60e51b815260206004820152602760248201527f556e7374616b696e6720616d6f756e74206d757374206265206772656174657260448201527f207468616e2030000000000000000000000000000000000000000000000000006064820152608401610454565b6001600160a01b03861660009081526002602052604090205480861115610db85760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e74207374616b65642062616c616e636500000000006044820152606401610454565b610dc38660206113b3565b8414610e115760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642063616c6c64617461000000000000000000000000000000006044820152606401610454565b60005b8681101561102857600080610e2a8360206113b3565b610e3590608461139b565b80356000818152600360205260409020549093509091506001600160a01b038b8116911614610ea65760405162461bcd60e51b815260206004820152601660248201527f4f6e6c79206f776e65722063616e20756e7374616b65000000000000000000006044820152606401610454565b6000828152600360205260408120805473ffffffffffffffffffffffffffffffffffffffff1916905583610edb6001876113d2565b610ee591906113d2565b9050848a14610f4057600083815260056020526040902054818114610f3e576001600160a01b038c1660009081526004602090815260408083208584528252808320548484528184208190558352600590915290208190555b505b6001600160a01b03808c166000818152600460208181526040808420878552825280842084905588845260059091528083209290925590517f42842e0e00000000000000000000000000000000000000000000000000000000815230918101919091526024810191909152604481018590527f0000000000000000000000000000000000000000000000000000000000000000909116906342842e0e90606401600060405180830381600087803b158015610ffa57600080fd5b505af115801561100e573d6000803e3d6000fd5b505050505050508080611020906113e9565b915050610e14565b5061103386826113d2565b6001600160a01b038816600090815260026020526040812091909155611061670de0b6b3a7640000886113b3565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316886001600160a01b03167f06cc7e90b4f2b554a9614b0caa84f909f3498c820ae47c731f490c28c07f7d3b8984604051610825929190918252602082015260400190565b6110d9611199565b6001600160a01b03811661112f5760405162461bcd60e51b815260206004820152601f60248201527f4e6577206f776e657220616464726573732063616e2774206265207a65726f006044820152606401610454565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b565b6000546001600160a01b031633146111975760405162461bcd60e51b815260206004820152602260248201527f4f6e6c79206f776e65722063616e20706572666f726d2074686973206163746960448201526137b760f11b6064820152608401610454565b80356001600160a01b038116811461121557600080fd5b919050565b60006020828403121561122b578081fd5b611234826111fe565b9392505050565b6000806040838503121561124d578081fd5b611256836111fe565b946020939093013593505050565b60008060008060608587031215611279578182fd5b611282856111fe565b935060208501359250604085013567ffffffffffffffff808211156112a5578384fd5b818701915087601f8301126112b8578384fd5b8135818111156112c6578485fd5b8860208285010111156112d7578485fd5b95989497505060200194505050565b6000602082840312156112f7578081fd5b5035919050565b60006020828403121561130f578081fd5b5051919050565b6020808252825182820181905260009190848201906040850190845b818110156113575783516001600160a01b031683529284019291840191600101611332565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156113575783518352928401929184019160010161137f565b600082198211156113ae576113ae611404565b500190565b60008160001904831182151516156113cd576113cd611404565b500290565b6000828210156113e4576113e4611404565b500390565b60006000198214156113fd576113fd611404565b5060010190565b634e487b7160e01b600052601160045260246000fdfea26469706673582212202889507bae70adc0c1a52a46810bdefa864435c9417014d833483a53aa1fb36f64736f6c63430008040033a2646970667358221220507c24b5fdbced7aa45e8c0bc234e7ca470a1cd97f3781607f5a28aead5a3f8464736f6c63430008040033
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.