Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
5497311 | 4 hrs ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Locker
Compiler Version
v0.8.20+commit.a1b79de6
ZkSolc Version
v1.5.11
Optimization Enabled:
Yes with Mode 3
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity =0.8.20; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC1155} from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; /** * @title Locker * @dev A contract for locking up ERC20 and ERC1155 tokens for a specified period of time. */ contract Locker { using SafeERC20 for IERC20; error LockUp__InvalidParams(string param); error LockUp__PermissionDenied(); error LockUp__AlreadyClaimed(); error LockUp__NotYetUnlocked(); error LockUp__InvalidPaginationParameters(); event LockedUp(uint256 indexed lockUpId, address indexed token, bool isERC20, address indexed receiver, uint256 amount, uint40 unlockTime); event Unlocked(uint256 indexed lockUpId, address indexed token, bool isERC20, address indexed receiver, uint256 amount); struct LockUp { address token; bool isERC20; uint40 unlockTime; bool unlocked; // 160 + 8 + 40 + 8 = 216 bits uint256 amount; address receiver; string title; } LockUp[] public lockUps; modifier onlyReceiver(uint256 lockUpId) { if (msg.sender != lockUps[lockUpId].receiver) revert LockUp__PermissionDenied(); _; } /** * @dev Creates a new lock-up. * @param token The address of the token being locked up. * @param isERC20 A boolean indicating whether the token is an ERC20 token. * @param amount The amount of tokens being locked up. * @param unlockTime The timestamp when the tokens can be unlocked. * @param receiver The address of the receiver of the locked tokens. * @param title The optional title of the lock-up. */ function createLockUp(address token, bool isERC20, uint256 amount, uint40 unlockTime, address receiver, string calldata title) external { // Parameter validations if (token == address(0)) revert LockUp__InvalidParams('token'); if (amount == 0) revert LockUp__InvalidParams('amount'); if (unlockTime <= block.timestamp) revert LockUp__InvalidParams('unlockTime'); if (receiver == address(0)) revert LockUp__InvalidParams('receiver'); // Create a new lockUp lockUps.push(); LockUp storage lockUp = lockUps[lockUps.length - 1]; lockUp.token = token; lockUp.isERC20 = isERC20; lockUp.unlockTime = unlockTime; // lockUp.unlocked = false; lockUp.amount = amount; lockUp.receiver = receiver; lockUp.title = title; // Deposit total amount of tokens to this contract if (isERC20) { IERC20(token).safeTransferFrom(msg.sender, address(this), amount); } else { // Only support an ERC1155 token at id = 0 IERC1155(token).safeTransferFrom(msg.sender, address(this), 0, amount, ""); } emit LockedUp(lockUps.length - 1, token, isERC20, receiver, amount, unlockTime); } /** * @dev Unlocks the tokens of a lock-up. * @param lockUpId The ID of the lock-up. */ function unlock(uint256 lockUpId) external onlyReceiver(lockUpId) { LockUp storage lockUp = lockUps[lockUpId]; if (lockUp.unlocked) revert LockUp__AlreadyClaimed(); if (lockUp.unlockTime > block.timestamp) revert LockUp__NotYetUnlocked(); lockUp.unlocked = true; if (lockUp.isERC20) { IERC20(lockUp.token).safeTransfer(lockUp.receiver, lockUp.amount); } else { IERC1155(lockUp.token).safeTransferFrom(address(this), lockUp.receiver, 0, lockUp.amount, ""); } emit Unlocked(lockUpId, lockUp.token, lockUp.isERC20, lockUp.receiver, lockUp.amount); } // MARK: - Utility functions /** * @dev Returns the length of lockUps array. * @return The number of lock-ups. */ function lockUpCount() external view returns (uint256) { return lockUps.length; } /** * @dev Returns an array of lock-up IDs for a given token address within a specified range. * @param token The address of the token. * @param start The starting index of the range. * @param stop The ending index of the range. * @return ids An array of lock-up IDs. */ function getLockUpIdsByToken(address token, uint256 start, uint256 stop) external view returns (uint256[] memory ids) { if (start >= stop || stop - start > 10000) revert LockUp__InvalidPaginationParameters(); unchecked { uint256 lockUpsLength = lockUps.length; if (stop > lockUpsLength) { stop = lockUpsLength; } uint256 count; for (uint256 i = start; i < stop; ++i) { if (lockUps[i].token == token) ++count; } ids = new uint256[](count); uint256 j; for (uint256 i = start; i < stop; ++i) { if (lockUps[i].token == token) { ids[j++] = i; if (j == count) break; } } } } /** * @dev Returns an array of lock-up IDs for a given receiver address within a specified range. * @param receiver The address of the receiver. * @param start The starting index of the range. * @param stop The ending index of the range. * @return ids An array of lock-up IDs. */ function getLockUpIdsByReceiver(address receiver, uint256 start, uint256 stop) external view returns (uint256[] memory ids) { if (start >= stop || stop - start > 10000) revert LockUp__InvalidPaginationParameters(); unchecked { uint256 lockUpsLength = lockUps.length; if (stop > lockUpsLength) { stop = lockUpsLength; } uint256 count; for (uint256 i = start; i < stop; ++i) { if (lockUps[i].receiver == receiver) ++count; } ids = new uint256[](count); uint256 j; for (uint256 i = start; i < stop; ++i) { if (lockUps[i].receiver == receiver) { ids[j++] = i; if (j == count) break; } } } } // MARK: - ERC1155 Receiver function onERC1155Received(address, address, uint256, uint256, bytes memory) external pure returns (bytes4) { return this.onERC1155Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC20Permit} from "../extensions/IERC20Permit.sol"; import {Address} from "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.20; import {IERC165} from "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` amount of tokens of type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the value of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] calldata accounts, uint256[] calldata ids ) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers a `value` amount of tokens of type `id` from `from` to `to`. * * WARNING: This function can potentially allow a reentrancy attack when transferring tokens * to an untrusted contract, when invoking {onERC1155Received} on the receiver. * Ensure to follow the checks-effects-interactions pattern and consider employing * reentrancy guards when interacting with untrusted contracts. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `value` amount. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * WARNING: This function can potentially allow a reentrancy attack when transferring tokens * to an untrusted contract, when invoking {onERC1155BatchReceived} on the receiver. * Ensure to follow the checks-effects-interactions pattern and consider employing * reentrancy guards when interacting with untrusted contracts. * * Emits either a {TransferSingle} or a {TransferBatch} event, depending on the length of the array arguments. * * Requirements: * * - `ids` and `values` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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); }
{ "evmVersion": "paris", "optimizer": { "enabled": true, "mode": "3" }, "outputSelection": { "*": { "*": [ "abi" ] } }, "detectMissingLibraries": false, "forceEVMLA": false, "enableEraVMExtensions": false, "libraries": {} }
[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"LockUp__AlreadyClaimed","type":"error"},{"inputs":[],"name":"LockUp__InvalidPaginationParameters","type":"error"},{"inputs":[{"internalType":"string","name":"param","type":"string"}],"name":"LockUp__InvalidParams","type":"error"},{"inputs":[],"name":"LockUp__NotYetUnlocked","type":"error"},{"inputs":[],"name":"LockUp__PermissionDenied","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lockUpId","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"isERC20","type":"bool"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint40","name":"unlockTime","type":"uint40"}],"name":"LockedUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lockUpId","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"isERC20","type":"bool"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unlocked","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"isERC20","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint40","name":"unlockTime","type":"uint40"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"string","name":"title","type":"string"}],"name":"createLockUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"getLockUpIdsByReceiver","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"getLockUpIdsByToken","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockUpCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockUps","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"isERC20","type":"bool"},{"internalType":"uint40","name":"unlockTime","type":"uint40"},{"internalType":"bool","name":"unlocked","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"string","name":"title","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockUpId","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
9c4d535b0000000000000000000000000000000000000000000000000000000000000000010001814b780e3084db30991444dff0c290874ebe340a88be8982b45f7861ac00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x0001000000000002000700000000000200000000000103550000008003000039000000400030043f00000001002001900000004a0000c13d00000060021002700000013803200197000000040030008c000001510000413d000000000231034f000000000401043b000000e0044002700000013a0040009c000000520000a13d0000013b0040009c0000008c0000213d0000013e0040009c000000d90000613d0000013f0040009c000001510000c13d000000240030008c000001510000413d0000000002000416000000000002004b000001510000c13d0000000401100370000000000301043b000000000100041a000000000031004b000001950000a13d000000000000043f00000002053002100000014a0450009a000000000104041a00000143011001970000000002000411000000000012004b0000019f0000c13d000001480150009a000000000201041a0000014d00200198000001cc0000c13d000400000005001d000700000002001d000500000001001d000600000004001d000300000003001d0000014f0100004100000000001004430000000001000414000001380010009c0000013801008041000000c00110021000000150011001c70000800b0200003904dd04d80000040f0000000100200190000003e00000613d000000000101043b0000000705000029000000a8025002700000015102200197000000000012004b0000021d0000a13d000000400100043d0000015e020000410000000000210435000001380010009c000001380100804100000040011002100000015f011001c7000004df000104300000000001000416000000000001004b000001510000c13d0000002001000039000001000010044300000120000004430000013901000041000004de0001042e000001400040009c000000e00000613d000001410040009c0000012b0000613d000001420040009c000001510000c13d000000c40030008c000001510000413d0000000002000416000000000002004b000001510000c13d0000000402100370000000000502043b000001430050009c000001510000213d0000002402100370000000000202043b000000000002004b0000000004000039000000010400c039000000000042004b000001510000c13d0000006402100370000000000202043b000001510020009c000001510000213d0000008402100370000000000602043b000001430060009c000001510000213d000000a402100370000000000202043b000001440020009c000001510000213d0000002304200039000000000034004b000001510000813d0000000404200039000000000441034f000000000404043b000001440040009c000001510000213d00000000024200190000002402200039000000000032004b000001510000213d000000000005004b000002aa0000c13d0000016201000041000000800010043f0000002001000039000000840010043f0000000501000039000000a40010043f0000017301000041000000c40010043f0000017201000041000004df000104300000013c0040009c000001480000613d0000013d0040009c000001510000c13d000000a40030008c000001510000413d0000000002000416000000000002004b000001510000c13d0000000402100370000000000202043b000001430020009c000001510000213d0000002402100370000000000202043b000001430020009c000001510000213d0000008402100370000000000402043b000001440040009c000001510000213d0000002302400039000000000032004b000001510000813d0000000405400039000000000251034f000000000202043b000001440020009c000001b50000213d0000001f0720003900000176077001970000003f077000390000017607700197000001450070009c000001b50000213d0000008007700039000000400070043f000000800020043f00000000042400190000002404400039000000000034004b000001510000213d0000002003500039000000000331034f00000176042001980000001f0520018f000000a001400039000000c20000613d000000a006000039000000000703034f000000007807043c0000000006860436000000000016004b000000be0000c13d000000000005004b000000cf0000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000a00120003900000000000104350000014601000041000000400200043d0000000000120435000001380020009c0000013802008041000000400120021000000147011001c7000004de0001042e0000000001000416000000000001004b000001510000c13d000000000100041a000000800010043f0000016001000041000004de0001042e000000640030008c000001510000413d0000000003000416000000000003004b000001510000c13d0000000403100370000000000303043b000001430030009c000001510000213d0000002404100370000000000404043b0000004401100370000000000101043b000000000541004b0000019b0000a13d000027110050008c0000019b0000813d000000000500041a000000000051004b0000000001058019000000000014004b000001bb0000813d0000000006040019000000000500001900000002076002100000014a0770009a000000000707041a000000000737013f000001430070019800000001055060390000000106600039000000000016004b000000f80000413d000001750050009c000001b50000813d00000005075002100000003f067000390000014906600197000001450060009c000001b50000213d0000008006600039000000400060043f000000800050043f0000001f0670018f000000000007004b000001140000613d000000a007700039000000a008000039000000002902043c0000000008980436000000000078004b000001100000c13d000000000006004b00000000020000190000011a0000013d0000000104400039000000000014004b000001be0000813d000000000000043f00000002064002100000014a0660009a000000000606041a000000000636013f0000014300600198000001170000c13d000000800600043d000000000026004b000001950000a13d0000000506200210000000a00660003900000000004604350000000102200039000000000052004b000001170000c13d000001be0000013d000000240030008c000001510000413d0000000002000416000000000002004b000001510000c13d0000000401100370000000000101043b000000000200041a000000000021004b000001510000813d000000000000043f0000000204100210000001680140009a000000000901041a000000010390019000000001089002700000007f0280018f00000000080260190000001f0080008c00000000050000390000000105002039000000000053004b000001a30000613d0000016e01000041000000000010043f0000002201000039000000040010043f0000016f01000041000004df00010430000000640030008c000001510000413d0000000003000416000000000003004b000001510000c13d0000000403100370000000000303043b000001430030009c000001530000a13d0000000001000019000004df000104300000002404100370000000000404043b0000004401100370000000000101043b000000000541004b0000019b0000a13d000027100050008c0000019b0000213d000000000500041a000000000051004b0000000001058019000000000014004b000001bb0000813d000000000604001900000000050000190000000207600210000001480770009a000000000707041a000000000737013f000001430070019800000001055060390000000106600039000000000016004b000001620000413d000001440050009c000001b50000213d00000005075002100000003f067000390000014906600197000001450060009c000001b50000213d0000008006600039000000400060043f000000800050043f0000001f0670018f000000000007004b0000017e0000613d000000a007700039000000a008000039000000002902043c0000000008980436000000000078004b0000017a0000c13d000000000006004b0000000002000019000001840000013d0000000104400039000000000014004b000001be0000813d000000000000043f0000000206400210000001480660009a000000000606041a000000000636013f0000014300600198000001810000c13d000000800600043d000000000026004b000001950000a13d0000000506200210000000a00660003900000000004604350000000102200039000000000052004b000001810000c13d000001be0000013d0000016e01000041000000000010043f0000003201000039000000040010043f0000016f01000041000004df000104300000017401000041000000800010043f0000014c01000041000004df000104300000014b01000041000000800010043f0000014c01000041000004df00010430000001540540009a000000000705041a000001480540009a000000000605041a0000014a0440009a000000000404041a000000800080043f000000000003004b000001d00000c13d0000017701900197000000a00010043f000000000002004b000000c001000039000000a001006039000000610110008a0000017602100197000001450020009c000001e80000a13d0000016e01000041000000000010043f0000004101000039000000040010043f0000016f01000041000004df00010430000000a001000039000000400010043f000000800000043f000000400100043d000700000001001d000000800200003904dd04320000040f00000007020000290000000001210049000001380010009c00000138010080410000006001100210000001380020009c00000138020080410000004002200210000000000121019f000004de0001042e0000014e01000041000000800010043f0000014c01000041000004df00010430000700000009001d000300000008001d000400000004001d000500000007001d000600000006001d000000000010043f0000000001000414000001380010009c0000013801008041000000c00110021000000169011001c7000080100200003904dd04d80000040f0000000100200190000001510000613d0000000702000029000000020020008c000002670000813d0000002002000039000000a001000039000000060600002900000005070000290000000404000029000001e90000013d00000080012000390000014303400197000000400010043f000001430460019700000000004104350000014004200039000000e005000039000000000054043500000120042000390000000000340435000001000320003900000000007304350000014d006001980000000003000039000000010300c039000000e0042000390000000000340435000000a8036002700000015103300197000000c004200039000000000034043500000155006001980000000003000039000000010300c039000000a00420003900000000003404350000016004200039000000800300043d00000000003404350000018002200039000000000003004b000002100000613d00000000040000190000000005240019000000a006400039000000000606043300000000006504350000002004400039000000000034004b000002090000413d0000001f043000390000017604400197000000000223001900000000000204350000010002400039000001380020009c00000138020080410000006002200210000001380010009c00000138010080410000004001100210000000000112019f000004de0001042e000001520150019700000153011001c70000000502000029000000000012041b0000000401000029000001540410009a000000000704041a0000000601000029000000000101041a00000143061001970000015500500198000002770000c13d000100000007001d000200000006001d000400000004001d000001570100004100000000001004430000014301500197000700000001001d00000004001004430000000001000414000001380010009c0000013801008041000000c00110021000000158011001c7000080020200003904dd04d80000040f0000000100200190000003e00000613d000000000101043b000000000001004b000001510000613d000000400300043d0000008401300039000000a0020000390000000000210435000000640130003900000001020000290000000000210435000000240130003900000002020000290000000000210435000001590100004100000000001304350000000001000410000001430110019700000004023000390000000000120435000000a401300039000000000001043500000044013000390000000000010435000001380030009c000200000003001d0000013801000041000000000103401900010040001002180000000001000414000001380010009c0000013801008041000000c00110021000000001011001af0000015a011001c7000000070200002904dd04d30000040f0000000100200190000002ba0000613d0000000201000029000001440010009c000001b50000213d0000000205000029000000400050043f00000001060000290000028d0000013d000000000101043b00000000030000190000000606000029000000050700002900000003050000290000000002030019000000000301041a000000a004200039000000000034043500000001011000390000002003200039000000000053004b0000026c0000413d000000c0012000390000000404000029000001b10000013d000000400200043d000000200120003900000156030000410000000000310435000000440120003900000000007104350000002401200039000000000061043500000044010000390000000000120435000001450020009c000001b50000213d000400000004001d0000008001200039000000400010043f000001430150019704dd04410000040f000000400500043d000001380050009c0000013801000041000000000105401900000040061002100000000601000029000000000101041a0000000402000029000000000202041a0000000503000029000000000303041a00000155003001980000000004000039000000010400c0390000000000450435000000200450003900000000002404350000000002000414000001380020009c0000013802008041000000c002200210000000000226019f000001430630019700000143071001970000015c012001c70000800d0200003900000004030000390000015d04000041000000030500002904dd04d30000040f0000000100200190000001510000613d0000000001000019000004de0001042e000700000006001d000600000005001d0000004401100370000000000101043b000000000001004b000002da0000c13d0000016201000041000000800010043f0000002001000039000000840010043f0000000601000039000000a40010043f0000017101000041000000c40010043f0000017201000041000004df0001043000000060061002700000001f0460018f0000015b05600198000000400200043d0000000003520019000002c60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b000002c20000c13d0000013806600197000000000004004b000002d40000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000006001600210000001380020009c00000138020080410000004002200210000000000112019f000004df000104300000014f0100004100000000001004430000000001000414000001380010009c0000013801008041000000c00110021000000150011001c70000800b0200003904dd04d80000040f0000000100200190000003e00000613d000000000201043b00000000030003670000006401300370000000000101043b0000015104100197000000000024004b000002f50000a13d000000070000006b000003060000c13d000000400100043d00000044021000390000017003000041000000000032043500000024021000390000000803000039000002fb0000013d000000400100043d00000044021000390000016103000041000000000032043500000024021000390000000a03000039000000000032043500000162020000410000000000210435000000040210003900000020030000390000000000320435000001380010009c0000013801008041000000400110021000000163011001c7000004df00010430000000000200041a000001440020009c000001b50000213d0000000104200039000000000040041b000000000000043f000000a80110021000000164011001970000000202200210000001480420009a000000000504041a0000016505500197000000000151019f0000002405300370000000000505043b000000000005004b00000166050000410000000005006019000000000151019f00000006011001af000000000014041b0000004401300370000000000101043b000001540420009a000000000014041b0000014a0120009a000000000401041a000001670440019700000007044001af000000000041041b000001680120009a000500000001001d000000000101041a000000010010019000000001021002700000007f0220618f000400000002001d0000001f0020008c00000000020000390000000102002039000000000121013f0000000100100190000001420000c13d00000004010000290000001f0010008c000003570000a13d0000000501000029000000000010043f0000000001000414000001380010009c0000013801008041000000c00110021000000169011001c7000080100200003904dd04d80000040f0000000100200190000001510000613d0000000003000367000000a402300370000000000202043b0000000404200039000000000443034f000000000604043b0000001f04600039000000050440027000000004050000290000001f05500039000400000006001d000000200060008c00000000040040190000000505500270000000000601043b00000000016400190000000004560019000000000041004b0000035d0000813d000000000001041b0000000101100039000000000041004b000003520000413d0000035d0000013d000000a401300370000000000201043b0000000401200039000000000113034f000000000101043b000400000001001d00000004010000290000001f0010008c000003740000a13d0000000501000029000000000010043f0000000001000414000001380010009c0000013801008041000000c00110021000000169011001c7000080100200003904dd04d80000040f0000000100200190000001510000613d000000200200008a0000000404200180000000000101043b0000000003000367000000a402300370000000000202043b000003820000c13d00000000050000190000038c0000013d000000040000006b00000000010000190000037a0000613d0000002401200039000000000113034f000000000101043b00000004050000290000000302500210000001780220027f0000017802200167000000000121016f0000000102500210000000000121019f0000039d0000013d000000240620003900000000050000190000000007560019000000000773034f000000000707043b000000000071041b00000001011000390000002005500039000000000045004b000003840000413d0000000406200039000000000663034f000000000606043b000000000064004b0000039b0000813d0000000304600210000000f80440018f000001780440027f000001780440016700000000025200190000002402200039000000000223034f000000000202043b000000000242016f000000000021041b000000010160021000000001011001bf0000000502000029000000000012041b0000002401300370000000000101043b000000000001004b000003e10000c13d00000157010000410000000000100443000000060100002900000004001004430000000001000414000001380010009c0000013801008041000000c00110021000000158011001c7000080020200003904dd04d80000040f0000000100200190000003e00000613d000000000101043b000000000001004b0000000604000029000001510000613d000000400500043d0000015901000041000000000015043500000044010000390000000001100367000000000101043b0000008402500039000000a00300003900000000003204350000006402500039000000000012043500000000010004100000014301100197000000240250003900000000001204350000000001000411000001430110019700000004025000390000000000120435000000a401500039000000000001043500000044015000390000000000010435000001380050009c000500000005001d0000013801000041000000000105401900000040011002100000000002000414000001380020009c0000013802008041000000c002200210000000000112019f00000143024001970000015a011001c704dd04d30000040f0000000100200190000004250000613d0000000501000029000001440010009c000001b50000213d0000000501000029000000400010043f000003f70000013d000000000001042f000000400200043d00000020012000390000016a0400004100000000004104350000004401200039000000000400041000000000004104350000002401200039000000000400041100000000004104350000004401300370000000000101043b00000064032000390000000000130435000000640100003900000000001204350000016b0020009c000001b50000213d000000a001200039000000400010043f000000060100002904dd04410000040f000000000100041a000000000001004b000004000000c13d0000016e01000041000000000010043f0000001101000039000000040010043f0000016f01000041000004df0001043000000000020003670000002403200370000000000303043b000000000003004b0000000003000039000000010300c039000000400400043d00000000033404360000004405200370000000000505043b00000000005304350000006402200370000000000202043b000001510220019700000040034000390000000000230435000001380040009c000001380400804100000040024002100000000003000414000001380030009c0000013803008041000000c003300210000000000223019f000000010510008a00000006010000290000014306100197000000070100002900000143071001970000016c012001c70000800d0200003900000004030000390000016d0400004104dd04d30000040f0000000100200190000001510000613d000002a80000013d00000060061002700000001f0460018f0000015b05600198000000400200043d0000000003520019000002c60000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000038004b0000042d0000c13d000002c60000013d00000020030000390000000004310436000000000302043300000000003404350000004001100039000000000003004b000004400000613d00000000040000190000002002200039000000000502043300000000015104360000000104400039000000000034004b0000043a0000413d000000000001042d00030000000000020000002003200039000001380030009c000001380300804100000040033002100000000002020433000001380020009c00000138020080410000006002200210000000000232019f0000000003000414000001380030009c0000013803008041000000c003300210000000000332019f00000143021001970000000001030019000300000002001d04dd04d30000040f000000600310027000000138033001980000047e0000613d0000001f0430003900000179044001970000003f044000390000017a04400197000000400a00043d00000000044a00190000000000a4004b00000000050000390000000105004039000001440040009c000004b80000213d0000000100500190000004b80000c13d000000400040043f0000001f0430018f00000000093a04360000015b053001980000000003590019000004700000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000037004b0000046c0000c13d000000000004004b000004800000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000004800000013d000000600a000039000000800900003900000000010a04330000000100200190000004ab0000613d000000000001004b0000049c0000c13d00020000000a001d000100000009001d00000157010000410000000000100443000000030100002900000004001004430000000001000414000001380010009c0000013801008041000000c00110021000000158011001c7000080020200003904dd04d80000040f0000000100200190000004c60000613d000000000101043b000000000001004b0000000201000029000004c70000613d0000000001010433000000000001004b0000000109000029000004a80000613d0000017c0010009c000004a90000213d000000200010008c000004a90000413d0000000001090433000000000001004b0000000002000039000000010200c039000000000021004b000004a90000c13d000000000001004b000004b50000613d000000000001042d0000000001000019000004df00010430000000000001004b000004be0000c13d000000400100043d0000017b020000410000000000210435000001380010009c000001380100804100000040011002100000015f011001c7000004df00010430000000400100043d0000017d02000041000004c90000013d0000016e01000041000000000010043f0000004101000039000000040010043f0000016f01000041000004df00010430000001380090009c00000138090080410000004002900210000001380010009c00000138010080410000006001100210000000000121019f000004df00010430000000000001042f000000400100043d0000017e020000410000000000210435000000040210003900000003030000290000000000320435000001380010009c000001380100804100000040011002100000016f011001c7000004df00010430000000000001042f000004d6002104210000000102000039000000000001042d0000000002000019000000000001042d000004db002104230000000102000039000000000001042d0000000002000019000000000001042d000004dd00000432000004de0001042e000004df0001043000000000000000000000000000000000000000000000000000000000ffffffff0000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000001ef24a9400000000000000000000000000000000000000000000000000000000d840d8a700000000000000000000000000000000000000000000000000000000d840d8a800000000000000000000000000000000000000000000000000000000f23a6e61000000000000000000000000000000000000000000000000000000001ef24a95000000000000000000000000000000000000000000000000000000006198e33900000000000000000000000000000000000000000000000000000000036feee80000000000000000000000000000000000000000000000000000000012fcdb52000000000000000000000000000000000000000000000000000000001a8cef3e000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffff7ff23a6e61000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000d6f21326ab749d5729fcba5677c79037b459436ab7bff709c9d06ce9f10c1a9d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0d6f21326ab749d5729fcba5677c79037b459436ab7bff709c9d06ce9f10c1a9bcbd5b3220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000008000000000000000000000000000ff00000000000000000000000000000000000000000000000000007f6c466700000000000000000000000000000000000000000000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000010000000000000000000000000000000000000000000000000000d6f21326ab749d5729fcba5677c79037b459436ab7bff709c9d06ce9f10c1a9c0000000000000000000000ff0000000000000000000000000000000000000000a9059cbb000000000000000000000000000000000000000000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b830200000200000000000000000000000000000024000000000000000000000000f242432a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe002000000000000000000000000000000000000400000000000000000000000005a26b333488226707354f0b3ade5e1d4bfccb7c73adbe0b993b1f5839ede7e4daa6483440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000800000000000000000756e6c6f636b54696d6500000000000000000000000000000000000000000000249ef755000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000ffffffffff000000000000000000000000000000000000000000ffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000d6f21326ab749d5729fcba5677c79037b459436ab7bff709c9d06ce9f10c1a9a020000000000000000000000000000000000002000000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff5f0200000000000000000000000000000000000060000000000000000000000000cdff04b70b8b30e7d2243ff87e502ec2218b580b9a2329b9ee17af80e2dde9c44e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000007265636569766572000000000000000000000000000000000000000000000000616d6f756e7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000800000000000000000746f6b656e0000000000000000000000000000000000000000000000000000004bdc5d14000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000003ffffffe01425ea42000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5274afe7000000000000000000000000000000000000000000000000000000009996b3150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ad231364cd11fa561f08f76396194ac733049221e1da1d3fa077082b8a419e6
Loading...
Loading
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.