Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
262287 | 330 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
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
[{"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
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.