More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,270 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unpause | 21278951 | 8 hrs ago | IN | 0 ETH | 0.00029429 | ||||
Increment Term I... | 21278950 | 8 hrs ago | IN | 0 ETH | 0.00032907 | ||||
Withdraw Token | 21257466 | 3 days ago | IN | 0 ETH | 0.00044162 | ||||
Pause | 21257465 | 3 days ago | IN | 0 ETH | 0.00050686 | ||||
Claim | 21233499 | 6 days ago | IN | 0 ETH | 0.00170854 | ||||
Claim | 21228836 | 7 days ago | IN | 0 ETH | 0.00223115 | ||||
Unpause | 21228815 | 7 days ago | IN | 0 ETH | 0.00028604 | ||||
Increment Term I... | 21228814 | 7 days ago | IN | 0 ETH | 0.00032377 | ||||
Withdraw Token | 21207290 | 10 days ago | IN | 0 ETH | 0.00037902 | ||||
Pause | 21207289 | 10 days ago | IN | 0 ETH | 0.00046393 | ||||
Claim | 21204224 | 10 days ago | IN | 0 ETH | 0.00230068 | ||||
Unpause | 21178635 | 14 days ago | IN | 0 ETH | 0.00078057 | ||||
Increment Term I... | 21178634 | 14 days ago | IN | 0 ETH | 0.00088633 | ||||
Withdraw Token | 21157131 | 17 days ago | IN | 0 ETH | 0.00064992 | ||||
Pause | 21157130 | 17 days ago | IN | 0 ETH | 0.00076288 | ||||
Unpause | 21128475 | 21 days ago | IN | 0 ETH | 0.00047653 | ||||
Increment Term I... | 21128474 | 21 days ago | IN | 0 ETH | 0.00048847 | ||||
Withdraw Token | 21106981 | 24 days ago | IN | 0 ETH | 0.00021676 | ||||
Pause | 21106980 | 24 days ago | IN | 0 ETH | 0.0002463 | ||||
Claim | 21106202 | 24 days ago | IN | 0 ETH | 0.00087403 | ||||
Claim | 21088976 | 26 days ago | IN | 0 ETH | 0.00115309 | ||||
Claim | 21081870 | 27 days ago | IN | 0 ETH | 0.00145705 | ||||
Unpause | 21078320 | 28 days ago | IN | 0 ETH | 0.00024107 | ||||
Increment Term I... | 21078319 | 28 days ago | IN | 0 ETH | 0.00025712 | ||||
Withdraw Token | 21056829 | 31 days ago | IN | 0 ETH | 0.00021854 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SkebClaim
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 v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "../ISkebStaking.sol"; import "../util/TGPausable.sol"; import "../util/VerifySignature.sol"; import "./ISkebClaim.sol"; contract SkebClaim is TGPausable, ReentrancyGuard, VerifySignature, ISkebClaim { mapping(address => uint256) public latestUserTermId; uint256 public currentTermId = 1; IERC20 public skebcoin; ISkebStaking public staking; bytes32 public constant SIGNER_ROLE = keccak256("Signer"); constructor(IERC20 _skebcoin, ISkebStaking _staking) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); skebcoin = _skebcoin; staking = _staking; skebcoin.approve(address(staking), 10**28); } function claim( address signer, address user, uint256 amount, uint256 expiry, bytes memory sig ) external override nonReentrant whenNotPaused { require(user == msg.sender, "Error: Invalid sender"); require(block.timestamp < expiry, "Error: Signature already expired"); require(isSigner(signer), "Error: Invalid Signer"); require( currentClaimableId() > latestUserTermId[user], "Invalid term Id" ); require( validateSignature( signer, user, amount, expiry, sig, currentClaimableId() ), "Error: Invalid Signature" ); staking.stakeFor(user, uint128(amount)); latestUserTermId[user] = currentClaimableId(); } function incrementTermId() external override onlyAdmin { currentTermId++; } function changeTermId(uint256 newTermId) external override onlyAdmin { require(newTermId != 0, "Error: termid != 0"); currentTermId = newTermId; } function currentClaimableId() public view returns (uint256) { return currentTermId - 1; } function grantSigner(address newSigner) external override onlyAdmin { grantRole(SIGNER_ROLE, newSigner); } function revokeSigner(address oldSigner) external override onlyAdmin { _revokeRole(SIGNER_ROLE, oldSigner); } function isSigner(address signer) public view override returns (bool) { return hasRole(SIGNER_ROLE, signer); } function getTokenBalance() external view override returns (uint256) { return skebcoin.balanceOf(address(this)); } function withdrawToken(uint256 amount) external override onlyAdmin { require( skebcoin.transfer(msg.sender, amount), "Error: Withdrawal Failed" ); } function createClaimMessage( address user, uint256 amount, uint256 expiry, uint256 termId ) public pure override returns (bytes32) { return keccak256(abi.encodePacked(user, amount, expiry, termId)); } function validateSignature( address signer, address user, uint256 amount, uint256 expiry, bytes memory sig, uint256 termId ) public pure override returns (bool) { bytes32 message = createClaimMessage(user, amount, expiry, termId); return verify(signer, message, sig); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; interface ISkebStaking { function stake(uint128 _amount) external; function unstake(uint256 _stakeIndex) external; function stakeFor(address _user, uint128 _amount) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "@openzeppelin/contracts/security/Pausable.sol"; import "./TGAccessControl.sol"; contract TGPausable is Pausable, TGAccessControl { function pause() external onlyAdmin { _pause(); } function unpause() external onlyAdmin { _unpause(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* Signature Verification How to Sign and Verify # Signing 1. Create message to sign 2. Hash the message 3. Sign the hash (off chain, keep your private key secret) # Verify 1. Recreate hash from the original message 2. Recover signer from signature and hash 3. Compare recovered signer to claimed signer */ contract VerifySignature { /* 3. Sign message hash # using browser account = "copy paste account of signer here" ethereum.request({ method: "personal_sign", params: [account, hash]}).then(console.log) # using web3 web3.personal.sign(hash, web3.eth.defaultAccount, console.log) Signature will be different for different accounts 0x993dab3dd91f5c6dc28e17439be475478f5635c92a56 e17e82349d3fb2f166196f466c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b */ function getEthSignedMessageHash(bytes32 _messageHash) public pure returns (bytes32) { /* Signature is produced by signing a keccak256 hash with the following format: "\x19Ethereum Signed Message\n" + len(msg) + msg */ return keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", _messageHash ) ); } /* 4. Verify signature signer = 0xB273216C05A8c0D4F0a4Dd0d7Bae1D2EfFE636dd to = 0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C amount = 123 message = "coffee and donuts" nonce = 1 signature = 0x993dab3dd91f5c6dc28e17439be475478f5635c92a56e17e82349d3fb2f166196f46 6c0b4e0c146f285204f0dcb13e5ae67bc33f4b888ec32dfe0a063e8f3f781b */ function verify( address _signer, bytes32 messageHash, bytes memory signature ) public pure returns (bool) { bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); return recoverSigner(ethSignedMessageHash, signature) == _signer; } function recoverSigner( bytes32 _ethSignedMessageHash, bytes memory _signature ) public pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); return ecrecover(_ethSignedMessageHash, v, r, s); } function splitSignature(bytes memory sig) public pure returns ( bytes32 r, bytes32 s, uint8 v ) { require(sig.length == 65, "invalid signature length"); assembly { /* First 32 bytes stores the length of the signature add(sig, 32) = pointer of sig + 32 effectively, skips first 32 bytes of signature mload(p) loads next 32 bytes starting at the memory address p into memory */ // first 32 bytes, after the length prefix r := mload(add(sig, 32)) // second 32 bytes s := mload(add(sig, 64)) // final byte (first byte of the next 32 bytes) v := byte(0, mload(add(sig, 96))) } // implicitly return (r, s, v) } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; interface ISkebClaim { function claim( address signer, address user, uint256 amount, uint256 expiry, bytes memory sig ) external; function grantSigner(address newSigner) external; function revokeSigner(address oldSigner) external; function isSigner(address signer) external view returns (bool); function getTokenBalance() external view returns (uint256); function withdrawToken(uint256 amount) external; function incrementTermId() external; function changeTermId(uint256 newTermId) external; function createClaimMessage( address user, uint256 amount, uint256 expiry, uint256 termId ) external pure returns (bytes32); function validateSignature( address signer, address user, uint256 amount, uint256 expiry, bytes memory sig, uint256 termId ) external pure returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// 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 pragma solidity ^0.8.0; import "./ITGAccessControl.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; /** * @dev Access control contract module * inherited {AccessControl} from OpenZeppelin. */ abstract contract TGAccessControl is AccessControl, ITGAccessControl { // --- modifier --- /** * @dev Modifier that checks that an account has admin role. Reverts * with a standardized message including the required DEFAULT_ADMIN_ROLE role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role 0x00$/ */ modifier onlyAdmin() { _checkRole(DEFAULT_ADMIN_ROLE, _msgSender()); _; } // --- public function --- /** * @dev Returns `true` if `_account` has admin role. */ function hasAdmin(address _account) public view virtual override returns (bool) { return hasRole(DEFAULT_ADMIN_ROLE, _account); } /** * @dev Grants admin role to `_account`. * * If `account` has not been already granted admin role, emits a {RoleGranted} event. * * Requirements: * - the caller must have admin role. */ function grantAdmin(address _account) public virtual override onlyAdmin { require( _account != address(0), "TGAccessControl: account is the zero address" ); _grantAdmin(_account); } /** * @dev Revokes admin role from `_account`. * * If `account` had been already granted admin role, emits a {RoleRevoked} event. * * Requirements: * - the caller must have admi rolen, not `_account` (cannot revoke from self). */ function revokeAdmin(address _account) public virtual override onlyAdmin { require( _account != _msgSender(), "TGAccessControl: cannot revoke from self" ); _revokeAdmin(_account); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(ITGAccessControl).interfaceId || super.supportsInterface(interfaceId); } // --- internal function --- /** * @dev Grants admin role to `_account`. * * Internal function without access restriction. * * If `account` has not been already granted admin role, emits a {RoleGranted} event. */ function _grantAdmin(address _account) internal virtual { _grantRole(DEFAULT_ADMIN_ROLE, _account); } /** * @dev Revokes admin role from `_account`. * * Internal function without access restriction. * * If `account` had been already granted admin from, emits a {RoleRevoked} event. */ function _revokeAdmin(address _account) internal virtual { _revokeRole(DEFAULT_ADMIN_ROLE, _account); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev External interface of TGAccessControl declared to support ERC165 detection. */ interface ITGAccessControl { /** * @dev Returns `true` if `_account` has admin. */ function hasAdmin(address _account) external view returns (bool); /** * @dev Grants admin role to `_account`. * * If `account` has not been already granted admin role, emits a {RoleGranted} event. * * Requirements: * - the caller must have admin role. */ function grantAdmin(address _account) external; /** * @dev Revokes admin role from `_account`. * * If `account` had been already granted admin role, emits a {RoleRevoked} event. * * Requirements: * - the caller must have admin role, not `_account` (cannot revoke from self). */ function revokeAdmin(address _account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.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: * * ``` * 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}: * * ``` * 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 * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// 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); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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; } }
// 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_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) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// 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); }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_skebcoin","type":"address"},{"internalType":"contract ISkebStaking","name":"_staking","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIGNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTermId","type":"uint256"}],"name":"changeTermId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint256","name":"termId","type":"uint256"}],"name":"createClaimMessage","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"currentClaimableId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTermId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_messageHash","type":"bytes32"}],"name":"getEthSignedMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"grantAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"grantSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"hasAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"incrementTermId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestUserTermId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_ethSignedMessageHash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldSigner","type":"address"}],"name":"revokeSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"skebcoin","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"splitSignature","outputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"contract ISkebStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"uint256","name":"termId","type":"uint256"}],"name":"validateSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"bytes32","name":"messageHash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260016004553480156200001657600080fd5b5060405162001c8938038062001c898339810160408190526200003991620001d4565b6000805460ff19168155600160025562000054903362000113565b600580546001600160a01b038481166001600160a01b031992831681179093556006805491851691909216811790915560405163095ea7b360e01b815260048101919091526b204fce5e3e25026110000000602482015263095ea7b390604401602060405180830381600087803b158015620000cf57600080fd5b505af1158015620000e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200010a9190620001ab565b5050506200022b565b6200011f828262000123565b5050565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff166200011f5760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b600060208284031215620001bd578081fd5b81518015158114620001cd578182fd5b9392505050565b60008060408385031215620001e7578081fd5b8251620001f48162000212565b6020840151909250620002078162000212565b809150509250929050565b6001600160a01b03811681146200022857600080fd5b50565b611a4e806200023b6000396000f3fe608060405234801561001057600080fd5b506004361061020b5760003560e01c806363c724f71161012a578063a217fddf116100bd578063d2d1f5641161008c578063eb66c28911610071578063eb66c289146104b3578063eee2686214610518578063fa5408011461052157600080fd5b8063d2d1f5641461048d578063d547741f146104a057600080fd5b8063a217fddf1461042e578063a7bb580314610436578063ae59105c14610467578063c34b44a01461047a57600080fd5b80638456cb59116100f95780638456cb59146103b357806391d14854146103bb57806397aba7f9146103f4578063a1ebf35d1461040757600080fd5b806363c724f7146103655780637d5c08dd146103785780637df73e271461039857806382b2e257146103ab57600080fd5b806335950fed116101a25780634cf088d9116101715780634cf088d91461030957806350baa622146103345780635c975abb146103475780635cb76c1a1461035257600080fd5b806335950fed146102c857806335bb3e16146102db57806336568abe146102ee5780633f4ba83a1461030157600080fd5b80631a86b550116101de5780631a86b5501461026b578063248a9ca31461027e5780632d345670146102a25780632f2ff15d146102b557600080fd5b806301b476811461021057806301ffc9a71461021a57806308c7750e146102425780630bf3a23714610255575b600080fd5b610218610582565b005b61022d61022836600461180d565b6105a4565b60405190151581526020015b60405180910390f35b6102186102503660046115f0565b6105e8565b61025d6108d1565b604051908152602001610239565b61022d6102793660046116d8565b6108e7565b61025d61028c366004611785565b6000908152600160208190526040909120015490565b6102186102b03660046115d6565b61096a565b6102186102c336600461179d565b610a00565b61022d6102d63660046115d6565b610a2b565b6102186102e93660046115d6565b610a6b565b6102186102fc36600461179d565b610afb565b610218610b87565b60065461031c906001600160a01b031681565b6040516001600160a01b039091168152602001610239565b610218610342366004611785565b610b9c565b60005460ff1661022d565b61022d610360366004611660565b610c90565b6102186103733660046115d6565b610cf8565b61025d6103863660046115d6565b60036020526000908152604090205481565b61022d6103a63660046115d6565b610d2d565b61025d610d6d565b610218610e02565b61022d6103c936600461179d565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b61031c6104023660046117c8565b610e15565b61025d7f4ca6459022e96ac591406da8141b5e9b21c648122d7f0f94007990d12720bb5581565b61025d600081565b610449610444366004611835565b610e94565b60408051938452602084019290925260ff1690820152606001610239565b60055461031c906001600160a01b031681565b6102186104883660046115d6565b610f08565b61021861049b366004611785565b610f3d565b6102186104ae36600461179d565b610f9a565b61025d6104c136600461172d565b6040516bffffffffffffffffffffffff19606086901b166020820152603481018490526054810183905260748101829052600090609401604051602081830303815290604052805190602001209050949350505050565b61025d60045481565b61025d61052f366004611785565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b61058d600033610fc0565b6004805490600061059d836119d1565b9190505550565b60006001600160e01b031982167f2d1a678b0000000000000000000000000000000000000000000000000000000014806105e257506105e282611040565b92915050565b60028054141561063f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002805561064b6110a7565b6001600160a01b03841633146106a35760405162461bcd60e51b815260206004820152601560248201527f4572726f723a20496e76616c69642073656e64657200000000000000000000006044820152606401610636565b8142106106f25760405162461bcd60e51b815260206004820181905260248201527f4572726f723a205369676e617475726520616c726561647920657870697265646044820152606401610636565b6106fb85610d2d565b6107475760405162461bcd60e51b815260206004820152601560248201527f4572726f723a20496e76616c6964205369676e657200000000000000000000006044820152606401610636565b6001600160a01b0384166000908152600360205260409020546107686108d1565b116107b55760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964207465726d20496400000000000000000000000000000000006044820152606401610636565b6107c585858585856103606108d1565b6108115760405162461bcd60e51b815260206004820152601860248201527f4572726f723a20496e76616c6964205369676e617475726500000000000000006044820152606401610636565b6006546040517f70458d850000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff86166024830152909116906370458d8590604401600060405180830381600087803b15801561088957600080fd5b505af115801561089d573d6000803e3d6000fd5b505050506108a96108d1565b6001600160a01b03909416600090815260036020526040902093909355505060016002555050565b600060016004546108e29190611973565b905090565b600080610941846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050846001600160a01b03166109578285610e15565b6001600160a01b03161495945050505050565b610975600033610fc0565b6001600160a01b0381163314156109f45760405162461bcd60e51b815260206004820152602860248201527f5447416363657373436f6e74726f6c3a2063616e6e6f74207265766f6b65206660448201527f726f6d2073656c660000000000000000000000000000000000000000000000006064820152608401610636565b6109fd816110fa565b50565b60008281526001602081905260409091200154610a1c81611105565b610a26838361110f565b505050565b6001600160a01b03811660009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166105e2565b610a76600033610fc0565b6001600160a01b038116610af25760405162461bcd60e51b815260206004820152602c60248201527f5447416363657373436f6e74726f6c3a206163636f756e74206973207468652060448201527f7a65726f206164647265737300000000000000000000000000000000000000006064820152608401610636565b6109fd81611196565b6001600160a01b0381163314610b795760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610636565b610b8382826111a1565b5050565b610b92600033610fc0565b610b9a611224565b565b610ba7600033610fc0565b6005546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b158015610c0c57600080fd5b505af1158015610c20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c449190611765565b6109fd5760405162461bcd60e51b815260206004820152601860248201527f4572726f723a205769746864726177616c204661696c656400000000000000006044820152606401610636565b60408051606087901b6bffffffffffffffffffffffff1916602080830191909152603482018790526054820186905260748083018590528351808403909101815260949092019092528051910120600090610cec8882866108e7565b98975050505050505050565b610d03600033610fc0565b6109fd7f4ca6459022e96ac591406da8141b5e9b21c648122d7f0f94007990d12720bb5582610a00565b6001600160a01b03811660009081527fc9ac8e2c300e2ff6d6950aa5c4c423c7c9045b21a83e478eda920d76fae17800602052604081205460ff166105e2565b6005546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610dca57600080fd5b505afa158015610dde573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e29190611870565b610e0d600033610fc0565b610b9a611276565b600080600080610e2485610e94565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015610e7f573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b60008060008351604114610eea5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610636565b50505060208101516040820151606090920151909260009190911a90565b610f13600033610fc0565b6109fd7f4ca6459022e96ac591406da8141b5e9b21c648122d7f0f94007990d12720bb55826111a1565b610f48600033610fc0565b80610f955760405162461bcd60e51b815260206004820152601260248201527f4572726f723a207465726d696420213d203000000000000000000000000000006044820152606401610636565b600455565b60008281526001602081905260409091200154610fb681611105565b610a2683836111a1565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16610b8357610ffe816001600160a01b031660146112b3565b6110098360206112b3565b60405160200161101a929190611888565b60408051601f198184030181529082905262461bcd60e51b825261063691600401611909565b60006001600160e01b031982167f7965db0b0000000000000000000000000000000000000000000000000000000014806105e257507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146105e2565b60005460ff1615610b9a5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610636565b6109fd6000826111a1565b6109fd8133610fc0565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16610b835760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6109fd60008261110f565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff1615610b835760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61122c6114e1565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b61127e6110a7565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112593390565b606060006112c2836002611954565b6112cd90600261193c565b67ffffffffffffffff8111156112f357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561131d576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061136257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106113bb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006113df846002611954565b6113ea90600161193c565b90505b600181111561148b577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061143957634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061145d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93611484816119ba565b90506113ed565b5083156114da5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610636565b9392505050565b60005460ff16610b9a5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610636565b80356001600160a01b038116811461154a57600080fd5b919050565b600082601f83011261155f578081fd5b813567ffffffffffffffff8082111561157a5761157a611a02565b604051601f8301601f19908116603f011681019082821181831017156115a2576115a2611a02565b816040528381528660208588010111156115ba578485fd5b8360208701602083013792830160200193909352509392505050565b6000602082840312156115e7578081fd5b6114da82611533565b600080600080600060a08688031215611607578081fd5b61161086611533565b945061161e60208701611533565b93506040860135925060608601359150608086013567ffffffffffffffff811115611647578182fd5b6116538882890161154f565b9150509295509295909350565b60008060008060008060c08789031215611678578081fd5b61168187611533565b955061168f60208801611533565b94506040870135935060608701359250608087013567ffffffffffffffff8111156116b8578182fd5b6116c489828a0161154f565b92505060a087013590509295509295509295565b6000806000606084860312156116ec578283fd5b6116f584611533565b925060208401359150604084013567ffffffffffffffff811115611717578182fd5b6117238682870161154f565b9150509250925092565b60008060008060808587031215611742578384fd5b61174b85611533565b966020860135965060408601359560600135945092505050565b600060208284031215611776578081fd5b815180151581146114da578182fd5b600060208284031215611796578081fd5b5035919050565b600080604083850312156117af578182fd5b823591506117bf60208401611533565b90509250929050565b600080604083850312156117da578182fd5b82359150602083013567ffffffffffffffff8111156117f7578182fd5b6118038582860161154f565b9150509250929050565b60006020828403121561181e578081fd5b81356001600160e01b0319811681146114da578182fd5b600060208284031215611846578081fd5b813567ffffffffffffffff81111561185c578182fd5b6118688482850161154f565b949350505050565b600060208284031215611881578081fd5b5051919050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516118c081601785016020880161198a565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516118fd81602884016020880161198a565b01602801949350505050565b602081526000825180602084015261192881604085016020870161198a565b601f01601f19169190910160400192915050565b6000821982111561194f5761194f6119ec565b500190565b600081600019048311821515161561196e5761196e6119ec565b500290565b600082821015611985576119856119ec565b500390565b60005b838110156119a557818101518382015260200161198d565b838111156119b4576000848401525b50505050565b6000816119c9576119c96119ec565b506000190190565b60006000198214156119e5576119e56119ec565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220015d4da52df3ea7699929646e630553dbd4ba02285dbb093aafc934444d19acb64736f6c634300080400330000000000000000000000006d614686550b9e1c1df4b2cd8f91c9d4df66c8100000000000000000000000000d30a2a29fdbd4f1683769cdc3ddb374562adcde
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061020b5760003560e01c806363c724f71161012a578063a217fddf116100bd578063d2d1f5641161008c578063eb66c28911610071578063eb66c289146104b3578063eee2686214610518578063fa5408011461052157600080fd5b8063d2d1f5641461048d578063d547741f146104a057600080fd5b8063a217fddf1461042e578063a7bb580314610436578063ae59105c14610467578063c34b44a01461047a57600080fd5b80638456cb59116100f95780638456cb59146103b357806391d14854146103bb57806397aba7f9146103f4578063a1ebf35d1461040757600080fd5b806363c724f7146103655780637d5c08dd146103785780637df73e271461039857806382b2e257146103ab57600080fd5b806335950fed116101a25780634cf088d9116101715780634cf088d91461030957806350baa622146103345780635c975abb146103475780635cb76c1a1461035257600080fd5b806335950fed146102c857806335bb3e16146102db57806336568abe146102ee5780633f4ba83a1461030157600080fd5b80631a86b550116101de5780631a86b5501461026b578063248a9ca31461027e5780632d345670146102a25780632f2ff15d146102b557600080fd5b806301b476811461021057806301ffc9a71461021a57806308c7750e146102425780630bf3a23714610255575b600080fd5b610218610582565b005b61022d61022836600461180d565b6105a4565b60405190151581526020015b60405180910390f35b6102186102503660046115f0565b6105e8565b61025d6108d1565b604051908152602001610239565b61022d6102793660046116d8565b6108e7565b61025d61028c366004611785565b6000908152600160208190526040909120015490565b6102186102b03660046115d6565b61096a565b6102186102c336600461179d565b610a00565b61022d6102d63660046115d6565b610a2b565b6102186102e93660046115d6565b610a6b565b6102186102fc36600461179d565b610afb565b610218610b87565b60065461031c906001600160a01b031681565b6040516001600160a01b039091168152602001610239565b610218610342366004611785565b610b9c565b60005460ff1661022d565b61022d610360366004611660565b610c90565b6102186103733660046115d6565b610cf8565b61025d6103863660046115d6565b60036020526000908152604090205481565b61022d6103a63660046115d6565b610d2d565b61025d610d6d565b610218610e02565b61022d6103c936600461179d565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b61031c6104023660046117c8565b610e15565b61025d7f4ca6459022e96ac591406da8141b5e9b21c648122d7f0f94007990d12720bb5581565b61025d600081565b610449610444366004611835565b610e94565b60408051938452602084019290925260ff1690820152606001610239565b60055461031c906001600160a01b031681565b6102186104883660046115d6565b610f08565b61021861049b366004611785565b610f3d565b6102186104ae36600461179d565b610f9a565b61025d6104c136600461172d565b6040516bffffffffffffffffffffffff19606086901b166020820152603481018490526054810183905260748101829052600090609401604051602081830303815290604052805190602001209050949350505050565b61025d60045481565b61025d61052f366004611785565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b61058d600033610fc0565b6004805490600061059d836119d1565b9190505550565b60006001600160e01b031982167f2d1a678b0000000000000000000000000000000000000000000000000000000014806105e257506105e282611040565b92915050565b60028054141561063f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002805561064b6110a7565b6001600160a01b03841633146106a35760405162461bcd60e51b815260206004820152601560248201527f4572726f723a20496e76616c69642073656e64657200000000000000000000006044820152606401610636565b8142106106f25760405162461bcd60e51b815260206004820181905260248201527f4572726f723a205369676e617475726520616c726561647920657870697265646044820152606401610636565b6106fb85610d2d565b6107475760405162461bcd60e51b815260206004820152601560248201527f4572726f723a20496e76616c6964205369676e657200000000000000000000006044820152606401610636565b6001600160a01b0384166000908152600360205260409020546107686108d1565b116107b55760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964207465726d20496400000000000000000000000000000000006044820152606401610636565b6107c585858585856103606108d1565b6108115760405162461bcd60e51b815260206004820152601860248201527f4572726f723a20496e76616c6964205369676e617475726500000000000000006044820152606401610636565b6006546040517f70458d850000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff86166024830152909116906370458d8590604401600060405180830381600087803b15801561088957600080fd5b505af115801561089d573d6000803e3d6000fd5b505050506108a96108d1565b6001600160a01b03909416600090815260036020526040902093909355505060016002555050565b600060016004546108e29190611973565b905090565b600080610941846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050846001600160a01b03166109578285610e15565b6001600160a01b03161495945050505050565b610975600033610fc0565b6001600160a01b0381163314156109f45760405162461bcd60e51b815260206004820152602860248201527f5447416363657373436f6e74726f6c3a2063616e6e6f74207265766f6b65206660448201527f726f6d2073656c660000000000000000000000000000000000000000000000006064820152608401610636565b6109fd816110fa565b50565b60008281526001602081905260409091200154610a1c81611105565b610a26838361110f565b505050565b6001600160a01b03811660009081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49602052604081205460ff166105e2565b610a76600033610fc0565b6001600160a01b038116610af25760405162461bcd60e51b815260206004820152602c60248201527f5447416363657373436f6e74726f6c3a206163636f756e74206973207468652060448201527f7a65726f206164647265737300000000000000000000000000000000000000006064820152608401610636565b6109fd81611196565b6001600160a01b0381163314610b795760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610636565b610b8382826111a1565b5050565b610b92600033610fc0565b610b9a611224565b565b610ba7600033610fc0565b6005546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b158015610c0c57600080fd5b505af1158015610c20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c449190611765565b6109fd5760405162461bcd60e51b815260206004820152601860248201527f4572726f723a205769746864726177616c204661696c656400000000000000006044820152606401610636565b60408051606087901b6bffffffffffffffffffffffff1916602080830191909152603482018790526054820186905260748083018590528351808403909101815260949092019092528051910120600090610cec8882866108e7565b98975050505050505050565b610d03600033610fc0565b6109fd7f4ca6459022e96ac591406da8141b5e9b21c648122d7f0f94007990d12720bb5582610a00565b6001600160a01b03811660009081527fc9ac8e2c300e2ff6d6950aa5c4c423c7c9045b21a83e478eda920d76fae17800602052604081205460ff166105e2565b6005546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610dca57600080fd5b505afa158015610dde573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e29190611870565b610e0d600033610fc0565b610b9a611276565b600080600080610e2485610e94565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015610e7f573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b60008060008351604114610eea5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e67746800000000000000006044820152606401610636565b50505060208101516040820151606090920151909260009190911a90565b610f13600033610fc0565b6109fd7f4ca6459022e96ac591406da8141b5e9b21c648122d7f0f94007990d12720bb55826111a1565b610f48600033610fc0565b80610f955760405162461bcd60e51b815260206004820152601260248201527f4572726f723a207465726d696420213d203000000000000000000000000000006044820152606401610636565b600455565b60008281526001602081905260409091200154610fb681611105565b610a2683836111a1565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16610b8357610ffe816001600160a01b031660146112b3565b6110098360206112b3565b60405160200161101a929190611888565b60408051601f198184030181529082905262461bcd60e51b825261063691600401611909565b60006001600160e01b031982167f7965db0b0000000000000000000000000000000000000000000000000000000014806105e257507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146105e2565b60005460ff1615610b9a5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610636565b6109fd6000826111a1565b6109fd8133610fc0565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16610b835760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6109fd60008261110f565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff1615610b835760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61122c6114e1565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b61127e6110a7565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112593390565b606060006112c2836002611954565b6112cd90600261193c565b67ffffffffffffffff8111156112f357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561131d576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061136257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106113bb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006113df846002611954565b6113ea90600161193c565b90505b600181111561148b577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061143957634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061145d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c93611484816119ba565b90506113ed565b5083156114da5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610636565b9392505050565b60005460ff16610b9a5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610636565b80356001600160a01b038116811461154a57600080fd5b919050565b600082601f83011261155f578081fd5b813567ffffffffffffffff8082111561157a5761157a611a02565b604051601f8301601f19908116603f011681019082821181831017156115a2576115a2611a02565b816040528381528660208588010111156115ba578485fd5b8360208701602083013792830160200193909352509392505050565b6000602082840312156115e7578081fd5b6114da82611533565b600080600080600060a08688031215611607578081fd5b61161086611533565b945061161e60208701611533565b93506040860135925060608601359150608086013567ffffffffffffffff811115611647578182fd5b6116538882890161154f565b9150509295509295909350565b60008060008060008060c08789031215611678578081fd5b61168187611533565b955061168f60208801611533565b94506040870135935060608701359250608087013567ffffffffffffffff8111156116b8578182fd5b6116c489828a0161154f565b92505060a087013590509295509295509295565b6000806000606084860312156116ec578283fd5b6116f584611533565b925060208401359150604084013567ffffffffffffffff811115611717578182fd5b6117238682870161154f565b9150509250925092565b60008060008060808587031215611742578384fd5b61174b85611533565b966020860135965060408601359560600135945092505050565b600060208284031215611776578081fd5b815180151581146114da578182fd5b600060208284031215611796578081fd5b5035919050565b600080604083850312156117af578182fd5b823591506117bf60208401611533565b90509250929050565b600080604083850312156117da578182fd5b82359150602083013567ffffffffffffffff8111156117f7578182fd5b6118038582860161154f565b9150509250929050565b60006020828403121561181e578081fd5b81356001600160e01b0319811681146114da578182fd5b600060208284031215611846578081fd5b813567ffffffffffffffff81111561185c578182fd5b6118688482850161154f565b949350505050565b600060208284031215611881578081fd5b5051919050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516118c081601785016020880161198a565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516118fd81602884016020880161198a565b01602801949350505050565b602081526000825180602084015261192881604085016020870161198a565b601f01601f19169190910160400192915050565b6000821982111561194f5761194f6119ec565b500190565b600081600019048311821515161561196e5761196e6119ec565b500290565b600082821015611985576119856119ec565b500390565b60005b838110156119a557818101518382015260200161198d565b838111156119b4576000848401525b50505050565b6000816119c9576119c96119ec565b506000190190565b60006000198214156119e5576119e56119ec565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220015d4da52df3ea7699929646e630553dbd4ba02285dbb093aafc934444d19acb64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006d614686550b9e1c1df4b2cd8f91c9d4df66c8100000000000000000000000000d30a2a29fdbd4f1683769cdc3ddb374562adcde
-----Decoded View---------------
Arg [0] : _skebcoin (address): 0x6D614686550B9E1c1DF4b2cD8f91C9D4df66C810
Arg [1] : _staking (address): 0x0d30A2A29FdbD4F1683769cDC3DDB374562aDcDe
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000006d614686550b9e1c1df4b2cd8f91c9d4df66c810
Arg [1] : 0000000000000000000000000d30a2a29fdbd4f1683769cdc3ddb374562adcde
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000536 | 77,857.49 | $41.71 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.