Source Code
Latest 25 from a total of 163,166 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Update Can Claim... | 30226859 | 1 hr ago | IN | 0 ETH | 0.00000034 | ||||
| Update Can Claim... | 30205265 | 13 hrs ago | IN | 0 ETH | 0.00000016 | ||||
| Update Can Claim... | 30183662 | 25 hrs ago | IN | 0 ETH | 0.00000091 | ||||
| Update Can Claim... | 30162064 | 37 hrs ago | IN | 0 ETH | 0.00000015 | ||||
| Update Can Claim... | 30140462 | 2 days ago | IN | 0 ETH | 0.00000445 | ||||
| Update Can Claim... | 30118861 | 2 days ago | IN | 0 ETH | 0.00000007 | ||||
| Update Can Claim... | 30097265 | 3 days ago | IN | 0 ETH | 0.0000121 | ||||
| Update Can Claim... | 30075664 | 3 days ago | IN | 0 ETH | 0.00000017 | ||||
| Update Can Claim... | 30054381 | 4 days ago | IN | 0 ETH | 0.00000161 | ||||
| Update Can Claim... | 30032464 | 4 days ago | IN | 0 ETH | 0.00000008 | ||||
| Update Can Claim... | 30010864 | 5 days ago | IN | 0 ETH | 0.00000007 | ||||
| Update Can Claim... | 29989266 | 5 days ago | IN | 0 ETH | 0.00000019 | ||||
| Update Can Claim... | 29967661 | 6 days ago | IN | 0 ETH | 0.00000007 | ||||
| Update Can Claim... | 29946230 | 6 days ago | IN | 0 ETH | 0.00000007 | ||||
| Update Can Claim... | 29924465 | 7 days ago | IN | 0 ETH | 0.00000018 | ||||
| Update Can Claim... | 29902868 | 7 days ago | IN | 0 ETH | 0.00000008 | ||||
| Update Can Claim... | 29881267 | 8 days ago | IN | 0 ETH | 0.00000043 | ||||
| Update Can Claim... | 29859674 | 8 days ago | IN | 0 ETH | 0.00000011 | ||||
| Update Can Claim... | 29838068 | 9 days ago | IN | 0 ETH | 0.00001063 | ||||
| Update Can Claim... | 29816470 | 9 days ago | IN | 0 ETH | 0.00000027 | ||||
| Update Can Claim... | 29794865 | 10 days ago | IN | 0 ETH | 0.00000221 | ||||
| Update Can Claim... | 29773281 | 10 days ago | IN | 0 ETH | 0.00000325 | ||||
| Update Can Claim... | 29751677 | 11 days ago | IN | 0 ETH | 0.00001983 | ||||
| Update Can Claim... | 29730066 | 11 days ago | IN | 0 ETH | 0.00000098 | ||||
| Update Can Claim... | 29708467 | 12 days ago | IN | 0 ETH | 0.00002467 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 27957208 | 52 days ago | 0.00012097 ETH | ||||
| 27950851 | 52 days ago | 0.00012536 ETH | ||||
| 27950657 | 52 days ago | 0.00009739 ETH | ||||
| 27950629 | 52 days ago | 0.00000589 ETH | ||||
| 27943326 | 52 days ago | 0.00153967 ETH | ||||
| 27928944 | 53 days ago | 0.00058702 ETH | ||||
| 27920639 | 53 days ago | 0.00000589 ETH | ||||
| 27920548 | 53 days ago | 0.00009739 ETH | ||||
| 27920332 | 53 days ago | 0.00025073 ETH | ||||
| 27920262 | 53 days ago | 0.00010474 ETH | ||||
| 27919138 | 53 days ago | 0.00201794 ETH | ||||
| 27917503 | 53 days ago | 0.00039915 ETH | ||||
| 27912066 | 53 days ago | 0.00013684 ETH | ||||
| 27912011 | 53 days ago | 0.00009739 ETH | ||||
| 27898614 | 53 days ago | 0.00216949 ETH | ||||
| 27876537 | 54 days ago | 0.00126924 ETH | ||||
| 27874463 | 54 days ago | 0.0024104 ETH | ||||
| 27874321 | 54 days ago | 0.00027818 ETH | ||||
| 27872970 | 54 days ago | 0.00009739 ETH | ||||
| 27872874 | 54 days ago | 0.00008203 ETH | ||||
| 27872829 | 54 days ago | 0.00001386 ETH | ||||
| 27872723 | 54 days ago | 0.00013684 ETH | ||||
| 27872637 | 54 days ago | 0.00012536 ETH | ||||
| 27872603 | 54 days ago | 0.00010474 ETH | ||||
| 27870545 | 54 days ago | 0.00135563 ETH |
Cross-Chain Transactions
Loading...
Loading
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
Net Worth in USD
$603.07
Net Worth in ETH
0.204007
Token Allocations
ETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| BLAST | 100.00% | $2,956.43 | 0.204 | $603.07 |
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.