false
false
0

Contract Address Details

0xC9655F5dB2975f72033AC896CfdD2e8A858f2a4e

Contract Name
HashHub
Creator
0xbb78ef–16399b at 0x4f4f39–a3556b
Balance
0 FTN ($0.00 USD)
Tokens
Fetching tokens...
Transactions
69 Transactions
Transfers
136 Transfers
Gas Used
4,296,229
Last Balance Update
4574705
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
HashHub




Optimization enabled
true
Compiler version
v0.8.6+commit.11564f7e




Optimization runs
200
EVM Version
default




Verified at
2024-05-20T14:55:04.665672Z

Constructor Arguments

0000000000000000000000004084ab20f8ffca76c19aaf854fb5fe9de6217fbb000000000000000000000000bb78efaaaf9223b4840ea7defdc379a13b16399b

Arg [0] (address) : 0x4084ab20f8ffca76c19aaf854fb5fe9de6217fbb
Arg [1] (address) : 0xbb78efaaaf9223b4840ea7defdc379a13b16399b

              

contracts/HashHub.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";
import "hardhat/console.sol";
/**
* @title HashHub
* @notice This contract provides a way to access blockhashes older than
* the 256 block limit imposed by the BLOCKHASH opcode.
* You may assume that any blockhash stored by the contract is correct.
* Note that the contract depends on the format of serialized Ethereum
* blocks. If a future hardfork of Ethereum changes that format, the
* logic in this contract may become incorrect and an updated version
* would have to be deployed.
*/
contract HashHub is AccessControl {
IERC20 public rewardToken;
bytes32 public constant ADMIN_ROLE = 0xa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775;
mapping(uint => bytes32) internal s_blockhashes;
mapping(uint256 => uint256) public rewardForStoring;
mapping(address => uint256[]) public usersRequestedBlocks;
mapping(address => mapping(uint256 => uint256)) public providedRewards;
event BlockhashRequested(address requester, uint256 blockNumber, uint256 reward);
event BlockhashStored(uint256 blockNumber, bytes32 hashOfBlock);
event RewardForUnstoredBlockClaimed(address user, uint256 amount);
constructor(address _tokenAddress, address _owner){
rewardToken = IERC20(_tokenAddress);
_setupRole(ADMIN_ROLE, _owner);
_grantRole(DEFAULT_ADMIN_ROLE, _owner);
}
/**
* @notice stores blockhash of a given block, assuming it is available through BLOCKHASH
* @param n the number of the block whose blockhash should be stored
*/
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/AccessControl.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/access/IAccessControl.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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);
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Strings.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
import "./math/SignedMath.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/ERC165.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/introspection/IERC165.sol

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

@openzeppelin/contracts/utils/math/Math.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/math/SignedMath.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

hardhat/console.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS =
0x000000000000000000636F6e736F6c652e6c6f67;
function _sendLogPayloadImplementation(bytes memory payload) internal view {
address consoleAddress = CONSOLE_ADDRESS;
/// @solidity memory-safe-assembly
assembly {
pop(
staticcall(
gas(),
consoleAddress,
add(payload, 32),
mload(payload),
0,
0
)
)
}
}
function _castToPure(
function(bytes memory) internal view fnIn
) internal pure returns (function(bytes memory) pure fnOut) {
assembly {
fnOut := fnIn
}
}
function _sendLogPayload(bytes memory payload) internal pure {
_castToPure(_sendLogPayloadImplementation)(payload);
}
function log() internal pure {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Compiler Settings

{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"metadata":{"useLiteralContent":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_tokenAddress","internalType":"address"},{"type":"address","name":"_owner","internalType":"address"}]},{"type":"event","name":"BlockhashRequested","inputs":[{"type":"address","name":"requester","internalType":"address","indexed":false},{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"reward","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"BlockhashStored","inputs":[{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"bytes32","name":"hashOfBlock","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"RewardForUnstoredBlockClaimed","inputs":[{"type":"address","name":"user","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"previousAdminRole","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"newAdminRole","internalType":"bytes32","indexed":true}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DEFAULT_ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimRewardsForUnregisteredBlocks","inputs":[{"type":"uint256[]","name":"_blocks","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getBlockhash","inputs":[{"type":"uint256","name":"n","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getRoleAdmin","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getUsersRequestedBlocks","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"providedRewards","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"requestBlockhash","inputs":[{"type":"uint256","name":"_blockNumber","internalType":"uint256"},{"type":"uint256","name":"_reward","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"rewardForStoring","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"rewardToken","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"store","inputs":[{"type":"uint256","name":"n","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"storeHash","inputs":[{"type":"uint256","name":"blockNumber","internalType":"uint256"},{"type":"bytes32","name":"h","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"usersRequestedBlocks","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]}]
              

Contract Creation Code

0x60806040523480156200001157600080fd5b50604051620015603803806200156083398101604081905262000034916200015d565b600180546001600160a01b0319166001600160a01b0384161790556200007b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217758262000090565b62000088600082620000a0565b505062000195565b6200009c8282620000a0565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166200009c576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620000fc3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b80516001600160a01b03811681146200015857600080fd5b919050565b600080604083850312156200017157600080fd5b6200017c8362000140565b91506200018c6020840162000140565b90509250929050565b6113bb80620001a56000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806379ddd6cf116100a2578063a217fddf11610071578063a217fddf14610275578063d10a8a731461027d578063d547741f146102a8578063e9413d38146102bb578063f7c618c1146102db57600080fd5b806379ddd6cf1461020f57806391d1485414610222578063922f4c2c14610235578063942cc6611461025557600080fd5b806336568abe116100e957806336568abe1461019c5780634618b42c146101af578063505326e2146101c25780636057361d146101d557806375b238fc146101e857600080fd5b806301ffc9a71461011b5780630867e9be14610143578063248a9ca3146101645780632f2ff15d14610187575b600080fd5b61012e610129366004611116565b610306565b60405190151581526020015b60405180910390f35b610156610151366004610fc0565b61033d565b60405190815260200161013a565b6101566101723660046110d1565b60009081526020819052604090206001015490565b61019a6101953660046110ea565b61036e565b005b61019a6101aa3660046110ea565b610398565b61019a6101bd366004611140565b61041b565b61019a6101d0366004610fea565b61061e565b61019a6101e33660046110d1565b610840565b6101567fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b61019a61021d366004611140565b6109a9565b61012e6102303660046110ea565b610bcb565b610248610243366004610fa5565b610bf4565b60405161013a91906111d7565b6101566102633660046110d1565b60036020526000908152604090205481565b610156600081565b61015661028b366004610fc0565b600560209081526000928352604080842090915290825290205481565b61019a6102b63660046110ea565b610c60565b6101566102c93660046110d1565b60009081526002602052604090205490565b6001546102ee906001600160a01b031681565b6040516001600160a01b03909116815260200161013a565b60006001600160e01b03198216637965db0b60e01b148061033757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6004602052816000526040600020818154811061035957600080fd5b90600052602060002001600091509150505481565b60008281526020819052604090206001015461038981610c85565b6103938383610c92565b505050565b6001600160a01b038116331461040d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6104178282610d16565b5050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561044581610c85565b4361045284610100611293565b106104af5760405162461bcd60e51b815260206004820152602760248201527f486173684875623a2032353620626c6f636b732068617665206e6f74207061736044820152661cd959081e595d60ca1b6064820152608401610404565b816104fc5760405162461bcd60e51b815260206004820152601760248201527f486173684875623a2043616e277420736574207a65726f0000000000000000006044820152606401610404565b600083815260026020526040902054156105285760405162461bcd60e51b81526004016104049061124e565b60008381526002602090815260408083208590556003909152902054156105e0576001546000848152600360205260409081902054905163a9059cbb60e01b815233600482015260248101919091526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156105a657600080fd5b505af11580156105ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105de91906110af565b505b60408051848152602081018490527f724571589e707d918f6c920fe2c98d127abf5adf0163703a37372e89ff5e84e0910160405180910390a1505050565b6000805b8251811015610775573360009081526005602052604081208451829086908590811061065057610650611359565b6020026020010151815260200190815260200160002054118015610697575061067b610100436112ca565b83828151811061068d5761068d611359565b6020026020010151105b80156106d15750600260008483815181106106b4576106b4611359565b60200260200101518152602001908152602001600020546000801b145b156107635733600090815260056020526040812084519091908590849081106106fc576106fc611359565b60200260200101518152602001908152602001600020548261071e9190611293565b33600090815260056020526040812085519294509091829086908590811061074857610748611359565b60200260200101518152602001908152602001600020819055505b8061076d81611328565b915050610622565b5080156108025760015460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156107c857600080fd5b505af11580156107dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080091906110af565b505b60408051338152602081018390527fcec0a3b66eb0861c4f64422d09b61b88ebcefbd0c331b14fea6af78614d96ed091015b60405180910390a15050565b80408061088f5760405162461bcd60e51b815260206004820152601c60248201527f486173684875623a20426c6f636b68617368286e29206661696c6564000000006044820152606401610404565b600082815260026020526040902054156108bb5760405162461bcd60e51b81526004016104049061124e565b6000828152600260209081526040808320849055600390915290205415610973576001546000838152600360205260409081902054905163a9059cbb60e01b815233600482015260248101919091526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561093957600080fd5b505af115801561094d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097191906110af565b505b60408051838152602081018390527f724571589e707d918f6c920fe2c98d127abf5adf0163703a37372e89ff5e84e09101610834565b436109b683610100611293565b11610a0f5760405162461bcd60e51b815260206004820152602360248201527f486173684875623a20426c6f636b20686173682063616e27742062652073746f6044820152621c995960ea1b6064820152608401610404565b60008111610a5f5760405162461bcd60e51b815260206004820152601d60248201527f486173684875623a205265776172642063616e2774206265207a65726f0000006044820152606401610404565b60008281526002602052604090205415610a8b5760405162461bcd60e51b81526004016104049061124e565b60008281526003602052604081208054839290610aa9908490611293565b909155505033600090815260056020908152604080832085845290915281208054839290610ad8908490611293565b909155505033600081815260046020818152604080842080546001808201835591865292909420909101869055915491516323b872dd60e01b815290810192909252306024830152604482018390526001600160a01b0316906323b872dd90606401602060405180830381600087803b158015610b5457600080fd5b505af1158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c91906110af565b5060408051338152602081018490529081018290527f9d7fb67b33608ca86921fb9aa95a12c333ff268ae106350e6a84651ad83ca53e90606001610834565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b038116600090815260046020908152604091829020805483518184028101840190945280845260609392830182828015610c5457602002820191906000526020600020905b815481526020019060010190808311610c40575b50505050509050919050565b600082815260208190526040902060010154610c7b81610c85565b6103938383610d16565b610c8f8133610d7b565b50565b610c9c8282610bcb565b610417576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610cd23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610d208282610bcb565b15610417576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610d858282610bcb565b61041757610d9281610dd4565b610d9d836020610de6565b604051602001610dae929190611162565b60408051601f198184030181529082905262461bcd60e51b82526104049160040161121b565b60606103376001600160a01b03831660145b60606000610df58360026112ab565b610e00906002611293565b67ffffffffffffffff811115610e1857610e1861136f565b6040519080825280601f01601f191660200182016040528015610e42576020820181803683370190505b509050600360fc1b81600081518110610e5d57610e5d611359565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610e8c57610e8c611359565b60200101906001600160f81b031916908160001a9053506000610eb08460026112ab565b610ebb906001611293565b90505b6001811115610f33576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610eef57610eef611359565b1a60f81b828281518110610f0557610f05611359565b60200101906001600160f81b031916908160001a90535060049490941c93610f2c81611311565b9050610ebe565b508315610f825760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610404565b9392505050565b80356001600160a01b0381168114610fa057600080fd5b919050565b600060208284031215610fb757600080fd5b610f8282610f89565b60008060408385031215610fd357600080fd5b610fdc83610f89565b946020939093013593505050565b60006020808385031215610ffd57600080fd5b823567ffffffffffffffff8082111561101557600080fd5b818501915085601f83011261102957600080fd5b81358181111561103b5761103b61136f565b8060051b604051601f19603f830116810181811085821117156110605761106061136f565b604052828152858101935084860182860187018a101561107f57600080fd5b600095505b838610156110a2578035855260019590950194938601938601611084565b5098975050505050505050565b6000602082840312156110c157600080fd5b81518015158114610f8257600080fd5b6000602082840312156110e357600080fd5b5035919050565b600080604083850312156110fd57600080fd5b8235915061110d60208401610f89565b90509250929050565b60006020828403121561112857600080fd5b81356001600160e01b031981168114610f8257600080fd5b6000806040838503121561115357600080fd5b50508035926020909101359150565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161119a8160178501602088016112e1565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516111cb8160288401602088016112e1565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b8181101561120f578351835292840192918401916001016111f3565b50909695505050505050565b602081526000825180602084015261123a8160408501602087016112e1565b601f01601f19169190910160400192915050565b60208082526025908201527f486173684875623a20426c6f636b206861736820697320616c726561647920736040820152641d1bdc995960da1b606082015260800190565b600082198211156112a6576112a6611343565b500190565b60008160001904831182151516156112c5576112c5611343565b500290565b6000828210156112dc576112dc611343565b500390565b60005b838110156112fc5781810151838201526020016112e4565b8381111561130b576000848401525b50505050565b60008161132057611320611343565b506000190190565b600060001982141561133c5761133c611343565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212204cb74907c179e4984937036309a3a485290fed58040154f4478cc9ef6384c85964736f6c634300080600330000000000000000000000004084ab20f8ffca76c19aaf854fb5fe9de6217fbb000000000000000000000000bb78efaaaf9223b4840ea7defdc379a13b16399b

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101165760003560e01c806379ddd6cf116100a2578063a217fddf11610071578063a217fddf14610275578063d10a8a731461027d578063d547741f146102a8578063e9413d38146102bb578063f7c618c1146102db57600080fd5b806379ddd6cf1461020f57806391d1485414610222578063922f4c2c14610235578063942cc6611461025557600080fd5b806336568abe116100e957806336568abe1461019c5780634618b42c146101af578063505326e2146101c25780636057361d146101d557806375b238fc146101e857600080fd5b806301ffc9a71461011b5780630867e9be14610143578063248a9ca3146101645780632f2ff15d14610187575b600080fd5b61012e610129366004611116565b610306565b60405190151581526020015b60405180910390f35b610156610151366004610fc0565b61033d565b60405190815260200161013a565b6101566101723660046110d1565b60009081526020819052604090206001015490565b61019a6101953660046110ea565b61036e565b005b61019a6101aa3660046110ea565b610398565b61019a6101bd366004611140565b61041b565b61019a6101d0366004610fea565b61061e565b61019a6101e33660046110d1565b610840565b6101567fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b61019a61021d366004611140565b6109a9565b61012e6102303660046110ea565b610bcb565b610248610243366004610fa5565b610bf4565b60405161013a91906111d7565b6101566102633660046110d1565b60036020526000908152604090205481565b610156600081565b61015661028b366004610fc0565b600560209081526000928352604080842090915290825290205481565b61019a6102b63660046110ea565b610c60565b6101566102c93660046110d1565b60009081526002602052604090205490565b6001546102ee906001600160a01b031681565b6040516001600160a01b03909116815260200161013a565b60006001600160e01b03198216637965db0b60e01b148061033757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6004602052816000526040600020818154811061035957600080fd5b90600052602060002001600091509150505481565b60008281526020819052604090206001015461038981610c85565b6103938383610c92565b505050565b6001600160a01b038116331461040d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6104178282610d16565b5050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561044581610c85565b4361045284610100611293565b106104af5760405162461bcd60e51b815260206004820152602760248201527f486173684875623a2032353620626c6f636b732068617665206e6f74207061736044820152661cd959081e595d60ca1b6064820152608401610404565b816104fc5760405162461bcd60e51b815260206004820152601760248201527f486173684875623a2043616e277420736574207a65726f0000000000000000006044820152606401610404565b600083815260026020526040902054156105285760405162461bcd60e51b81526004016104049061124e565b60008381526002602090815260408083208590556003909152902054156105e0576001546000848152600360205260409081902054905163a9059cbb60e01b815233600482015260248101919091526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156105a657600080fd5b505af11580156105ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105de91906110af565b505b60408051848152602081018490527f724571589e707d918f6c920fe2c98d127abf5adf0163703a37372e89ff5e84e0910160405180910390a1505050565b6000805b8251811015610775573360009081526005602052604081208451829086908590811061065057610650611359565b6020026020010151815260200190815260200160002054118015610697575061067b610100436112ca565b83828151811061068d5761068d611359565b6020026020010151105b80156106d15750600260008483815181106106b4576106b4611359565b60200260200101518152602001908152602001600020546000801b145b156107635733600090815260056020526040812084519091908590849081106106fc576106fc611359565b60200260200101518152602001908152602001600020548261071e9190611293565b33600090815260056020526040812085519294509091829086908590811061074857610748611359565b60200260200101518152602001908152602001600020819055505b8061076d81611328565b915050610622565b5080156108025760015460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156107c857600080fd5b505af11580156107dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080091906110af565b505b60408051338152602081018390527fcec0a3b66eb0861c4f64422d09b61b88ebcefbd0c331b14fea6af78614d96ed091015b60405180910390a15050565b80408061088f5760405162461bcd60e51b815260206004820152601c60248201527f486173684875623a20426c6f636b68617368286e29206661696c6564000000006044820152606401610404565b600082815260026020526040902054156108bb5760405162461bcd60e51b81526004016104049061124e565b6000828152600260209081526040808320849055600390915290205415610973576001546000838152600360205260409081902054905163a9059cbb60e01b815233600482015260248101919091526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561093957600080fd5b505af115801561094d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097191906110af565b505b60408051838152602081018390527f724571589e707d918f6c920fe2c98d127abf5adf0163703a37372e89ff5e84e09101610834565b436109b683610100611293565b11610a0f5760405162461bcd60e51b815260206004820152602360248201527f486173684875623a20426c6f636b20686173682063616e27742062652073746f6044820152621c995960ea1b6064820152608401610404565b60008111610a5f5760405162461bcd60e51b815260206004820152601d60248201527f486173684875623a205265776172642063616e2774206265207a65726f0000006044820152606401610404565b60008281526002602052604090205415610a8b5760405162461bcd60e51b81526004016104049061124e565b60008281526003602052604081208054839290610aa9908490611293565b909155505033600090815260056020908152604080832085845290915281208054839290610ad8908490611293565b909155505033600081815260046020818152604080842080546001808201835591865292909420909101869055915491516323b872dd60e01b815290810192909252306024830152604482018390526001600160a01b0316906323b872dd90606401602060405180830381600087803b158015610b5457600080fd5b505af1158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c91906110af565b5060408051338152602081018490529081018290527f9d7fb67b33608ca86921fb9aa95a12c333ff268ae106350e6a84651ad83ca53e90606001610834565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b038116600090815260046020908152604091829020805483518184028101840190945280845260609392830182828015610c5457602002820191906000526020600020905b815481526020019060010190808311610c40575b50505050509050919050565b600082815260208190526040902060010154610c7b81610c85565b6103938383610d16565b610c8f8133610d7b565b50565b610c9c8282610bcb565b610417576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610cd23390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610d208282610bcb565b15610417576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610d858282610bcb565b61041757610d9281610dd4565b610d9d836020610de6565b604051602001610dae929190611162565b60408051601f198184030181529082905262461bcd60e51b82526104049160040161121b565b60606103376001600160a01b03831660145b60606000610df58360026112ab565b610e00906002611293565b67ffffffffffffffff811115610e1857610e1861136f565b6040519080825280601f01601f191660200182016040528015610e42576020820181803683370190505b509050600360fc1b81600081518110610e5d57610e5d611359565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610e8c57610e8c611359565b60200101906001600160f81b031916908160001a9053506000610eb08460026112ab565b610ebb906001611293565b90505b6001811115610f33576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610eef57610eef611359565b1a60f81b828281518110610f0557610f05611359565b60200101906001600160f81b031916908160001a90535060049490941c93610f2c81611311565b9050610ebe565b508315610f825760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610404565b9392505050565b80356001600160a01b0381168114610fa057600080fd5b919050565b600060208284031215610fb757600080fd5b610f8282610f89565b60008060408385031215610fd357600080fd5b610fdc83610f89565b946020939093013593505050565b60006020808385031215610ffd57600080fd5b823567ffffffffffffffff8082111561101557600080fd5b818501915085601f83011261102957600080fd5b81358181111561103b5761103b61136f565b8060051b604051601f19603f830116810181811085821117156110605761106061136f565b604052828152858101935084860182860187018a101561107f57600080fd5b600095505b838610156110a2578035855260019590950194938601938601611084565b5098975050505050505050565b6000602082840312156110c157600080fd5b81518015158114610f8257600080fd5b6000602082840312156110e357600080fd5b5035919050565b600080604083850312156110fd57600080fd5b8235915061110d60208401610f89565b90509250929050565b60006020828403121561112857600080fd5b81356001600160e01b031981168114610f8257600080fd5b6000806040838503121561115357600080fd5b50508035926020909101359150565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161119a8160178501602088016112e1565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516111cb8160288401602088016112e1565b01602801949350505050565b6020808252825182820181905260009190848201906040850190845b8181101561120f578351835292840192918401916001016111f3565b50909695505050505050565b602081526000825180602084015261123a8160408501602087016112e1565b601f01601f19169190910160400192915050565b60208082526025908201527f486173684875623a20426c6f636b206861736820697320616c726561647920736040820152641d1bdc995960da1b606082015260800190565b600082198211156112a6576112a6611343565b500190565b60008160001904831182151516156112c5576112c5611343565b500290565b6000828210156112dc576112dc611343565b500390565b60005b838110156112fc5781810151838201526020016112e4565b8381111561130b576000848401525b50505050565b60008161132057611320611343565b506000190190565b600060001982141561133c5761133c611343565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212204cb74907c179e4984937036309a3a485290fed58040154f4478cc9ef6384c85964736f6c63430008060033