Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 262287 | 740 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
GasCollector
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/**
*Submitted for verification at blastscan.io on 2024-04-07
*/
// SPDX-License-Identifier: none
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*
* ==== Security Considerations
*
* There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
* expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
* considered as an intention to spend the allowance in any specific way. The second is that because permits have
* built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
* take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
* generally recommended is:
*
* ```solidity
* function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
* try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
* doThing(..., value);
* }
*
* function doThing(..., uint256 value) public {
* token.safeTransferFrom(msg.sender, address(this), value);
* ...
* }
* ```
*
* Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
* `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
* {SafeERC20-safeTransferFrom}).
*
* Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
* contracts should have entry points that don't rely on permit.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*
* CAUTION: See Security Considerations above.
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
/**
* @dev An operation with an ERC20 token failed.
*/
error SafeERC20FailedOperation(address token);
/**
* @dev Indicates a failed `decreaseAllowance` request.
*/
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
* value, non-reverting calls are assumed to be successful.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data);
if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
}
}
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error AddressInsufficientBalance(address account);
/**
* @dev There's no code at `target` (it is not a contract).
*/
error AddressEmptyCode(address target);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedInnerCall();
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert AddressInsufficientBalance(address(this));
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert FailedInnerCall();
}
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason or custom error, it is bubbled
* up by this function (like regular Solidity function calls). However, if
* the call reverted with no returned reason, this function reverts with a
* {FailedInnerCall} error.
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert AddressInsufficientBalance(address(this));
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
* was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
* unsuccessful call.
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
// only check if target is a contract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
/**
* @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
* revert reason or with a default {FailedInnerCall} error.
*/
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
/**
* @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
*/
function _revert(bytes memory returndata) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert FailedInnerCall();
}
}
}
pragma solidity 0.8.24;
// https://docs.blast.io/building/guides/eth-yield
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);
}
pragma solidity 0.8.24;
/**
* @title IBlastable
* @author AgentFi
* @notice An abstract contract that configures the connection to Blast during deployment
*
* This primarily involves collecting ETH yield and gas rewards. Control is delegated to a governor.
*/
interface IBlastable {
/**
* @notice Returns the address of the Blast contract.
* @return blast_ The adress of the Blast contract.
*/
function blast() external view returns (address blast_);
}
pragma solidity 0.8.24;
/**
* @title IGasCollector
* @author AgentFi
* @notice The GasCollector collects the gas rewards in bulk from a list of contracts.
*/
interface IGasCollector {
event ClaimContractListSet(address[] contractList_, address receiver);
/**
* @notice Gets the list of contracts to collect blast gas rewards from.
* @return contractList_ The list of contract addresses.
* @return gasReceiver_ The receiver of gas rewards.
*/
function getContractList() external view returns (address[] memory contractList_, address gasReceiver_);
/**
* @notice Claims max gas from a list of contracts.
* Can be called by anyone.
* @return amountClaimed The amount claimed.
*/
function claimGas() external payable returns (uint256 amountClaimed);
/**
* @notice Calls the Blast contract multiple times with arbitrary data.
* Can only be called by the contract owner.
* @param calldatas The list of datas to pass to the Blast contract.
* @return results The results of each calls.
*/
function callBlastMulti(bytes[] calldata calldatas) external payable returns (bytes[] memory results);
/**
* @notice Sets the contract list and receiver.
* Can only be called by the contract owner.
* @param contractList_ The list of contracts.
* @param receiver_ The receiver.
*/
function setClaimContractList(address[] calldata contractList_, address receiver_) external payable;
}
pragma solidity 0.8.24;
/**
* @title IMulticall
* @author AgentFi
* @notice Provides a function to batch together multiple calls in a single external call.
*/
interface IMulticall {
/**
* @notice Receives and executes a batch of function calls on this contract.
* @param data A list of function calls to execute.
* @return results The results of each function call.
*/
function multicall(bytes[] calldata data) external payable returns (bytes[] memory results);
}
pragma solidity 0.8.24;
/**
* @title IOwnable2Step
* @author AgentFi
* @notice An abstract contract that provides a basic access control system through ERC173.
*/
interface IOwnable2Step {
/***************************************
EVENTS
***************************************/
/// @notice Emitted when the contract ownership process is started.
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/// @notice Emitted when the contract ownership process is completed.
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/***************************************
VIEW FUNCTIONS
***************************************/
/**
* @notice Returns the address of the current owner.
* @return owner_ The current owner.
*/
function owner() external view returns (address owner_);
/**
* @notice Returns the address of the pending owner.
* @return pendingOwner_ The pending owner.
*/
function pendingOwner() external view returns (address pendingOwner_);
/***************************************
MUTATOR FUNCTIONS
***************************************/
/**
* @notice Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() external payable;
/**
* @notice Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
* @param newOwner The address of the new owner.
*/
function transferOwnership(address newOwner) external payable;
/**
* @notice Completes the ownership transfer of the contract to the new account.
* Can only be called by the pending owner.
*/
function acceptOwnership() external payable;
/***************************************
TOKEN BALANCE FUNCTIONS
***************************************/
/**
* @notice Rescues tokens that may have been accidentally transferred in.
* Can only be called by the contract owner.
* @dev If the inheriting contract requires tokens in the contract, overwrite this with a revert.
* @param receiver The receiver of the rescued tokens.
* @param tokens The tokens to rescue. Can be ETH or ERC20s.
*/
function sweep(address receiver, address[] calldata tokens) external payable;
}
pragma solidity 0.8.24;
/**
* @title Calls
* @author AgentFi
* @notice A library for safely making low level calls.
*/
library Calls {
/**
* @notice Safely transfers the gas token using a low level `call`.
* @dev If `target` reverts with a revert reason, it is bubbled up by this function.
* @param target The address of the contract to `call`.
* @return result The result of the function call.
*/
function sendValue(
address target,
uint256 value
) internal returns (bytes memory result) {
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{value:value}("");
if(success) {
result = returndata;
} else {
// look for revert reason and bubble it up if present
if(returndata.length > 0) {
// the easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert Errors.CallFailed();
}
}
}
/**
* @notice Safely performs a Solidity function call using a low level `call`.
* @dev If `target` reverts with a revert reason, it is bubbled up by this function.
* @param target The address of the contract to `delegatecall`.
* @param data The data to pass to the target.
* @return result The result of the function call.
*/
function functionCall(
address target,
bytes memory data
) internal returns (bytes memory result) {
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call(data);
if(success) {
result = returndata;
} else {
// look for revert reason and bubble it up if present
if(returndata.length > 0) {
// the easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert Errors.CallFailed();
}
}
}
/**
* @notice Safely performs a Solidity function call using a low level `call`.
* @dev If `target` reverts with a revert reason, it is bubbled up by this function.
* @param target The address of the contract to `delegatecall`.
* @param data The data to pass to the target.
* @return result The result of the function call.
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory result) {
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{value:value}(data);
if(success) {
result = returndata;
} else {
// look for revert reason and bubble it up if present
if(returndata.length > 0) {
// the easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert Errors.CallFailed();
}
}
}
/**
* @notice Safely performs a Solidity function call using a low level `delegatecall`.
* @dev If `target` reverts with a revert reason, it is bubbled up by this function.
* @param target The address of the contract to `delegatecall`.
* @param data The data to pass to the target.
* @return result The result of the function call.
*/
function functionDelegateCall(
address target,
bytes memory data
) internal returns (bytes memory result) {
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
if(success) {
result = returndata;
} else {
// look for revert reason and bubble it up if present
if(returndata.length > 0) {
// the easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert Errors.DelegateCallFailed();
}
}
}
/**
* @notice Verify that an address has contract code, otherwise reverts.
* @param target The address to verify.
*/
function verifyHasCode(
address target
) internal view {
// checks
uint256 contractSize;
// solhint-disable-next-line no-inline-assembly
assembly {
contractSize := extcodesize(target)
}
if(contractSize == 0) revert Errors.NotAContract();
}
}
pragma solidity 0.8.24;
/**
* @title Errors
* @author AgentFi Ltd.
* @notice A library of custom error types used in BOOM!.
*/
library Errors {
// call errors
/// @notice Thrown when a low level call reverts without a reason.
error CallFailed();
/// @notice Thrown when a low level delegatecall reverts without a reason.
error DelegateCallFailed();
/// @notice Thrown if the owner tries to execute an operation that is not a call.
error OnlyCallsAllowed();
/// @notice Thrown when a function should not be delegatecalled.
error NoDelegateCall();
/// @notice Thrown when using an address with no code.
error NotAContract();
/// @notice Thrown when a contract deployment fails.
error ContractNotDeployed();
// ownership & authentication errors
/// @notice Thrown when calling a function reserved for the contract owner.
error NotContractOwner();
/// @notice Thrown when calling a function reserved for the pending contract owner.
error NotPendingContractOwner();
/// @notice Thrown when calling a function reserved for the owner of a erc6551 account.
error ERC6551InvalidSigner();
/// @notice Thrown when attempting a function reserved for the owner of the agent.
//error NotOwnerOfAgent();
/// @notice Thrown when a signature is invalid.
error InvalidSignature();
// generic input errors
/// @notice Thrown when address zero is used where it should not be.
error AddressZero();
/// @notice Thrown when a nonzero address is used where the zero address is expected
error AddressNotZero();
/// @notice Thrown when an address is used where it should not be.
//error AddressIllegal();
/// @notice Thrown when a zero amount used where it should not be.
error AmountZero();
/// @notice Thrown when the number of elements in an array is not what was expected.
error LengthMismatch();
/// @notice Thrown when receiving an array of length zero.
error LengthZero();
/// @notice Thrown when looking up a name that is unknown.
error UnknownName();
/// @notice Thrown when accessing an element that is out of range.
error OutOfRange();
// execution errors
/// @notice Thrown when a call reenters illegally.
error ReentrancyGuard();
/// @notice Thrown when attempting to initialize a contract that has already been initialized.
error AlreadyInitialized();
// nft errors
/// @notice Thrown when querying an agent that does not exist.
error AgentDoesNotExist();
/// @notice Thrown when transferring an agent nft to the agent account.
error OwnershipCycle();
/// @notice Thrown when calling a function that is reserved for agents only.
//error CallerIsNotAnAgent();
// agent creation errors
/// @notice Thrown when attempting to create an agent from an account that is not whitelisted.
error FactoryNotWhitelisted();
/// @notice Thrown when call a contract that has been paused.
error ContractPaused();
/// @notice Thrown when using a factory and a creation settings that has been paused.
error CreationSettingsPaused();
/// @notice Thrown when minting an nft over the max total supply.
error OverMaxSupply();
/// @notice Thrown when minting an nft but the mint has not been started.
error MintNotStarted();
/// @notice Thrown when minting via the allowlist but the period has ended.
error AllowlistMintEnded();
/// @notice Thrown when minting too many agents at once.
error OverMaxMintPerTx();
/// @notice Thrown when minting an nft over the max allowlist mint total.
error OverMaxAllowlistMintTotal();
/// @notice Thrown when minting an nft over the max allowlist mint per user.
error OverMaxAllowlistMintPerAccount();
// erc2535 errors
/// @notice Thrown when installing a function that is already installed.
error AddFunctionDuplicate();
/// @notice Thrown when replacing a function with itself.
error ReplaceFunctionSame();
/// @notice Thrown when removing a function that has not currently installed.
error RemoveFunctionDoesNotExist();
/// @notice Thrown when removing a function that cannot be removed.
error RemoveFunctionImmutable();
/// @notice Thrown when calling a function that does not exist in this contract.
error FunctionDoesNotExist();
/// @notice Thrown when attempting to install a module that is not whitelisted.
error ModuleNotWhitelisted();
// quoter errors
/// @notice Thrown when failing to decode an error message.
error UnknownError();
/// @notice Thrown when a revert was intentionally thrown in order to return a value.
error RevertForAmount(uint256 amount);
/// @notice Thrown when calling a function on a proxy that should only be called on the implementation.
error NotImplementation();
/// @notice Thrown when calling a function on an implementation contract that can only be called by the gas collector.
error NotGasCollector();
/// @notice Thrown when trying to mint without the minter role.
error NotMinter();
error InvalidOperation();
error ContractCreationFailed();
error NotAuthorized();
error InvalidInput();
error ExceedsMaxLockTime();
error AccountLocked();
error InvalidAccountProof();
error InvalidGuardian();
error InvalidImplementation();
//error AlreadyInitialized();
error InvalidEntryPoint();
error InvalidMulticallForwarder();
error InvalidERC6551Registry();
error InvalidSender();
}
pragma solidity 0.8.24;
/**
* @title Blastable
* @author AgentFi
* @notice An abstract contract that configures the connection to Blast during deployment
*
* This primarily involves collecting ETH yield and gas rewards. Control is delegated to a governor.
*/
abstract contract Blastable is IBlastable {
address private immutable _blast;
/**
* @notice Constructs the Blastable contract.
* Configures the contract to receive automatic yield, claimable gas, and assigns a governor.
* @param blast_ The address of the blast gas reward contract.
* @param governor_ The address of the gas governor.
*/
constructor(address blast_, address governor_) {
_blast = blast_;
// allow these calls to fail on local fork
// check success after deployment
blast_.call(abi.encodeWithSignature("configureAutomaticYield()"));
blast_.call(abi.encodeWithSignature("configureClaimableGas()"));
if(governor_ != address(0)) blast_.call(abi.encodeWithSignature("configureGovernor(address)", governor_));
}
/**
* @notice Returns the address of the Blast contract.
* @return blast_ The adress of the Blast contract.
*/
function blast() public view override returns (address blast_) {
blast_ = _blast;
}
/**
* @notice Allows this contract to receive the gas token.
*/
// solhint-disable-next-line no-empty-blocks
receive() external payable virtual {}
}
pragma solidity 0.8.24;
/**
* @title Multicall
* @author AgentFi
* @notice Provides a function to batch together multiple calls in a single external call.
*/
abstract contract Multicall is IMulticall {
/**
* @notice Receives and executes a batch of function calls on this contract.
* @param data A list of function calls to execute.
* @return results The results of each function call.
*/
function multicall(bytes[] calldata data) external payable virtual returns (bytes[] memory results) {
results = new bytes[](data.length);
for (uint256 i = 0; i < data.length; ) {
results[i] = Calls.functionDelegateCall(address(this), data[i]);
unchecked { i++; }
}
return results;
}
}
pragma solidity 0.8.24;
/**
* @title Ownable2Step
* @author AgentFi
* @notice An abstract contract that provides a basic access control system through ERC173.
*
* Based on OpenZeppelins's implementation.
*
* Also includes [`sweep()`](#sweep) to allow the owner to rescue any tokens that may have been sent in.
*/
abstract contract Ownable2Step is IOwnable2Step {
/***************************************
VARIABLES
***************************************/
address private _owner;
address private _pendingOwner;
/**
* @notice Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/***************************************
VIEW FUNCTIONS
***************************************/
/**
* @notice Returns the address of the current owner.
* @return owner_ The current owner.
*/
function owner() public view override returns (address owner_) {
owner_ = _owner;
}
/**
* @notice Returns the address of the pending owner.
* @return pendingOwner_ The pending owner.
*/
function pendingOwner() public view override returns (address pendingOwner_) {
pendingOwner_ = _pendingOwner;
}
/***************************************
MUTATOR FUNCTIONS
***************************************/
/**
* @notice Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public payable override onlyOwner {
_transferOwnership(address(0));
}
/**
* @notice Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
* @param newOwner The address of the new owner.
*/
function transferOwnership(address newOwner) public payable override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(_owner, newOwner);
}
/**
* @notice Completes the ownership transfer of the contract to the new account.
* Can only be called by the pending owner.
*/
function acceptOwnership() public payable override {
address sender = msg.sender;
if(_pendingOwner != sender) revert Errors.NotPendingContractOwner();
_transferOwnership(sender);
}
/***************************************
TOKEN BALANCE FUNCTIONS
***************************************/
/**
* @notice Rescues tokens that may have been accidentally transferred in.
* Can only be called by the contract owner.
* @dev If the inheriting contract requires tokens in the contract, overwrite this with a revert.
* @param receiver The receiver of the rescued tokens.
* @param tokens The tokens to rescue. Can be ETH or ERC20s.
*/
function sweep(address receiver, address[] calldata tokens) external payable virtual override onlyOwner {
for(uint256 i = 0; i < tokens.length; ++i) {
address token = tokens[i];
if(token == address(0)) {
Calls.sendValue(payable(receiver), address(this).balance);
} else {
IERC20 tkn = IERC20(token);
SafeERC20.safeTransfer(tkn, receiver, tkn.balanceOf(address(this)));
}
}
}
/***************************************
HELPER FUNCTIONS
***************************************/
/**
* @notice Throws if the sender is not the owner.
*/
function _checkOwner() internal view {
if(_owner != msg.sender) revert Errors.NotContractOwner();
}
/**
* @notice Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal {
_pendingOwner = address(0);
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
pragma solidity 0.8.24;
/**
* @title GasCollector
* @author AgentFi
* @notice The GasCollector collects the gas rewards in bulk from a list of contracts.
*/
contract GasCollector is Blastable, Ownable2Step, Multicall, IGasCollector {
address[] internal _contractList;
address internal _gasReceiver;
/**
* @notice Constructs the GasCollector contract.
* @param owner_ The contract owner.
* @param blast_ The address of the blast gas reward contract.
*/
constructor(
address owner_,
address blast_
) Blastable(blast_, address(0)) {
_transferOwnership(owner_);
}
/**
* @notice Gets the list of contracts to collect blast gas rewards from.
* @return contractList_ The list of contract addresses.
* @return gasReceiver_ The receiver of gas rewards.
*/
function getContractList() external view override returns (address[] memory contractList_, address gasReceiver_) {
contractList_ = _contractList;
gasReceiver_ = _gasReceiver;
}
/**
* @notice Claims max gas from a list of contracts.
* Can be called by anyone.
* @return amountClaimed The amount claimed.
*/
function claimGas() external payable override returns (uint256 amountClaimed) {
uint256 len = _contractList.length;
address rec = _gasReceiver;
IBlast b = IBlast(blast());
for(uint256 i = 0; i < len; ++i) {
amountClaimed += b.claimMaxGas(_contractList[i], rec);
}
}
/**
* @notice Calls the Blast contract multiple times with arbitrary data.
* Can only be called by the contract owner.
* @param calldatas The list of datas to pass to the Blast contract.
* @return results The results of each calls.
*/
function callBlastMulti(bytes[] calldata calldatas) external payable override onlyOwner returns (bytes[] memory results) {
address b = blast();
results = new bytes[](calldatas.length);
for(uint256 i = 0; i < calldatas.length; ++i) {
results[i] = Calls.functionCall(b, calldatas[i]);
}
}
/**
* @notice Sets the contract list and receiver.
* Can only be called by the contract owner.
* @param contractList_ The list of contracts.
* @param receiver_ The receiver.
*/
function setClaimContractList(address[] calldata contractList_, address receiver_) external payable override onlyOwner {
_contractList = contractList_;
_gasReceiver = receiver_;
emit ClaimContractListSet(contractList_, receiver_);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"blast_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"CallFailed","type":"error"},{"inputs":[],"name":"DelegateCallFailed","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"NotPendingContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"contractList_","type":"address[]"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"ClaimContractListSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"blast","outputs":[{"internalType":"address","name":"blast_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"}],"name":"callBlastMulti","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimGas","outputs":[{"internalType":"uint256","name":"amountClaimed","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getContractList","outputs":[{"internalType":"address[]","name":"contractList_","type":"address[]"},{"internalType":"address","name":"gasReceiver_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"pendingOwner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"contractList_","type":"address[]"},{"internalType":"address","name":"receiver_","type":"address"}],"name":"setClaimContractList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"sweep","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60a060405234801562000010575f80fd5b506040516200163138038062001631833981016040819052620000339162000274565b6001600160a01b038116608081905260408051600481526024810182526020810180516001600160e01b031663388a0bbd60e11b179052905183925f9290916200007e9190620002aa565b5f604051808303815f865af19150503d805f8114620000b9576040519150601f19603f3d011682016040523d82523d5f602084013e620000be565b606091505b505060408051600481526024810182526020810180516001600160e01b0316634e606c4760e01b17905290516001600160a01b0385169250620001029190620002aa565b5f604051808303815f865af19150503d805f81146200013d576040519150601f19603f3d011682016040523d82523d5f602084013e62000142565b606091505b5050506001600160a01b03811615620001e9576040516001600160a01b03828116602483015283169060440160408051601f198184030181529181526020820180516001600160e01b0316631d70c8d360e31b17905251620001a59190620002aa565b5f604051808303815f865af19150503d805f8114620001e0576040519150601f19603f3d011682016040523d82523d5f602084013e620001e5565b606091505b5050505b50620001f7905082620001ff565b5050620002d8565b600180546001600160a01b03199081169091555f80546001600160a01b03848116938216841783556040519116929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200026f575f80fd5b919050565b5f806040838503121562000286575f80fd5b620002918362000258565b9150620002a16020840162000258565b90509250929050565b5f82515f5b81811015620002cb5760208186018101518583015201620002af565b505f920191825250919050565b608051611333620002fe5f395f818160df01528181610459015261060d01526113335ff3fe6080604052600436106100c6575f3560e01c80638eda1c5911610071578063ac9650d81161004c578063ac9650d8146101e2578063e30c3978146101f5578063f2fde38b1461021f575f80fd5b80638eda1c591461018a57806399acac8c146101aa578063a95d6b1c146101cc575f80fd5b806379ba5097116100a157806379ba5097146101465780638a179be41461014e5780638da5cb5b14610161575f80fd5b8063175e1a7d146100d157806320d6b04c14610129578063715018a61461013e575f80fd5b366100cd57005b5f80fd5b3480156100dc575f80fd5b507f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61013c610137366004610efc565b610232565b005b61013c6102c8565b61013c6102db565b61013c61015c366004610f4c565b61033a565b34801561016c575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100ff565b61019d610198366004610f9b565b61044d565b6040516101209190610ffc565b3480156101b5575f80fd5b506101be61055f565b6040516101209291906110b0565b6101d46105ec565b604051908152602001610120565b61019d6101f0366004610f9b565b61071f565b348015610200575f80fd5b5060015473ffffffffffffffffffffffffffffffffffffffff166100ff565b61013c61022d366004611129565b610808565b61023a610885565b61024660028484610df2565b50600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790556040517f889d8928c287623c816019afaa141e71deee2558964cace4d420cea5bb015631906102bb90859085908590611142565b60405180910390a1505050565b6102d0610885565b6102d95f6108d5565b565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461032e576040517f3d6f519e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610337816108d5565b50565b610342610885565b5f5b81811015610447575f83838381811061035f5761035f6111b9565b90506020020160208101906103749190611129565b905073ffffffffffffffffffffffffffffffffffffffff81166103a15761039b8547610953565b5061043e565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152819061043c908290889073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610413573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061043791906111e6565b610a06565b505b50600101610344565b50505050565b6060610457610885565b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff811115610491576104916111fd565b6040519080825280602002602001820160405280156104c457816020015b60608152602001906001900390816104af5790505b5091505f5b8381101561055757610532828686848181106104e7576104e76111b9565b90506020028101906104f9919061122a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610a9892505050565b838281518110610544576105446111b9565b60209081029190910101526001016104c9565b505092915050565b60605f60028054806020026020016040519081016040528092919081815260200182805480156105c357602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610598575b5050600354939673ffffffffffffffffffffffffffffffffffffffff9094169550929350505050565b6002546003545f919073ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000835b83811015610718578173ffffffffffffffffffffffffffffffffffffffff1663662aa11d60028381548110610665576106656111b9565b5f9182526020909120015460405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff918216600482015290861660248201526044016020604051808303815f875af11580156106e0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070491906111e6565b61070e908661128b565b945060010161062e565b5050505090565b60608167ffffffffffffffff81111561073a5761073a6111fd565b60405190808252806020026020018201604052801561076d57816020015b60608152602001906001900390816107585790505b5090505f5b82811015610800576107db30858584818110610790576107906111b9565b90506020028101906107a2919061122a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610afa92505050565b8282815181106107ed576107ed6111b9565b6020908102919091010152600101610772565b505b92915050565b610810610885565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092555f8054604051929316917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a350565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146102d9576040517fbfcafd3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091555f805473ffffffffffffffffffffffffffffffffffffffff848116938216841783556040519116929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040515f6040518083038185875af1925050503d805f81146109ac576040519150601f19603f3d011682016040523d82523d5f602084013e6109b1565b606091505b509150915081156109c457809250610557565b8051156109d45780518082602001fd5b6040517f3204506f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610a93908490610bb5565b505050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051610ac191906112c3565b5f604051808303815f865af19150503d805f81146109ac576040519150601f19603f3d011682016040523d82523d5f602084013e6109b1565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051610b2391906112c3565b5f60405180830381855af49150503d805f8114610b5b576040519150601f19603f3d011682016040523d82523d5f602084013e610b60565b606091505b50915091508115610b7357809250610557565b805115610b835780518082602001fd5b6040517f18cecad500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610bd673ffffffffffffffffffffffffffffffffffffffff841683610c4e565b905080515f14158015610bfa575080806020019051810190610bf891906112de565b155b15610a93576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b6060610c5b83835f610c62565b9392505050565b606081471015610ca0576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610c45565b5f808573ffffffffffffffffffffffffffffffffffffffff168486604051610cc891906112c3565b5f6040518083038185875af1925050503d805f8114610d02576040519150601f19603f3d011682016040523d82523d5f602084013e610d07565b606091505b5091509150610d17868383610d21565b9695505050505050565b606082610d3657610d3182610db0565b610c5b565b8151158015610d5a575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610da9576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610c45565b5080610c5b565b805115610dc05780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828054828255905f5260205f20908101928215610e68579160200282015b82811115610e685781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190610e10565b50610e74929150610e78565b5090565b5b80821115610e74575f8155600101610e79565b5f8083601f840112610e9c575f80fd5b50813567ffffffffffffffff811115610eb3575f80fd5b6020830191508360208260051b8501011115610ecd575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ef7575f80fd5b919050565b5f805f60408486031215610f0e575f80fd5b833567ffffffffffffffff811115610f24575f80fd5b610f3086828701610e8c565b9094509250610f43905060208501610ed4565b90509250925092565b5f805f60408486031215610f5e575f80fd5b610f6784610ed4565b9250602084013567ffffffffffffffff811115610f82575f80fd5b610f8e86828701610e8c565b9497909650939450505050565b5f8060208385031215610fac575f80fd5b823567ffffffffffffffff811115610fc2575f80fd5b610fce85828601610e8c565b90969095509350505050565b5f5b83811015610ff4578181015183820152602001610fdc565b50505f910152565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b828110156110a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281518051808752611066818989018a8501610fda565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01695909501860194509285019290850190600101611021565b5092979650505050505050565b604080825283519082018190525f906020906060840190828701845b828110156110fe57815173ffffffffffffffffffffffffffffffffffffffff16845292840192908401906001016110cc565b505050809250505073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b5f60208284031215611139575f80fd5b610c5b82610ed4565b604080825281018390525f8460608301825b8681101561118f5773ffffffffffffffffffffffffffffffffffffffff61117a84610ed4565b16825260209283019290910190600101611154565b50809250505073ffffffffffffffffffffffffffffffffffffffff83166020830152949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156111f6575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261125d575f80fd5b83018035915067ffffffffffffffff821115611277575f80fd5b602001915036819003821315610ecd575f80fd5b80820180821115610802577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f82516112d4818460208701610fda565b9190910192915050565b5f602082840312156112ee575f80fd5b81518015158114610c5b575f80fdfea2646970667358221220a253ca8abea08fe64843347f2d5803bd7fb711f102a2a6fcdbc09c8afefa8c8e64736f6c63430008180033000000000000000000000000a214a4fc09c42202c404e2976c50373fe5f5b7890000000000000000000000004300000000000000000000000000000000000002
Deployed Bytecode
0x6080604052600436106100c6575f3560e01c80638eda1c5911610071578063ac9650d81161004c578063ac9650d8146101e2578063e30c3978146101f5578063f2fde38b1461021f575f80fd5b80638eda1c591461018a57806399acac8c146101aa578063a95d6b1c146101cc575f80fd5b806379ba5097116100a157806379ba5097146101465780638a179be41461014e5780638da5cb5b14610161575f80fd5b8063175e1a7d146100d157806320d6b04c14610129578063715018a61461013e575f80fd5b366100cd57005b5f80fd5b3480156100dc575f80fd5b507f00000000000000000000000043000000000000000000000000000000000000025b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61013c610137366004610efc565b610232565b005b61013c6102c8565b61013c6102db565b61013c61015c366004610f4c565b61033a565b34801561016c575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100ff565b61019d610198366004610f9b565b61044d565b6040516101209190610ffc565b3480156101b5575f80fd5b506101be61055f565b6040516101209291906110b0565b6101d46105ec565b604051908152602001610120565b61019d6101f0366004610f9b565b61071f565b348015610200575f80fd5b5060015473ffffffffffffffffffffffffffffffffffffffff166100ff565b61013c61022d366004611129565b610808565b61023a610885565b61024660028484610df2565b50600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790556040517f889d8928c287623c816019afaa141e71deee2558964cace4d420cea5bb015631906102bb90859085908590611142565b60405180910390a1505050565b6102d0610885565b6102d95f6108d5565b565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461032e576040517f3d6f519e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610337816108d5565b50565b610342610885565b5f5b81811015610447575f83838381811061035f5761035f6111b9565b90506020020160208101906103749190611129565b905073ffffffffffffffffffffffffffffffffffffffff81166103a15761039b8547610953565b5061043e565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152819061043c908290889073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610413573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061043791906111e6565b610a06565b505b50600101610344565b50505050565b6060610457610885565b7f00000000000000000000000043000000000000000000000000000000000000028267ffffffffffffffff811115610491576104916111fd565b6040519080825280602002602001820160405280156104c457816020015b60608152602001906001900390816104af5790505b5091505f5b8381101561055757610532828686848181106104e7576104e76111b9565b90506020028101906104f9919061122a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610a9892505050565b838281518110610544576105446111b9565b60209081029190910101526001016104c9565b505092915050565b60605f60028054806020026020016040519081016040528092919081815260200182805480156105c357602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610598575b5050600354939673ffffffffffffffffffffffffffffffffffffffff9094169550929350505050565b6002546003545f919073ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000004300000000000000000000000000000000000002835b83811015610718578173ffffffffffffffffffffffffffffffffffffffff1663662aa11d60028381548110610665576106656111b9565b5f9182526020909120015460405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff918216600482015290861660248201526044016020604051808303815f875af11580156106e0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070491906111e6565b61070e908661128b565b945060010161062e565b5050505090565b60608167ffffffffffffffff81111561073a5761073a6111fd565b60405190808252806020026020018201604052801561076d57816020015b60608152602001906001900390816107585790505b5090505f5b82811015610800576107db30858584818110610790576107906111b9565b90506020028101906107a2919061122a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610afa92505050565b8282815181106107ed576107ed6111b9565b6020908102919091010152600101610772565b505b92915050565b610810610885565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092555f8054604051929316917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a350565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146102d9576040517fbfcafd3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091555f805473ffffffffffffffffffffffffffffffffffffffff848116938216841783556040519116929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040515f6040518083038185875af1925050503d805f81146109ac576040519150601f19603f3d011682016040523d82523d5f602084013e6109b1565b606091505b509150915081156109c457809250610557565b8051156109d45780518082602001fd5b6040517f3204506f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610a93908490610bb5565b505050565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051610ac191906112c3565b5f604051808303815f865af19150503d805f81146109ac576040519150601f19603f3d011682016040523d82523d5f602084013e6109b1565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051610b2391906112c3565b5f60405180830381855af49150503d805f8114610b5b576040519150601f19603f3d011682016040523d82523d5f602084013e610b60565b606091505b50915091508115610b7357809250610557565b805115610b835780518082602001fd5b6040517f18cecad500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610bd673ffffffffffffffffffffffffffffffffffffffff841683610c4e565b905080515f14158015610bfa575080806020019051810190610bf891906112de565b155b15610a93576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b6060610c5b83835f610c62565b9392505050565b606081471015610ca0576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610c45565b5f808573ffffffffffffffffffffffffffffffffffffffff168486604051610cc891906112c3565b5f6040518083038185875af1925050503d805f8114610d02576040519150601f19603f3d011682016040523d82523d5f602084013e610d07565b606091505b5091509150610d17868383610d21565b9695505050505050565b606082610d3657610d3182610db0565b610c5b565b8151158015610d5a575073ffffffffffffffffffffffffffffffffffffffff84163b155b15610da9576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610c45565b5080610c5b565b805115610dc05780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828054828255905f5260205f20908101928215610e68579160200282015b82811115610e685781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190610e10565b50610e74929150610e78565b5090565b5b80821115610e74575f8155600101610e79565b5f8083601f840112610e9c575f80fd5b50813567ffffffffffffffff811115610eb3575f80fd5b6020830191508360208260051b8501011115610ecd575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610ef7575f80fd5b919050565b5f805f60408486031215610f0e575f80fd5b833567ffffffffffffffff811115610f24575f80fd5b610f3086828701610e8c565b9094509250610f43905060208501610ed4565b90509250925092565b5f805f60408486031215610f5e575f80fd5b610f6784610ed4565b9250602084013567ffffffffffffffff811115610f82575f80fd5b610f8e86828701610e8c565b9497909650939450505050565b5f8060208385031215610fac575f80fd5b823567ffffffffffffffff811115610fc2575f80fd5b610fce85828601610e8c565b90969095509350505050565b5f5b83811015610ff4578181015183820152602001610fdc565b50505f910152565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b828110156110a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281518051808752611066818989018a8501610fda565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01695909501860194509285019290850190600101611021565b5092979650505050505050565b604080825283519082018190525f906020906060840190828701845b828110156110fe57815173ffffffffffffffffffffffffffffffffffffffff16845292840192908401906001016110cc565b505050809250505073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b5f60208284031215611139575f80fd5b610c5b82610ed4565b604080825281018390525f8460608301825b8681101561118f5773ffffffffffffffffffffffffffffffffffffffff61117a84610ed4565b16825260209283019290910190600101611154565b50809250505073ffffffffffffffffffffffffffffffffffffffff83166020830152949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156111f6575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261125d575f80fd5b83018035915067ffffffffffffffff821115611277575f80fd5b602001915036819003821315610ecd575f80fd5b80820180821115610802577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f82516112d4818460208701610fda565b9190910192915050565b5f602082840312156112ee575f80fd5b81518015158114610c5b575f80fdfea2646970667358221220a253ca8abea08fe64843347f2d5803bd7fb711f102a2a6fcdbc09c8afefa8c8e64736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a214a4fc09c42202c404e2976c50373fe5f5b7890000000000000000000000004300000000000000000000000000000000000002
-----Decoded View---------------
Arg [0] : owner_ (address): 0xA214a4fc09C42202C404E2976c50373fE5F5B789
Arg [1] : blast_ (address): 0x4300000000000000000000000000000000000002
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a214a4fc09c42202c404e2976c50373fe5f5b789
Arg [1] : 0000000000000000000000004300000000000000000000000000000000000002
Deployed Bytecode Sourcemap
44791:2509:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39108:97;;;;;;;;;;-1:-1:-1;39191:6:0;39108:97;;;190:42:1;178:55;;;160:74;;148:2;133:18;39108:97:0;;;;;;;;47033:264;;;;;;:::i;:::-;;:::i;:::-;;41963:112;;;:::i;42671:212::-;;;:::i;43390:500::-;;;;;;:::i;:::-;;:::i;41144:97::-;;;;;;;;;;-1:-1:-1;41191:14:0;41227:6;;;41144:97;;46473:340;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45502:199::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;45867:328::-;;;:::i;:::-;;;4651:25:1;;;4639:2;4624:18;45867:328:0;4505:177:1;39827:349:0;;;;;;:::i;:::-;;:::i;41374:125::-;;;;;;;;;;-1:-1:-1;41478:13:0;;;;41374:125;;42331:180;;;;;;:::i;:::-;;:::i;47033:264::-;40871:13;:11;:13::i;:::-;47163:29:::1;:13;47179::::0;;47163:29:::1;:::i;:::-;-1:-1:-1::0;47203:12:0::1;:24:::0;;;::::1;;::::0;::::1;;::::0;;47243:46:::1;::::0;::::1;::::0;::::1;::::0;47264:13;;;;47203:24;;47243:46:::1;:::i;:::-;;;;;;;;47033:264:::0;;;:::o;41963:112::-;40871:13;:11;:13::i;:::-;42037:30:::1;42064:1;42037:18;:30::i;:::-;41963:112::o:0;42671:212::-;42774:13;;42750:10;;42774:23;:13;:23;;42771:67;;42806:32;;;;;;;;;;;;;;42771:67;42849:26;42868:6;42849:18;:26::i;:::-;42722:161;42671:212::o;43390:500::-;40871:13;:11;:13::i;:::-;43509:9:::1;43505:378;43524:17:::0;;::::1;43505:378;;;43563:13;43579:6;;43586:1;43579:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;43563:25:::0;-1:-1:-1;43606:19:0::1;::::0;::::1;43603:269;;43646:57;43670:8;43681:21;43646:15;:57::i;:::-;;43603:269;;;43827:28;::::0;;;;43849:4:::1;43827:28;::::0;::::1;160:74:1::0;43764:5:0;;43789:67:::1;::::0;43764:5;;43817:8;;43827:13:::1;::::0;::::1;::::0;::::1;::::0;133:18:1;;43827:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43789:22;:67::i;:::-;43725:147;43603:269;-1:-1:-1::0;43543:3:0::1;;43505:378;;;;43390:500:::0;;;:::o;46473:340::-;46570:22;40871:13;:11;:13::i;:::-;39191:6;46657:9;46645:29:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46635:39;;46689:9;46685:121;46704:20:::0;;::::1;46685:121;;;46759:35;46778:1;46781:9;;46791:1;46781:12;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;46759:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;46759:18:0::1;::::0;-1:-1:-1;;;46759:35:0:i:1;:::-;46746:7;46754:1;46746:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:48;46726:3:::1;;46685:121;;;;46594:219;46473:340:::0;;;;:::o;45502:199::-;45561:30;45593:20;45642:13;45626:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45681:12:0;;45626:29;;45681:12;;;;;-1:-1:-1;45502:199:0;;-1:-1:-1;;;;45502:199:0:o;45867:328::-;45970:13;:20;46015:12;;45922:21;;45970:20;46015:12;;39191:6;45922:21;46075:113;46098:3;46094:1;:7;46075:113;;;46140:1;:13;;;46154;46168:1;46154:16;;;;;;;;:::i;:::-;;;;;;;;;;;46140:36;;;;;;;;;;46154:16;;;;46140:36;;;7057:34:1;7127:15;;;7107:18;;;7100:43;6969:18;;46140:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46123:53;;;;:::i;:::-;;-1:-1:-1;46103:3:0;;46075:113;;;;45945:250;;;45867:328;:::o;39827:349::-;39903:22;39960:4;39948:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39938:34;;39988:9;39983:161;40003:15;;;39983:161;;;40050:50;40085:4;40092;;40097:1;40092:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;40050:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40050:26:0;;-1:-1:-1;;;40050:50:0:i;:::-;40037:7;40045:1;40037:10;;;;;;;;:::i;:::-;;;;;;;;;;:63;40127:3;;39983:161;;;;39827:349;;;;;:::o;42331:180::-;40871:13;:11;:13::i;:::-;42421::::1;:24:::0;;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;42486:6:0;;42461:42:::1;::::0;42421:24;;42486:6:::1;::::0;42461:42:::1;::::0;-1:-1:-1;42461:42:0::1;42331:180:::0;:::o;44087:113::-;44138:6;;:20;:6;44148:10;44138:20;44135:57;;44167:25;;;;;;;;;;;;;;44393:220;44459:13;:26;;;;;;;;;44483:1;44515:6;;44459:26;44532:17;;;;;;;;;;44565:40;;44515:6;;;44532:17;44515:6;;44565:40;;44483:1;44565:40;44448:165;44393:220;:::o;26993:872::-;27086:19;27179:12;27193:23;27220:6;:11;;27238:5;27220:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27178:70;;;;27262:7;27259:599;;;27295:10;27286:19;;27259:599;;;27408:17;;:21;27405:442;;27669:10;27663:17;27730:15;27717:10;27713:2;27709:19;27702:44;27405:442;27812:19;;;;;;;;;;;;;;7874:162;7984:43;;;7999:14;7840:55:1;;7984:43:0;;;7822:74:1;7912:18;;;;7905:34;;;7984:43:0;;;;;;;;;;7795:18:1;;;;7984:43:0;;;;;;;;;;;;;;7957:71;;7977:5;;7957:19;:71::i;:::-;7874:162;;;:::o;28241:868::-;28341:19;28434:12;28448:23;28475:6;:11;;28487:4;28475:17;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30783:892;30891:19;30984:12;30998:23;31025:6;:19;;31045:4;31025:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30983:67;;;;31064:7;31061:607;;;31097:10;31088:19;;31061:607;;;31210:17;;:21;31207:450;;31471:10;31465:17;31532:15;31519:10;31515:2;31511:19;31504:44;31207:450;31614:27;;;;;;;;;;;;;;10685:638;11109:23;11135:33;:27;;;11163:4;11135:27;:33::i;:::-;11109:59;;11183:10;:17;11204:1;11183:22;;:57;;;;;11221:10;11210:30;;;;;;;;;;;;:::i;:::-;11209:31;11183:57;11179:137;;;11264:40;;;;;190:42:1;178:55;;11264:40:0;;;160:74:1;133:18;;11264:40:0;;;;;;;;15167:153;15242:12;15274:38;15296:6;15304:4;15310:1;15274:21;:38::i;:::-;15267:45;15167:153;-1:-1:-1;;;15167:153:0:o;15655:398::-;15754:12;15807:5;15783:21;:29;15779:110;;;15836:41;;;;;15871:4;15836:41;;;160:74:1;133:18;;15836:41:0;14:226:1;15779:110:0;15900:12;15914:23;15941:6;:11;;15960:5;15967:4;15941:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15899:73;;;;15990:55;16017:6;16025:7;16034:10;15990:26;:55::i;:::-;15983:62;15655:398;-1:-1:-1;;;;;;15655:398:0:o;17131:597::-;17279:12;17309:7;17304:417;;17333:19;17341:10;17333:7;:19::i;:::-;17304:417;;;17561:17;;:22;:49;;;;-1:-1:-1;17587:18:0;;;;:23;17561:49;17557:121;;;17638:24;;;;;190:42:1;178:55;;17638:24:0;;;160:74:1;133:18;;17638:24:0;14:226:1;17557:121:0;-1:-1:-1;17699:10:0;17692:17;;18281:528;18414:17;;:21;18410:392;;18646:10;18640:17;18703:15;18690:10;18686:2;18682:19;18675:44;18410:392;18773:17;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;245:367:1;308:8;318:6;372:3;365:4;357:6;353:17;349:27;339:55;;390:1;387;380:12;339:55;-1:-1:-1;413:20:1;;456:18;445:30;;442:50;;;488:1;485;478:12;442:50;525:4;517:6;513:17;501:29;;585:3;578:4;568:6;565:1;561:14;553:6;549:27;545:38;542:47;539:67;;;602:1;599;592:12;539:67;245:367;;;;;:::o;617:196::-;685:20;;745:42;734:54;;724:65;;714:93;;803:1;800;793:12;714:93;617:196;;;:::o;818:511::-;913:6;921;929;982:2;970:9;961:7;957:23;953:32;950:52;;;998:1;995;988:12;950:52;1038:9;1025:23;1071:18;1063:6;1060:30;1057:50;;;1103:1;1100;1093:12;1057:50;1142:70;1204:7;1195:6;1184:9;1180:22;1142:70;:::i;:::-;1231:8;;-1:-1:-1;1116:96:1;-1:-1:-1;1285:38:1;;-1:-1:-1;1319:2:1;1304:18;;1285:38;:::i;:::-;1275:48;;818:511;;;;;:::o;1334:::-;1429:6;1437;1445;1498:2;1486:9;1477:7;1473:23;1469:32;1466:52;;;1514:1;1511;1504:12;1466:52;1537:29;1556:9;1537:29;:::i;:::-;1527:39;;1617:2;1606:9;1602:18;1589:32;1644:18;1636:6;1633:30;1630:50;;;1676:1;1673;1666:12;1630:50;1715:70;1777:7;1768:6;1757:9;1753:22;1715:70;:::i;:::-;1334:511;;1804:8;;-1:-1:-1;1689:96:1;;-1:-1:-1;;;;1334:511:1:o;1850:448::-;1947:6;1955;2008:2;1996:9;1987:7;1983:23;1979:32;1976:52;;;2024:1;2021;2014:12;1976:52;2064:9;2051:23;2097:18;2089:6;2086:30;2083:50;;;2129:1;2126;2119:12;2083:50;2168:70;2230:7;2221:6;2210:9;2206:22;2168:70;:::i;:::-;2257:8;;2142:96;;-1:-1:-1;1850:448:1;-1:-1:-1;;;;1850:448:1:o;2303:250::-;2388:1;2398:113;2412:6;2409:1;2406:13;2398:113;;;2488:11;;;2482:18;2469:11;;;2462:39;2434:2;2427:10;2398:113;;;-1:-1:-1;;2545:1:1;2527:16;;2520:27;2303:250::o;2558:1130::-;2718:4;2747:2;2787;2776:9;2772:18;2817:2;2806:9;2799:21;2840:6;2875;2869:13;2906:6;2898;2891:22;2944:2;2933:9;2929:18;2922:25;;3006:2;2996:6;2993:1;2989:14;2978:9;2974:30;2970:39;2956:53;;3044:2;3036:6;3032:15;3065:1;3075:584;3089:6;3086:1;3083:13;3075:584;;;3178:66;3166:9;3158:6;3154:22;3150:95;3145:3;3138:108;3275:6;3269:13;3317:2;3311:9;3348:8;3340:6;3333:24;3370:74;3435:8;3430:2;3422:6;3418:15;3413:2;3409;3405:11;3370:74;:::i;:::-;3501:2;3487:17;3506:66;3483:90;3471:103;;;;3467:112;;;-1:-1:-1;3637:12:1;;;;3602:15;;;;3111:1;3104:9;3075:584;;;-1:-1:-1;3676:6:1;;2558:1130;-1:-1:-1;;;;;;;2558:1130:1:o;3693:807::-;3911:2;3923:21;;;3993:13;;3896:18;;;4015:22;;;3863:4;;4090;;4068:2;4053:18;;;4117:17;;;3863:4;4162:218;4176:6;4173:1;4170:13;4162:218;;;4241:13;;4256:42;4237:62;4225:75;;4320:12;;;;4355:15;;;;4198:1;4191:9;4162:218;;;4166:3;;;4397;4389:11;;;;4450:42;4442:6;4438:55;4431:4;4420:9;4416:20;4409:85;3693:807;;;;;:::o;4687:186::-;4746:6;4799:2;4787:9;4778:7;4774:23;4770:32;4767:52;;;4815:1;4812;4805:12;4767:52;4838:29;4857:9;4838:29;:::i;4878:787::-;5106:2;5118:21;;;5091:18;;5174:22;;;5058:4;5253:6;5227:2;5212:18;;5058:4;5287:258;5301:6;5298:1;5295:13;5287:258;;;5394:42;5366:26;5385:6;5366:26;:::i;:::-;5362:75;5350:88;;5461:4;5520:15;;;;5485:12;;;;5323:1;5316:9;5287:258;;;5291:3;5562;5554:11;;;;5615:42;5607:6;5603:55;5596:4;5585:9;5581:20;5574:85;4878:787;;;;;;:::o;5670:184::-;5722:77;5719:1;5712:88;5819:4;5816:1;5809:15;5843:4;5840:1;5833:15;5859:184;5929:6;5982:2;5970:9;5961:7;5957:23;5953:32;5950:52;;;5998:1;5995;5988:12;5950:52;-1:-1:-1;6021:16:1;;5859:184;-1:-1:-1;5859:184:1:o;6048:::-;6100:77;6097:1;6090:88;6197:4;6194:1;6187:15;6221:4;6218:1;6211:15;6237:580;6314:4;6320:6;6380:11;6367:25;6470:66;6459:8;6443:14;6439:29;6435:102;6415:18;6411:127;6401:155;;6552:1;6549;6542:12;6401:155;6579:33;;6631:20;;;-1:-1:-1;6674:18:1;6663:30;;6660:50;;;6706:1;6703;6696:12;6660:50;6739:4;6727:17;;-1:-1:-1;6770:14:1;6766:27;;;6756:38;;6753:58;;;6807:1;6804;6797:12;7154:279;7219:9;;;7240:10;;;7237:190;;;7283:77;7280:1;7273:88;7384:4;7381:1;7374:15;7412:4;7409:1;7402:15;7950:287;8079:3;8117:6;8111:13;8133:66;8192:6;8187:3;8180:4;8172:6;8168:17;8133:66;:::i;:::-;8215:16;;;;;7950:287;-1:-1:-1;;7950:287:1:o;8242:277::-;8309:6;8362:2;8350:9;8341:7;8337:23;8333:32;8330:52;;;8378:1;8375;8368:12;8330:52;8410:9;8404:16;8463:5;8456:13;8449:21;8442:5;8439:32;8429:60;;8485:1;8482;8475:12
Swarm Source
ipfs://a253ca8abea08fe64843347f2d5803bd7fb711f102a2a6fcdbc09c8afefa8c8e
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.