More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Latest 25 from a total of 153,589 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 18047317 | 32 mins ago | IN | 0 ETH | 0.00000009 | ||||
Claim | 18047273 | 33 mins ago | IN | 0 ETH | 0.0000001 | ||||
Claim | 18046546 | 58 mins ago | IN | 0 ETH | 0.00000001 | ||||
Claim | 18046481 | 1 hr ago | IN | 0 ETH | 0.0000001 | ||||
Claim | 18046473 | 1 hr ago | IN | 0 ETH | 0.0000001 | ||||
Claim | 18046472 | 1 hr ago | IN | 0 ETH | 0.00000001 | ||||
Claim | 18046428 | 1 hr ago | IN | 0 ETH | 0.00000001 | ||||
Claim | 18045927 | 1 hr ago | IN | 0 ETH | 0.00000044 | ||||
Claim | 18045920 | 1 hr ago | IN | 0 ETH | 0.00000044 | ||||
Claim | 18045864 | 1 hr ago | IN | 0 ETH | 0.00000001 | ||||
Claim | 18045771 | 1 hr ago | IN | 0 ETH | 0.00000001 | ||||
Claim | 18045589 | 1 hr ago | IN | 0 ETH | 0.00000001 | ||||
Claim | 18044566 | 2 hrs ago | IN | 0 ETH | 0.0000001 | ||||
Claim | 18044507 | 2 hrs ago | IN | 0 ETH | 0.00000009 | ||||
Claim | 18044412 | 2 hrs ago | IN | 0 ETH | 0 | ||||
Unpause | 18044369 | 2 hrs ago | IN | 0 ETH | 0.00000002 | ||||
Update Can Claim... | 18044367 | 2 hrs ago | IN | 0 ETH | 0.00000003 | ||||
Update Protocol ... | 18044365 | 2 hrs ago | IN | 0 ETH | 0.00000006 | ||||
Pause | 18044293 | 2 hrs ago | IN | 0 ETH | 0.00000005 | ||||
Claim | 18044217 | 2 hrs ago | IN | 0 ETH | 0 | ||||
Claim | 18041999 | 3 hrs ago | IN | 0 ETH | 0.00000002 | ||||
Claim | 18035783 | 6 hrs ago | IN | 0 ETH | 0.00000007 | ||||
Claim | 18035315 | 7 hrs ago | IN | 0 ETH | 0.00000007 | ||||
Claim | 18034638 | 7 hrs ago | IN | 0 ETH | 0.00000008 | ||||
Claim | 18033646 | 8 hrs ago | IN | 0 ETH | 0.0000001 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18047317 | 32 mins ago | 0.00334296 ETH | ||||
18047273 | 33 mins ago | 0.00002552 ETH | ||||
18046546 | 58 mins ago | 0.00000773 ETH | ||||
18046481 | 1 hr ago | 0.02732645 ETH | ||||
18046473 | 1 hr ago | 0.14862166 ETH | ||||
18046472 | 1 hr ago | 0.00001687 ETH | ||||
18046428 | 1 hr ago | 0.01254013 ETH | ||||
18045927 | 1 hr ago | 0.00916105 ETH | ||||
18045920 | 1 hr ago | 0.00187882 ETH | ||||
18045864 | 1 hr ago | 0.00316939 ETH | ||||
18045771 | 1 hr ago | 0.00090275 ETH | ||||
18045589 | 1 hr ago | 0.00133088 ETH | ||||
18044566 | 2 hrs ago | 0.00003951 ETH | ||||
18044507 | 2 hrs ago | 0.00641744 ETH | ||||
18044412 | 2 hrs ago | 0.00282088 ETH | ||||
18044217 | 2 hrs ago | 0.00022394 ETH | ||||
18041999 | 3 hrs ago | 0.00029638 ETH | ||||
18035783 | 6 hrs ago | 0.00006143 ETH | ||||
18035315 | 7 hrs ago | 0.00098647 ETH | ||||
18034638 | 7 hrs ago | 0.00000597 ETH | ||||
18033646 | 8 hrs ago | 0.00237591 ETH | ||||
18032695 | 8 hrs ago | 0.00503232 ETH | ||||
18032631 | 8 hrs ago | 0.00844329 ETH | ||||
18031050 | 9 hrs ago | 0.00071296 ETH | ||||
18028181 | 11 hrs ago | 0.00077731 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ProtocolFeesDistributor
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes with 888888 runs
Other Settings:
london EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.23; import {LowLevelWETH} from "@looksrare/contracts-libs/contracts/lowLevelCallers/LowLevelWETH.sol"; import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; import {Pausable} from "@looksrare/contracts-libs/contracts/Pausable.sol"; import {ReentrancyGuard} from "@looksrare/contracts-libs/contracts/ReentrancyGuard.sol"; import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import {IBlast, GasMode, YieldMode} from "./interfaces/IBlast.sol"; import {IBlastPoints} from "./interfaces/IBlastPoints.sol"; /** * @title ProtocolFeesDistributor * @notice It distributes protocol fees with rolling Merkle airdrops. * @author YOLO Games Team */ contract ProtocolFeesDistributor is Pausable, ReentrancyGuard, AccessControl, LowLevelWETH { bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); address private immutable WETH; // Current round (users can only claim pending protocol fees for the current round) uint256 public currentRound; // Users can claim until this timestamp uint256 public canClaimUntil; // Max amount per user in current tree uint256 public maximumAmountPerUserInCurrentTree; // Total amount claimed by user (in ETH) mapping(address => uint256) public amountClaimedByUser; // Merkle root for a round mapping(uint256 => bytes32) public merkleRootOfRound; // Keeps track on whether user has claimed at a given round mapping(uint256 => mapping(address => bool)) public hasUserClaimedForRound; event ProtocolFeesClaimed(address indexed user, uint256 indexed round, uint256 amount); event ProtocolFeesDistributionUpdated(uint256 indexed round); event EthWithdrawn(uint256 amount); event CanClaimUntilUpdated(uint256 timestamp); error AlreadyClaimed(); error AmountHigherThanMax(); error ClaimPeriodEnded(); error InvalidProof(); /** * @notice Constructor * @param _weth address of the WETH token * @param _owner address of the owner * @param _operator address of the operator * @param _blast address of the BLAST precompile * @param _blastPoints The Blast points configuration. * @param _blastPointsOperator The Blast points operator. */ constructor( address _weth, address _owner, address _operator, address _blast, address _blastPoints, address _blastPointsOperator ) { WETH = _weth; _grantRole(DEFAULT_ADMIN_ROLE, _owner); _grantRole(OPERATOR_ROLE, _owner); _grantRole(OPERATOR_ROLE, _operator); IBlast(_blast).configure(YieldMode.CLAIMABLE, GasMode.CLAIMABLE, _owner); IBlastPoints(_blastPoints).configurePointsOperator(_blastPointsOperator); } /** * @notice Claim pending protocol fees * @param amount amount to claim * @param merkleProof array containing the merkle proof */ function claim(uint256 amount, bytes32[] calldata merkleProof) external whenNotPaused nonReentrant { // Verify the round is not claimed already if (hasUserClaimedForRound[currentRound][msg.sender]) { revert AlreadyClaimed(); } if (block.timestamp >= canClaimUntil) { revert ClaimPeriodEnded(); } (bool claimStatus, uint256 adjustedAmount) = _canClaim(msg.sender, amount, merkleProof); if (!claimStatus) { revert InvalidProof(); } if (amount > maximumAmountPerUserInCurrentTree) { revert AmountHigherThanMax(); } // Set mapping for user and round as true hasUserClaimedForRound[currentRound][msg.sender] = true; // Adjust amount claimed amountClaimedByUser[msg.sender] += adjustedAmount; // Transfer adjusted amount _transferETHAndWrapIfFailWithGasLimit({ _WETH: WETH, _to: msg.sender, _amount: adjustedAmount, _gasLimit: gasleft() }); emit ProtocolFeesClaimed(msg.sender, currentRound, adjustedAmount); } /** * @notice Update protocol fees distribution with a new merkle root * @dev It automatically increments the currentRound * @param merkleRoot root of the computed merkle tree */ function updateProtocolFeesDistribution(bytes32 merkleRoot, uint256 newMaximumAmountPerUser) external payable whenPaused onlyRole(OPERATOR_ROLE) { currentRound++; merkleRootOfRound[currentRound] = merkleRoot; maximumAmountPerUserInCurrentTree = newMaximumAmountPerUser; emit ProtocolFeesDistributionUpdated(currentRound); } function updateCanClaimUntil(uint256 timestamp) external onlyRole(OPERATOR_ROLE) { canClaimUntil = timestamp; emit CanClaimUntilUpdated(timestamp); } /** * @notice Pause claim */ function pause() external onlyRole(OPERATOR_ROLE) whenNotPaused { _pause(); } /** * @notice Unpause claim */ function unpause() external onlyRole(OPERATOR_ROLE) whenPaused { _unpause(); } /** * @notice Transfer ETH back to owner * @dev It is for emergency purposes * @param amount amount to withdraw */ function withdrawETH(uint256 amount) external onlyRole(DEFAULT_ADMIN_ROLE) { _transferETHAndWrapIfFailWithGasLimit({_WETH: WETH, _to: msg.sender, _amount: amount, _gasLimit: gasleft()}); emit EthWithdrawn(amount); } /** * @notice Check whether it is possible to claim and how much based on previous distribution * @param user address of the user * @param amount amount to claim * @param merkleProof array with the merkle proof */ function canClaim( address user, uint256 amount, bytes32[] calldata merkleProof ) external view returns (bool, uint256) { if (block.timestamp >= canClaimUntil) { return (false, 0); } return _canClaim(user, amount, merkleProof); } /** * @notice Check whether it is possible to claim and how much based on previous distribution * @param user address of the user * @param amount amount to claim * @param merkleProof array with the merkle proof */ function _canClaim( address user, uint256 amount, bytes32[] calldata merkleProof ) internal view returns (bool, uint256) { // Compute the node and verify the merkle proof bytes32 node = keccak256(bytes.concat(keccak256(abi.encode(user, amount)))); bool canUserClaim = MerkleProof.verify(merkleProof, merkleRootOfRound[currentRound], node); if ((!canUserClaim) || (hasUserClaimedForRound[currentRound][user])) { return (false, 0); } else { return (true, amount - amountClaimedByUser[user]); } } receive() external payable {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; // Interfaces import {IWETH} from "../interfaces/generic/IWETH.sol"; /** * @title LowLevelWETH * @notice This contract contains a function to transfer ETH with an option to wrap to WETH. * If the ETH transfer fails within a gas limit, the amount in ETH is wrapped to WETH and then transferred. * @author LooksRare protocol team (👀,💎) */ contract LowLevelWETH { /** * @notice It transfers ETH to a recipient with a specified gas limit. * If the original transfers fails, it wraps to WETH and transfers the WETH to recipient. * @param _WETH WETH address * @param _to Recipient address * @param _amount Amount to transfer * @param _gasLimit Gas limit to perform the ETH transfer */ function _transferETHAndWrapIfFailWithGasLimit( address _WETH, address _to, uint256 _amount, uint256 _gasLimit ) internal { bool status; assembly { status := call(_gasLimit, _to, _amount, 0, 0, 0, 0) } if (!status) { IWETH(_WETH).deposit{value: _amount}(); IWETH(_WETH).transfer(_to, _amount); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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, _msgSender()); _; } /** * @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 override returns (bool) { return _roles[role].members[account]; } /** * @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 { 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 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. */ 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. */ 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`. */ 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. * * [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. */ 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. */ 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 pragma solidity ^0.8.17; /** * @title Pausable * @notice This contract makes it possible to pause the contract. * It is adjusted from OpenZeppelin. * @author LooksRare protocol team (👀,💎) */ abstract contract Pausable { /** * @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); error IsPaused(); error NotPaused(); bool private _paused; /** * @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 { if (paused()) { revert IsPaused(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert NotPaused(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(msg.sender); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(msg.sender); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; // Interfaces import {IReentrancyGuard} from "./interfaces/IReentrancyGuard.sol"; /** * @title ReentrancyGuard * @notice This contract protects against reentrancy attacks. * It is adjusted from OpenZeppelin. * @author LooksRare protocol team (👀,💎) */ abstract contract ReentrancyGuard is IReentrancyGuard { uint256 private _status; /** * @notice Modifier to wrap functions to prevent reentrancy calls. */ modifier nonReentrant() { if (_status == 2) { revert ReentrancyFail(); } _status = 2; _; _status = 1; } constructor() { _status = 1; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; enum YieldMode { AUTOMATIC, VOID, CLAIMABLE } enum GasMode { VOID, CLAIMABLE } interface IBlast { // configure function configureContract( address contractAddress, YieldMode _yield, GasMode gasMode, address governor ) external; function configure( YieldMode _yield, GasMode gasMode, address governor ) external; // base configuration options function configureClaimableYield() external; function configureClaimableYieldOnBehalf(address contractAddress) external; function configureAutomaticYield() external; function configureAutomaticYieldOnBehalf(address contractAddress) external; function configureVoidYield() external; function configureVoidYieldOnBehalf(address contractAddress) external; function configureClaimableGas() external; function configureClaimableGasOnBehalf(address contractAddress) external; function configureVoidGas() external; function configureVoidGasOnBehalf(address contractAddress) external; function configureGovernor(address _governor) external; function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external; // claim yield function claimYield( address contractAddress, address recipientOfYield, uint256 amount ) external returns (uint256); function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256); // claim gas function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256); function claimGasAtMinClaimRate( address contractAddress, address recipientOfGas, uint256 minClaimRateBips ) external returns (uint256); function claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256); function claimGas( address contractAddress, address recipientOfGas, uint256 gasToClaim, uint256 gasSecondsToConsume ) external returns (uint256); // read functions function readClaimableYield(address contractAddress) external view returns (uint256); function readYieldConfiguration(address contractAddress) external view returns (uint8); function readGasParams(address contractAddress) external view returns ( uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IBlastPoints { function configurePointsOperator(address operator) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface IWETH { function deposit() external payable; function transfer(address dst, uint256 wad) external returns (bool); function withdraw(uint256 wad) external; }
// 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/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @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); } }
// 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 pragma solidity ^0.8.17; /** * @title IReentrancyGuard * @author LooksRare protocol team (👀,💎) */ interface IReentrancyGuard { /** * @notice This is returned when there is a reentrant call. */ error ReentrancyFail(); }
// 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); }
{ "remappings": [ "@openzeppelin/=node_modules/@openzeppelin/", "hardhat/=node_modules/hardhat/", "@ensdomains/=node_modules/@ensdomains/", "@looksrare/=node_modules/@looksrare/", "ds-test/=lib/ds-test/src/", "eth-gas-reporter/=node_modules/eth-gas-reporter/", "forge-std/=lib/forge-std/src/" ], "optimizer": { "enabled": true, "runs": 888888 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_blast","type":"address"},{"internalType":"address","name":"_blastPoints","type":"address"},{"internalType":"address","name":"_blastPointsOperator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"AmountHigherThanMax","type":"error"},{"inputs":[],"name":"ClaimPeriodEnded","type":"error"},{"inputs":[],"name":"InvalidProof","type":"error"},{"inputs":[],"name":"IsPaused","type":"error"},{"inputs":[],"name":"NotPaused","type":"error"},{"inputs":[],"name":"ReentrancyFail","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"CanClaimUntilUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"round","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProtocolFeesClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"round","type":"uint256"}],"name":"ProtocolFeesDistributionUpdated","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":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountClaimedByUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"canClaim","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canClaimUntil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"hasUserClaimedForRound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumAmountPerUserInCurrentTree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRootOfRound","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","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":"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":"uint256","name":"timestamp","type":"uint256"}],"name":"updateCanClaimUntil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"newMaximumAmountPerUser","type":"uint256"}],"name":"updateProtocolFeesDistribution","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162001b7e38038062001b7e83398101604081905262000034916200021b565b600180556001600160a01b0386166080526200005260008662000159565b6200006d60008051602062001b5e8339815191528662000159565b6200008860008051602062001b5e8339815191528562000159565b60405163c8992e6160e01b81526001600160a01b0384169063c8992e6190620000bc906002906001908a90600401620002b2565b600060405180830381600087803b158015620000d757600080fd5b505af1158015620000ec573d6000803e3d6000fd5b50506040516336b91f2b60e01b81526001600160a01b038481166004830152851692506336b91f2b9150602401600060405180830381600087803b1580156200013457600080fd5b505af115801562000149573d6000803e3d6000fd5b50505050505050505050620002fe565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff16620001fa5760008281526002602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620001b93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b80516001600160a01b03811681146200021657600080fd5b919050565b60008060008060008060c087890312156200023557600080fd5b6200024087620001fe565b95506200025060208801620001fe565b94506200026060408801620001fe565b93506200027060608801620001fe565b92506200028060808801620001fe565b91506200029060a08801620001fe565b90509295509295509295565b634e487b7160e01b600052602160045260246000fd5b6060810160038510620002c957620002c96200029c565b84825260028410620002df57620002df6200029c565b60208201939093526001600160a01b0391909116604090910152919050565b60805161183d62000321600039600081816107450152610a40015261183d6000f3fe6080604052600436106101795760003560e01c80638456cb59116100cb578063ba1ef3d11161007f578063f14210a611610059578063f14210a61461044f578063f5b541a61461046f578063ff0a4eb0146104a357600080fd5b8063ba1ef3d1146103e2578063d547741f146103f8578063dc38bdb51461041857600080fd5b806391d14854116100b057806391d148541461035a5780639c6b7744146103ad578063a217fddf146103cd57600080fd5b80638456cb591461032f5780638a19c8bc1461034457600080fd5b80633b66f49d1161012d57806342a5da3b1161010757806342a5da3b146102d7578063453dfc1e146102ea5780635c975abb1461031757600080fd5b80633b66f49d1461025a5780633cfb81ab146102875780633f4ba83a146102c257600080fd5b80632f2ff15d1161015e5780632f2ff15d146101f85780632f52ebb71461021a57806336568abe1461023a57600080fd5b806301ffc9a714610185578063248a9ca3146101ba57600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101a56101a03660046113d9565b6104b9565b60405190151581526020015b60405180910390f35b3480156101c657600080fd5b506101ea6101d536600461141b565b60009081526002602052604090206001015490565b6040519081526020016101b1565b34801561020457600080fd5b5061021861021336600461145d565b610552565b005b34801561022657600080fd5b506102186102353660046114d5565b61057d565b34801561024657600080fd5b5061021861025536600461145d565b6107af565b34801561026657600080fd5b506101ea610275366004611521565b60066020526000908152604090205481565b34801561029357600080fd5b506101a56102a236600461145d565b600860209081526000928352604080842090915290825290205460ff1681565b3480156102ce57600080fd5b50610218610867565b6102186102e536600461153c565b6108a5565b3480156102f657600080fd5b506101ea61030536600461141b565b60076020526000908152604090205481565b34801561032357600080fd5b5060005460ff166101a5565b34801561033b57600080fd5b50610218610935565b34801561035057600080fd5b506101ea60035481565b34801561036657600080fd5b506101a561037536600461145d565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b3480156103b957600080fd5b506102186103c836600461141b565b610970565b3480156103d957600080fd5b506101ea600081565b3480156103ee57600080fd5b506101ea60045481565b34801561040457600080fd5b5061021861041336600461145d565b6109d8565b34801561042457600080fd5b5061043861043336600461155e565b6109fe565b6040805192151583526020830191909152016101b1565b34801561045b57600080fd5b5061021861046a36600461141b565b610a2f565b34801561047b57600080fd5b506101ea7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b3480156104af57600080fd5b506101ea60055481565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061054c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60008281526002602052604090206001015461056e8133610a97565b6105788383610b69565b505050565b610585610c5d565b6001546002036105c1576040517f1bbee72600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155600354600090815260086020908152604080832033845290915290205460ff161561061d576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004544210610658576040517fe3ea984900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061066733868686610c9c565b91509150816106a2576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005548511156106de576040517fc3ebbdaf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546000908152600860209081526040808320338452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560069091528120805483929061073a9084906115e7565b9091555061076c90507f000000000000000000000000000000000000000000000000000000000000000033835a610e00565b60035460405182815233907ffb2ef6ae65fe7cd7752678feb2a45eaee660236a6a14f929449fecb75118e9a49060200160405180910390a3505060018055505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6108638282610f17565b5050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296108928133610a97565b61089a610fd2565b6108a261100e565b50565b6108ad610fd2565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296108d88133610a97565b600380549060006108e8836115fa565b9091555050600380546000908152600760205260408082208690556005859055915491517f3b1d5a3ba0df20ab17a8b5d7d86bbde54e473869a15b1791d98cb638015cd5999190a2505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296109608133610a97565b610968610c5d565b6108a2611074565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961099b8133610a97565b60048290556040518281527fa28b54f1a4f6871abf5beebe4e0c893515010a9235994016ddf53e259d7dbedf906020015b60405180910390a15050565b6000828152600260205260409020600101546109f48133610a97565b6105788383610f17565b6000806004544210610a1557506000905080610a26565b610a2186868686610c9c565b915091505b94509492505050565b6000610a3b8133610a97565b610a677f000000000000000000000000000000000000000000000000000000000000000033845a610e00565b6040518281527f7909752b76037727fecfc6c1abb7264306fd284ff7be21e2aa09bf2fdc00579d906020016109cc565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661086357610aef8173ffffffffffffffffffffffffffffffffffffffff1660146110d7565b610afa8360206110d7565b604051602001610b0b929190611656565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610850916004016116d7565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661086357600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610bff3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60005460ff1615610c9a576040517f1309a56300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8616602082015290810184905260009081908190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830152016040516020818303038152906040528051906020012090506000610d6e868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525060035481526007602052604090205492508691506113219050565b9050801580610daf5750600354600090815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915290205460ff165b15610dc257600080935093505050610a26565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260066020526040902054600190610df59089611728565b935093505050610a26565b6000806000806000868887f1905080610f10578473ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e5b57600080fd5b505af1158015610e6f573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018890528916935063a9059cbb925060440190506020604051808303816000875af1158015610eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0e919061173b565b505b5050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff161561086357600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60005460ff16610c9a576040517f6cd6020100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611016610fd2565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b61107c610c5d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589060200161106a565b606060006110e683600261175d565b6110f19060026115e7565b67ffffffffffffffff81111561110957611109611774565b6040519080825280601f01601f191660200182016040528015611133576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061116a5761116a6117a3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106111cd576111cd6117a3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061120984600261175d565b6112149060016115e7565b90505b60018111156112b1577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611255576112556117a3565b1a60f81b82828151811061126b5761126b6117a3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936112aa816117d2565b9050611217565b50831561131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610850565b9392505050565b60008261132e8584611337565b14949350505050565b600081815b84518110156113d1576000858281518110611359576113596117a3565b6020026020010151905080831161139b5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506113c8565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5060010161133c565b509392505050565b6000602082840312156113eb57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461131a57600080fd5b60006020828403121561142d57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461145857600080fd5b919050565b6000806040838503121561147057600080fd5b8235915061148060208401611434565b90509250929050565b60008083601f84011261149b57600080fd5b50813567ffffffffffffffff8111156114b357600080fd5b6020830191508360208260051b85010111156114ce57600080fd5b9250929050565b6000806000604084860312156114ea57600080fd5b83359250602084013567ffffffffffffffff81111561150857600080fd5b61151486828701611489565b9497909650939450505050565b60006020828403121561153357600080fd5b61131a82611434565b6000806040838503121561154f57600080fd5b50508035926020909101359150565b6000806000806060858703121561157457600080fd5b61157d85611434565b935060208501359250604085013567ffffffffffffffff8111156115a057600080fd5b6115ac87828801611489565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561054c5761054c6115b8565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361162b5761162b6115b8565b5060010190565b60005b8381101561164d578181015183820152602001611635565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161168e816017850160208801611632565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516116cb816028840160208801611632565b01602801949350505050565b60208152600082518060208401526116f6816040850160208701611632565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8181038181111561054c5761054c6115b8565b60006020828403121561174d57600080fd5b8151801515811461131a57600080fd5b808202811582820484141761054c5761054c6115b8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000816117e1576117e16115b8565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220a791ccdc996e2e9c8de67b8e0a07a64a0d36979c63a8b0adc47c05bd3cdc9a1864736f6c6343000817003397667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9290000000000000000000000004300000000000000000000000000000000000004000000000000000000000000fb03340fdb69024c6579b35170f1b3c0d7d67242000000000000000000000000c07240d6b278570f6357dc40a1c908877be64abb00000000000000000000000043000000000000000000000000000000000000020000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd8000000000000000000000000004066b9bd584b5fa88897194dabe3a37883ac35f7
Deployed Bytecode
0x6080604052600436106101795760003560e01c80638456cb59116100cb578063ba1ef3d11161007f578063f14210a611610059578063f14210a61461044f578063f5b541a61461046f578063ff0a4eb0146104a357600080fd5b8063ba1ef3d1146103e2578063d547741f146103f8578063dc38bdb51461041857600080fd5b806391d14854116100b057806391d148541461035a5780639c6b7744146103ad578063a217fddf146103cd57600080fd5b80638456cb591461032f5780638a19c8bc1461034457600080fd5b80633b66f49d1161012d57806342a5da3b1161010757806342a5da3b146102d7578063453dfc1e146102ea5780635c975abb1461031757600080fd5b80633b66f49d1461025a5780633cfb81ab146102875780633f4ba83a146102c257600080fd5b80632f2ff15d1161015e5780632f2ff15d146101f85780632f52ebb71461021a57806336568abe1461023a57600080fd5b806301ffc9a714610185578063248a9ca3146101ba57600080fd5b3661018057005b600080fd5b34801561019157600080fd5b506101a56101a03660046113d9565b6104b9565b60405190151581526020015b60405180910390f35b3480156101c657600080fd5b506101ea6101d536600461141b565b60009081526002602052604090206001015490565b6040519081526020016101b1565b34801561020457600080fd5b5061021861021336600461145d565b610552565b005b34801561022657600080fd5b506102186102353660046114d5565b61057d565b34801561024657600080fd5b5061021861025536600461145d565b6107af565b34801561026657600080fd5b506101ea610275366004611521565b60066020526000908152604090205481565b34801561029357600080fd5b506101a56102a236600461145d565b600860209081526000928352604080842090915290825290205460ff1681565b3480156102ce57600080fd5b50610218610867565b6102186102e536600461153c565b6108a5565b3480156102f657600080fd5b506101ea61030536600461141b565b60076020526000908152604090205481565b34801561032357600080fd5b5060005460ff166101a5565b34801561033b57600080fd5b50610218610935565b34801561035057600080fd5b506101ea60035481565b34801561036657600080fd5b506101a561037536600461145d565b600091825260026020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b3480156103b957600080fd5b506102186103c836600461141b565b610970565b3480156103d957600080fd5b506101ea600081565b3480156103ee57600080fd5b506101ea60045481565b34801561040457600080fd5b5061021861041336600461145d565b6109d8565b34801561042457600080fd5b5061043861043336600461155e565b6109fe565b6040805192151583526020830191909152016101b1565b34801561045b57600080fd5b5061021861046a36600461141b565b610a2f565b34801561047b57600080fd5b506101ea7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b3480156104af57600080fd5b506101ea60055481565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061054c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60008281526002602052604090206001015461056e8133610a97565b6105788383610b69565b505050565b610585610c5d565b6001546002036105c1576040517f1bbee72600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155600354600090815260086020908152604080832033845290915290205460ff161561061d576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004544210610658576040517fe3ea984900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061066733868686610c9c565b91509150816106a2576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005548511156106de576040517fc3ebbdaf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546000908152600860209081526040808320338452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560069091528120805483929061073a9084906115e7565b9091555061076c90507f000000000000000000000000430000000000000000000000000000000000000433835a610e00565b60035460405182815233907ffb2ef6ae65fe7cd7752678feb2a45eaee660236a6a14f929449fecb75118e9a49060200160405180910390a3505060018055505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6108638282610f17565b5050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296108928133610a97565b61089a610fd2565b6108a261100e565b50565b6108ad610fd2565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296108d88133610a97565b600380549060006108e8836115fa565b9091555050600380546000908152600760205260408082208690556005859055915491517f3b1d5a3ba0df20ab17a8b5d7d86bbde54e473869a15b1791d98cb638015cd5999190a2505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296109608133610a97565b610968610c5d565b6108a2611074565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961099b8133610a97565b60048290556040518281527fa28b54f1a4f6871abf5beebe4e0c893515010a9235994016ddf53e259d7dbedf906020015b60405180910390a15050565b6000828152600260205260409020600101546109f48133610a97565b6105788383610f17565b6000806004544210610a1557506000905080610a26565b610a2186868686610c9c565b915091505b94509492505050565b6000610a3b8133610a97565b610a677f000000000000000000000000430000000000000000000000000000000000000433845a610e00565b6040518281527f7909752b76037727fecfc6c1abb7264306fd284ff7be21e2aa09bf2fdc00579d906020016109cc565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661086357610aef8173ffffffffffffffffffffffffffffffffffffffff1660146110d7565b610afa8360206110d7565b604051602001610b0b929190611656565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610850916004016116d7565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1661086357600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610bff3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60005460ff1615610c9a576040517f1309a56300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040805173ffffffffffffffffffffffffffffffffffffffff8616602082015290810184905260009081908190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830152016040516020818303038152906040528051906020012090506000610d6e868680806020026020016040519081016040528093929190818152602001838360200280828437600092018290525060035481526007602052604090205492508691506113219050565b9050801580610daf5750600354600090815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915290205460ff165b15610dc257600080935093505050610a26565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260066020526040902054600190610df59089611728565b935093505050610a26565b6000806000806000868887f1905080610f10578473ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e5b57600080fd5b505af1158015610e6f573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018890528916935063a9059cbb925060440190506020604051808303816000875af1158015610eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0e919061173b565b505b5050505050565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff161561086357600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60005460ff16610c9a576040517f6cd6020100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611016610fd2565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b61107c610c5d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589060200161106a565b606060006110e683600261175d565b6110f19060026115e7565b67ffffffffffffffff81111561110957611109611774565b6040519080825280601f01601f191660200182016040528015611133576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061116a5761116a6117a3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106111cd576111cd6117a3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061120984600261175d565b6112149060016115e7565b90505b60018111156112b1577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611255576112556117a3565b1a60f81b82828151811061126b5761126b6117a3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936112aa816117d2565b9050611217565b50831561131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610850565b9392505050565b60008261132e8584611337565b14949350505050565b600081815b84518110156113d1576000858281518110611359576113596117a3565b6020026020010151905080831161139b5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506113c8565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5060010161133c565b509392505050565b6000602082840312156113eb57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461131a57600080fd5b60006020828403121561142d57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461145857600080fd5b919050565b6000806040838503121561147057600080fd5b8235915061148060208401611434565b90509250929050565b60008083601f84011261149b57600080fd5b50813567ffffffffffffffff8111156114b357600080fd5b6020830191508360208260051b85010111156114ce57600080fd5b9250929050565b6000806000604084860312156114ea57600080fd5b83359250602084013567ffffffffffffffff81111561150857600080fd5b61151486828701611489565b9497909650939450505050565b60006020828403121561153357600080fd5b61131a82611434565b6000806040838503121561154f57600080fd5b50508035926020909101359150565b6000806000806060858703121561157457600080fd5b61157d85611434565b935060208501359250604085013567ffffffffffffffff8111156115a057600080fd5b6115ac87828801611489565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561054c5761054c6115b8565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361162b5761162b6115b8565b5060010190565b60005b8381101561164d578181015183820152602001611635565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161168e816017850160208801611632565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516116cb816028840160208801611632565b01602801949350505050565b60208152600082518060208401526116f6816040850160208701611632565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8181038181111561054c5761054c6115b8565b60006020828403121561174d57600080fd5b8151801515811461131a57600080fd5b808202811582820484141761054c5761054c6115b8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000816117e1576117e16115b8565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220a791ccdc996e2e9c8de67b8e0a07a64a0d36979c63a8b0adc47c05bd3cdc9a1864736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004300000000000000000000000000000000000004000000000000000000000000fb03340fdb69024c6579b35170f1b3c0d7d67242000000000000000000000000c07240d6b278570f6357dc40a1c908877be64abb00000000000000000000000043000000000000000000000000000000000000020000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd8000000000000000000000000004066b9bd584b5fa88897194dabe3a37883ac35f7
-----Decoded View---------------
Arg [0] : _weth (address): 0x4300000000000000000000000000000000000004
Arg [1] : _owner (address): 0xFB03340fdB69024C6579b35170F1B3c0D7D67242
Arg [2] : _operator (address): 0xc07240d6B278570f6357dC40A1c908877be64Abb
Arg [3] : _blast (address): 0x4300000000000000000000000000000000000002
Arg [4] : _blastPoints (address): 0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800
Arg [5] : _blastPointsOperator (address): 0x4066b9BD584b5FA88897194dAbE3a37883AC35F7
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000004300000000000000000000000000000000000004
Arg [1] : 000000000000000000000000fb03340fdb69024c6579b35170f1b3c0d7d67242
Arg [2] : 000000000000000000000000c07240d6b278570f6357dc40a1c908877be64abb
Arg [3] : 0000000000000000000000004300000000000000000000000000000000000002
Arg [4] : 0000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd800
Arg [5] : 0000000000000000000000004066b9bd584b5fa88897194dabe3a37883ac35f7
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.