Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 12 from a total of 12 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Operators | 5587117 | 159 days ago | IN | 0 ETH | 0 | ||||
Set Operators | 4710331 | 179 days ago | IN | 0 ETH | 0.00000584 | ||||
Set Operators | 4686085 | 180 days ago | IN | 0 ETH | 0.00000049 | ||||
Set Operators | 4452106 | 185 days ago | IN | 0 ETH | 0.00000049 | ||||
Set Operators | 4423192 | 186 days ago | IN | 0 ETH | 0.00000049 | ||||
Set Operators | 4106279 | 193 days ago | IN | 0 ETH | 0.00000057 | ||||
Set Operators | 4070287 | 194 days ago | IN | 0 ETH | 0.00000032 | ||||
Set Operators | 3293460 | 212 days ago | IN | 0 ETH | 0 | ||||
Set Operators | 2960285 | 220 days ago | IN | 0 ETH | 0 | ||||
Set Operators | 2917107 | 221 days ago | IN | 0 ETH | 0 | ||||
Set Operators | 2868962 | 222 days ago | IN | 0 ETH | 0 | ||||
Set Operators | 1309702 | 258 days ago | IN | 0 ETH | 0.00000003 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
1307412 | 258 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:
AgentRegistry
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 200000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: none pragma solidity 0.8.24; import { Multicall } from "./Multicall.sol"; import { IAgentRegistry } from "./../interfaces/utils/IAgentRegistry.sol"; import { Blastable } from "./Blastable.sol"; import { Errors } from "./../libraries/Errors.sol"; import { Ownable2Step } from "./../utils/Ownable2Step.sol"; /** * @title AgentRegistry * @author AgentFi * @notice Tracks Agents, NFTs, and TBAs in the AgentFi ecosystem. * * Does NOT replace the ERC6551Registry, merely an enumeration on top of it. */ contract AgentRegistry is IAgentRegistry, Blastable, Ownable2Step, Multicall { /*************************************** STATE VARIABLES ***************************************/ // the addresses that can register new tbas mapping(address => bool) internal _isOperator; // collection => agentID => tbas mapping(address => mapping(uint256 => AgentInfo[])) internal _agentInfo; // agent tba address => info about the associated nft mapping(address => TokenInfo) internal _agentAddressToInfo; /*************************************** CONSTRUCTOR ***************************************/ /** * @notice Constructs the AgentRegistry contract. * @param owner_ The owner of the contract. * @param blast_ The address of the blast gas reward contract. * @param gasCollector_ The address of the gas collector. * @param blastPoints_ The address of the blast points contract. * @param pointsOperator_ The address of the blast points operator. */ constructor( address owner_, address blast_, address gasCollector_, address blastPoints_, address pointsOperator_ ) Blastable(blast_, gasCollector_, blastPoints_, pointsOperator_) { _transferOwnership(owner_); } /*************************************** VIEW FUNCTIONS ***************************************/ /** * @notice Returns true if the account is an operator. * @param account The account to query. * @return isAuthorized True if is an operator, false otherwise. */ function isOperator(address account) external view override returns (bool isAuthorized) { isAuthorized = _isOperator[account]; } /** * @notice Returns the list of known agent TBAs for an agent NFT. * @param collection The address of the collection to query. * @param agentID The ID of the agent to query. * @return tbas The list of registered TBAs for this agent. */ function getTbasOfNft(address collection, uint256 agentID) external view override returns (AgentInfo[] memory tbas) { tbas = _agentInfo[collection][agentID]; } /** * @notice Returns the NFT associated with an agent TBA. * Returns zeros if not registered. * @param tba The address of the TBA to query. * @return collection The address of the NFT collection. * @return agentID The ID of the agent. */ function getNftOfTba(address tba) external view override returns (address collection, uint256 agentID) { TokenInfo memory info = _agentAddressToInfo[tba]; collection = info.collection; agentID = info.agentID; } /** * @notice Returns true if the TBA is known. * @param tba The address of the TBA to query. * @return isRegistered True if the agent is registerd, false otherwise. */ function isTbaRegisteredAgent(address tba) external view override returns (bool isRegistered) { TokenInfo storage info = _agentAddressToInfo[tba]; isRegistered = (info.collection != address(0)); } /*************************************** OPERATOR FUNCTIONS ***************************************/ /** * @notice Registers a new agent. * Can only be called by an operator. * @param params The agent to register. */ function registerAgent(RegisterAgentParam calldata params) external payable override { _validateSenderIsOperator(); _registerAgent(params); } /** * @notice Registers a new agent. Fails gracefully if the agent has already been registered. * Can only be called by an operator. * @param params The agent to register. */ function tryRegisterAgent(RegisterAgentParam calldata params) external payable override { _validateSenderIsOperator(); _tryRegisterAgent(params); } /** * @notice Registers a list of new agents. * Can only be called by an operator. * @param params The agents to register. */ function registerAgents(RegisterAgentParam[] calldata params) external payable override { _validateSenderIsOperator(); for(uint256 i = 0; i < params.length; ++i) { _registerAgent(params[i]); } } /** * @notice Registers a list of new agents. Fails gracefully if the agent has already been registered. * Can only be called by an operator. * @param params The agents to register. */ function tryRegisterAgents(RegisterAgentParam[] calldata params) external payable override { _validateSenderIsOperator(); for(uint256 i = 0; i < params.length; ++i) { _tryRegisterAgent(params[i]); } } /*************************************** OWNER FUNCTIONS ***************************************/ /** * @notice Sets the status of a list of operators. * Can only be called by the contract owner. * @param params The list to set. */ function setOperators(SetOperatorParam[] calldata params) external payable override onlyOwner { for(uint256 i = 0; i < params.length; ++i) { _isOperator[params[i].account] = params[i].isAuthorized; emit OperatorSet(params[i].account, params[i].isAuthorized); } } /*************************************** HELPER FUNCTIONS ***************************************/ /** * @notice Reverts if `msg.sender` is not an operator. */ function _validateSenderIsOperator() internal view { if(!_isOperator[msg.sender]) revert Errors.NotOperator(); } /** * @notice Registers a new agent. * @param params The agent to register. */ function _registerAgent(RegisterAgentParam calldata params) internal { TokenInfo storage info = _agentAddressToInfo[params.agentAddress]; if(info.collection != address(0)) revert Errors.AlreadyRegistered(); info.collection = params.collection; info.agentID = params.agentID; _agentInfo[params.collection][params.agentID].push(AgentInfo({ agentAddress: params.agentAddress, implementationAddress: params.implementationAddress })); emit AgentRegistered(params.agentAddress, params.collection, params.agentID); } /** * @notice Registers a new agent. * @param params The agent to register. */ function _tryRegisterAgent(RegisterAgentParam calldata params) internal { TokenInfo storage info = _agentAddressToInfo[params.agentAddress]; if(info.collection != address(0)) return; info.collection = params.collection; info.agentID = params.agentID; _agentInfo[params.collection][params.agentID].push(AgentInfo({ agentAddress: params.agentAddress, implementationAddress: params.implementationAddress })); emit AgentRegistered(params.agentAddress, params.collection, params.agentID); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC20Permit} from "../extensions/IERC20Permit.sol"; import {Address} from "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } }
// SPDX-License-Identifier: none pragma solidity 0.8.24; /** * @title IAgentRegistry * @author AgentFi * @notice Tracks Agents, NFTs, and TBAs in the AgentFi ecosystem. * * Does NOT replace the ERC6551Registry, merely an enumeration on top of it. */ interface IAgentRegistry { /*************************************** STATE VARIABLES ***************************************/ /// @notice Emitted when an operator is added or removed. event OperatorSet(address indexed account, bool isOperator); /// @notice Emitted when an agent is registered. event AgentRegistered(address indexed agentAddress, address indexed collection, uint256 indexed agentID); struct AgentInfo { address agentAddress; address implementationAddress; } struct TokenInfo { address collection; uint256 agentID; } /*************************************** VIEW FUNCTIONS ***************************************/ /** * @notice Returns true if the account is an operator. * @param account The account to query. * @return isAuthorized True if is an operator, false otherwise. */ function isOperator(address account) external view returns (bool isAuthorized); /** * @notice Returns the list of known agent TBAs for an agent NFT. * @param collection The address of the collection to query. * @param agentID The ID of the agent to query. * @return tbas The list of registered TBAs for this agent. */ function getTbasOfNft(address collection, uint256 agentID) external view returns (AgentInfo[] memory tbas); /** * @notice Returns the NFT associated with an agent TBA. * Returns zeros if not registered. * @param tba The address of the TBA to query. * @return collection The address of the NFT collection. * @return agentID The ID of the agent. */ function getNftOfTba(address tba) external view returns (address collection, uint256 agentID); /** * @notice Returns true if the TBA is known. * @param tba The address of the TBA to query. * @return isRegistered True if the agent is registerd, false otherwise. */ function isTbaRegisteredAgent(address tba) external view returns (bool isRegistered); /*************************************** OPERATOR FUNCTIONS ***************************************/ struct RegisterAgentParam { address agentAddress; address implementationAddress; address collection; uint256 agentID; } /** * @notice Registers a new agent. * Can only be called by an operator. * @param params The agent to register. */ function registerAgent(RegisterAgentParam calldata params) external payable; /** * @notice Registers a new agent. Fails gracefully if the agent has already been registered. * Can only be called by an operator. * @param params The agent to register. */ function tryRegisterAgent(RegisterAgentParam calldata params) external payable; /** * @notice Registers a list of new agents. * Can only be called by an operator. * @param params The agents to register. */ function registerAgents(RegisterAgentParam[] calldata params) external payable; /** * @notice Registers a list of new agents. Fails gracefully if the agent has already been registered. * Can only be called by an operator. * @param params The agents to register. */ function tryRegisterAgents(RegisterAgentParam[] calldata params) external payable; /*************************************** OWNER FUNCTIONS ***************************************/ struct SetOperatorParam { address account; bool isAuthorized; } /** * @notice Sets the status of a list of operators. * Can only be called by the contract owner. * @param params The list to set. */ function setOperators(SetOperatorParam[] calldata params) external payable; }
// SPDX-License-Identifier: none pragma solidity 0.8.24; /** * @title IBlastable * @author AgentFi * @notice An abstract contract that configures the connection to Blast during deployment * * This involves collecting ETH yield, gas rewards, and Blast Points. ETH yield is earned by this contract automatically, while gas rewards and Blast Points are delegated to dedicated collectors. */ 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_); /** * @notice Returns the address of the BlastPoints contract. * @return blastPoints_ The adress of the BlastPoints contract. */ function blastPoints() external view returns (address blastPoints_); }
// SPDX-License-Identifier: none 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); }
// SPDX-License-Identifier: none 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; }
// SPDX-License-Identifier: none pragma solidity 0.8.24; import { Errors } from "./Errors.sol"; /** * @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) { if (address(this).balance < value) { revert Errors.InsufficientBalance(); } // 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) { if (address(this).balance < value) { revert Errors.InsufficientBalance(); } // 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(); } }
// SPDX-License-Identifier: none pragma solidity 0.8.24; /** * @title Errors * @author AgentFi * @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(); /// @notice Thrown when the sender has an insufficient balance of the token they are sending. error InsufficientBalance(); // 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(); /// @notice Thrown when gas token values do not match. error ValueMismatch(); /// @notice Thrown when an entry has already been registered. error AlreadyRegistered(); // 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 over the max public mint. error OverMaxPublicMint(); /// @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(); /// @notice Thrown when minting from the treasury allocation before treasury mint starts. error TreasuryMintNotStarted(); /// @notice Thrown when not paying enough to mint an nft. error InsufficientPayment(); /// @notice Thrown when minting from the treasury allocation without approval. error NotTreasuryMinter(); /// @notice Thrown when minting more agents than allowed per user. error OverMaxCreationsPerUser(); /// @notice Thrown when minting more agents than allowed per agent. error OverMaxCreationsPerAgent(); // 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(); /// @notice Thrown when calling the dispatcher without the operator role. error NotOperator(); // erc6551 errors 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(); }
// SPDX-License-Identifier: none pragma solidity 0.8.24; import { IBlastable } from "./../interfaces/utils/IBlastable.sol"; /** * @title Blastable * @author AgentFi * @notice An abstract contract that configures the connection to Blast during deployment * * This involves collecting ETH yield, gas rewards, and Blast Points. ETH yield is earned by this contract automatically, while gas rewards and Blast Points are delegated to dedicated collectors. */ abstract contract Blastable is IBlastable { address internal immutable __blast; address internal immutable __gasCollector; address internal immutable __blastPoints; address internal immutable __pointsOperator; /** * @notice Constructs the Blastable contract. * Configures the contract to receive automatic yield, claimable gas, and assigns a gas collector. * @param blast_ The address of the blast gas reward contract. * @param gasCollector_ The address of the gas collector. * @param blastPoints_ The address of the blast points contract. * @param pointsOperator_ The address of the blast points operator. */ constructor( address blast_, address gasCollector_, address blastPoints_, address pointsOperator_ ) { __blast = blast_; __gasCollector = gasCollector_; __blastPoints = blastPoints_; __pointsOperator = pointsOperator_; // allow these calls to fail on local fork // check success after deployment blast_.call(abi.encodeWithSignature("configureAutomaticYield()")); blast_.call(abi.encodeWithSignature("configureClaimableGas()")); if(gasCollector_ != address(0)) blast_.call(abi.encodeWithSignature("configureGovernor(address)", gasCollector_)); if(pointsOperator_ != address(0)) blastPoints_.call(abi.encodeWithSignature("configurePointsOperator(address)", pointsOperator_)); } /** * @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 Returns the address of the BlastPoints contract. * @return blastPoints_ The adress of the BlastPoints contract. */ function blastPoints() public view override returns (address blastPoints_) { blastPoints_ = __blastPoints; } /** * @notice Allows this contract to receive the gas token. */ // solhint-disable-next-line no-empty-blocks receive() external payable virtual {} }
// SPDX-License-Identifier: none pragma solidity 0.8.24; import { Calls } from "./../libraries/Calls.sol"; import { IMulticall } from "./../interfaces/utils/IMulticall.sol"; /** * @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; } }
// SPDX-License-Identifier: none pragma solidity 0.8.24; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import { IOwnable2Step } from "./../interfaces/utils/IOwnable2Step.sol"; import { Calls } from "./../libraries/Calls.sol"; import { Errors } from "./../libraries/Errors.sol"; /** * @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); } }
{ "optimizer": { "enabled": true, "runs": 200000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"blast_","type":"address"},{"internalType":"address","name":"gasCollector_","type":"address"},{"internalType":"address","name":"blastPoints_","type":"address"},{"internalType":"address","name":"pointsOperator_","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":"AlreadyRegistered","type":"error"},{"inputs":[],"name":"CallFailed","type":"error"},{"inputs":[],"name":"DelegateCallFailed","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"NotOperator","type":"error"},{"inputs":[],"name":"NotPendingContractOwner","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"agentAddress","type":"address"},{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"uint256","name":"agentID","type":"uint256"}],"name":"AgentRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isOperator","type":"bool"}],"name":"OperatorSet","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":[],"name":"blastPoints","outputs":[{"internalType":"address","name":"blastPoints_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tba","type":"address"}],"name":"getNftOfTba","outputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"agentID","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"agentID","type":"uint256"}],"name":"getTbasOfNft","outputs":[{"components":[{"internalType":"address","name":"agentAddress","type":"address"},{"internalType":"address","name":"implementationAddress","type":"address"}],"internalType":"struct IAgentRegistry.AgentInfo[]","name":"tbas","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"isAuthorized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tba","type":"address"}],"name":"isTbaRegisteredAgent","outputs":[{"internalType":"bool","name":"isRegistered","type":"bool"}],"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":[{"components":[{"internalType":"address","name":"agentAddress","type":"address"},{"internalType":"address","name":"implementationAddress","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"agentID","type":"uint256"}],"internalType":"struct IAgentRegistry.RegisterAgentParam","name":"params","type":"tuple"}],"name":"registerAgent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"agentAddress","type":"address"},{"internalType":"address","name":"implementationAddress","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"agentID","type":"uint256"}],"internalType":"struct IAgentRegistry.RegisterAgentParam[]","name":"params","type":"tuple[]"}],"name":"registerAgents","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isAuthorized","type":"bool"}],"internalType":"struct IAgentRegistry.SetOperatorParam[]","name":"params","type":"tuple[]"}],"name":"setOperators","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"},{"inputs":[{"components":[{"internalType":"address","name":"agentAddress","type":"address"},{"internalType":"address","name":"implementationAddress","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"agentID","type":"uint256"}],"internalType":"struct IAgentRegistry.RegisterAgentParam","name":"params","type":"tuple"}],"name":"tryRegisterAgent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"agentAddress","type":"address"},{"internalType":"address","name":"implementationAddress","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"agentID","type":"uint256"}],"internalType":"struct IAgentRegistry.RegisterAgentParam[]","name":"params","type":"tuple[]"}],"name":"tryRegisterAgents","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
61010060405234801562000011575f80fd5b5060405162001a9838038062001a98833981016040819052620000349162000338565b6001600160a01b03808516608081905281851660a05281841660c05290821660e05260408051600481526024810182526020810180516001600160e01b031663388a0bbd60e11b17905290518692869286928692916200009491620003a4565b5f604051808303815f865af19150503d805f8114620000cf576040519150601f19603f3d011682016040523d82523d5f602084013e620000d4565b606091505b505060408051600481526024810182526020810180516001600160e01b0316634e606c4760e01b17905290516001600160a01b0387169250620001189190620003a4565b5f604051808303815f865af19150503d805f811462000153576040519150601f19603f3d011682016040523d82523d5f602084013e62000158565b606091505b5050506001600160a01b03831615620001ff576040516001600160a01b03848116602483015285169060440160408051601f198184030181529181526020820180516001600160e01b0316631d70c8d360e31b17905251620001bb9190620003a4565b5f604051808303815f865af19150503d805f8114620001f6576040519150601f19603f3d011682016040523d82523d5f602084013e620001fb565b606091505b5050505b6001600160a01b03811615620002a3576040516001600160a01b03828116602483015283169060440160408051601f198184030181529181526020820180516001600160e01b03166336b91f2b60e01b179052516200025f9190620003a4565b5f604051808303815f865af19150503d805f81146200029a576040519150601f19603f3d011682016040523d82523d5f602084013e6200029f565b606091505b5050505b50505050620002b885620002c360201b60201c565b5050505050620003d2565b600180546001600160a01b03199081169091555f80546001600160a01b03848116938216841783556040519116929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b038116811462000333575f80fd5b919050565b5f805f805f60a086880312156200034d575f80fd5b62000358866200031c565b945062000368602087016200031c565b935062000378604087016200031c565b925062000388606087016200031c565b915062000398608087016200031c565b90509295509295909350565b5f82515f5b81811015620003c55760208186018101518583015201620003a9565b505f920191825250919050565b60805160a05160c05160e051611698620004005f395f50505f61038c01525f50505f61019a01526116985ff3fe608060405260043610610126575f3560e01c80638a179be4116100a1578063ac9650d811610071578063e30c397811610057578063e30c3978146103b0578063ed250bf3146103da578063f2fde38b14610406575f80fd5b8063ac9650d81461035e578063b2bd6b501461037e575f80fd5b80638a179be4146102fc5780638cba7de81461030f5780638da5cb5b14610322578063aac290e81461034b575f80fd5b80634167ff42116100f6578063715018a6116100dc578063715018a6146102d957806379ba5097146102e157806385b53fc8146102e9575f80fd5b80634167ff42146102825780636d70f7ae14610295575f80fd5b806312110b2914610131578063175e1a7d1461018c5780631e17c0ca146101df5780632b2ea1071461026d575f80fd5b3661012d57005b5f80fd5b34801561013c575f80fd5b5061017761014b3660046111fb565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602052604090205416151590565b60405190151581526020015b60405180910390f35b348015610197575f80fd5b507f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610183565b3480156101ea575f80fd5b506102416101f93660046111fb565b73ffffffffffffffffffffffffffffffffffffffff9081165f908152600460209081526040918290208251808401909352805490931680835260019093015491018190529091565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610183565b61028061027b366004611214565b610419565b005b61028061029036600461122a565b61042d565b3480156102a0575f80fd5b506101776102af3660046111fb565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205460ff1690565b61028061046c565b61028061047f565b6102806102f7366004611299565b6104db565b61028061030a36600461133e565b610638565b61028061031d36600461122a565b61074b565b34801561032d575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166101ba565b610280610359366004611214565b610785565b61037161036c36600461138d565b610796565b60405161018391906113ee565b348015610389575f80fd5b507f00000000000000000000000000000000000000000000000000000000000000006101ba565b3480156103bb575f80fd5b5060015473ffffffffffffffffffffffffffffffffffffffff166101ba565b3480156103e5575f80fd5b506103f96103f43660046114a2565b61087e565b60405161018391906114ca565b6102806104143660046111fb565b61092d565b6104216109aa565b61042a816109f2565b50565b6104356109aa565b5f5b818110156104675761045f83838381811061045457610454611532565b905060800201610c44565b600101610437565b505050565b610474610c8b565b61047d5f610cdb565b565b600154339073ffffffffffffffffffffffffffffffffffffffff1681146104d2576040517f3d6f519e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61042a81610cdb565b6104e3610c8b565b5f5b81811015610467578282828181106104ff576104ff611532565b9050604002016020016020810190610517919061156c565b60025f85858581811061052c5761052c611532565b61054292602060409092020190810191506111fb565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790558282828181106105a6576105a6611532565b6105bc92602060409092020190810191506111fb565b73ffffffffffffffffffffffffffffffffffffffff167f1a594081ae893ab78e67d9b9e843547318164322d32c65369d78a96172d9dc8f84848481811061060557610605611532565b905060400201602001602081019061061d919061156c565b604051901515815260200160405180910390a26001016104e5565b610640610c8b565b5f5b81811015610745575f83838381811061065d5761065d611532565b905060200201602081019061067291906111fb565b905073ffffffffffffffffffffffffffffffffffffffff811661069f576106998547610d59565b5061073c565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152819061073a908290889073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610711573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107359190611587565b610e4e565b505b50600101610642565b50505050565b6107536109aa565b5f5b818110156104675761077d83838381811061077257610772611532565b9050608002016109f2565b600101610755565b61078d6109aa565b61042a81610c44565b60608167ffffffffffffffff8111156107b1576107b161159e565b6040519080825280602002602001820160405280156107e457816020015b60608152602001906001900390816107cf5790505b5090505f5b82811015610877576108523085858481811061080757610807611532565b905060200281019061081991906115cb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610edb92505050565b82828151811061086457610864611532565b60209081029190910101526001016107e9565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526003602090815260408083208484528252808320805482518185028101850190935280835260609492939192909184015b82821015610921575f8481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff9081168352600191820154168284015290835290920191016108ca565b50505050905092915050565b610935610c8b565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092555f8054604051929316917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a350565b335f9081526002602052604090205460ff1661047d576040517f7c214f0400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600481610a0360208501856111fb565b73ffffffffffffffffffffffffffffffffffffffff908116825260208201929092526040015f2080549092501615610a67576040517f3a81d6fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a7760608301604084016111fb565b81547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9190911617815560608201803560018301556003905f90610ad490604086016111fb565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081206060860135825283528190208151808301909252918190610b21908601866111fb565b73ffffffffffffffffffffffffffffffffffffffff168152602001846020016020810190610b4f91906111fb565b73ffffffffffffffffffffffffffffffffffffffff9081169091528254600180820185555f948552602094859020845160029093020180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169385169390931781559390940151929093018054909316911617905560608201803590610bdb90604085016111fb565b73ffffffffffffffffffffffffffffffffffffffff16610bfe60208501856111fb565b73ffffffffffffffffffffffffffffffffffffffff167fae6249e1b0de18c2723755a5833e4712be14aaa5c1d2b8923223ad3784964f6e60405160405180910390a45050565b5f600481610c5560208501856111fb565b73ffffffffffffffffffffffffffffffffffffffff908116825260208201929092526040015f2080549092501615610a67575050565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461047d576040517fbfcafd3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091555f805473ffffffffffffffffffffffffffffffffffffffff848116938216841783556040519116929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606081471015610d95576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808473ffffffffffffffffffffffffffffffffffffffff16846040515f6040518083038185875af1925050503d805f8114610dec576040519150601f19603f3d011682016040523d82523d5f602084013e610df1565b606091505b50915091508115610e0457809250610e46565b805115610e145780518082602001fd5b6040517f3204506f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505092915050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610467908490610f96565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051610f04919061162c565b5f60405180830381855af49150503d805f8114610f3c576040519150601f19603f3d011682016040523d82523d5f602084013e610f41565b606091505b50915091508115610f5457809250610e46565b805115610f645780518082602001fd5b6040517f18cecad500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610fb773ffffffffffffffffffffffffffffffffffffffff84168361102f565b905080515f14158015610fdb575080806020019051810190610fd99190611647565b155b15610467576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b606061103c83835f611043565b9392505050565b606081471015611081576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401611026565b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516110a9919061162c565b5f6040518083038185875af1925050503d805f81146110e3576040519150601f19603f3d011682016040523d82523d5f602084013e6110e8565b606091505b50915091506110f8868383611102565b9695505050505050565b6060826111175761111282611191565b61103c565b815115801561113b575073ffffffffffffffffffffffffffffffffffffffff84163b155b1561118a576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401611026565b508061103c565b8051156111a15780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146111f6575f80fd5b919050565b5f6020828403121561120b575f80fd5b61103c826111d3565b5f60808284031215611224575f80fd5b50919050565b5f806020838503121561123b575f80fd5b823567ffffffffffffffff80821115611252575f80fd5b818501915085601f830112611265575f80fd5b813581811115611273575f80fd5b8660208260071b8501011115611287575f80fd5b60209290920196919550909350505050565b5f80602083850312156112aa575f80fd5b823567ffffffffffffffff808211156112c1575f80fd5b818501915085601f8301126112d4575f80fd5b8135818111156112e2575f80fd5b8660208260061b8501011115611287575f80fd5b5f8083601f840112611306575f80fd5b50813567ffffffffffffffff81111561131d575f80fd5b6020830191508360208260051b8501011115611337575f80fd5b9250929050565b5f805f60408486031215611350575f80fd5b611359846111d3565b9250602084013567ffffffffffffffff811115611374575f80fd5b611380868287016112f6565b9497909650939450505050565b5f806020838503121561139e575f80fd5b823567ffffffffffffffff8111156113b4575f80fd5b6113c0858286016112f6565b90969095509350505050565b5f5b838110156113e65781810151838201526020016113ce565b50505f910152565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b82811015611495577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281518051808752611458818989018a85016113cc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01695909501860194509285019290850190600101611413565b5092979650505050505050565b5f80604083850312156114b3575f80fd5b6114bc836111d3565b946020939093013593505050565b602080825282518282018190525f919060409081850190868401855b82811015611525578151805173ffffffffffffffffffffffffffffffffffffffff908116865290870151168685015292840192908501906001016114e6565b5091979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b801515811461042a575f80fd5b5f6020828403121561157c575f80fd5b813561103c8161155f565b5f60208284031215611597575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126115fe575f80fd5b83018035915067ffffffffffffffff821115611618575f80fd5b602001915036819003821315611337575f80fd5b5f825161163d8184602087016113cc565b9190910192915050565b5f60208284031215611657575f80fd5b815161103c8161155f56fea2646970667358221220ddc08851dadc7b483e8c424fc757eb6eb897782c4bf9f8fe7362e7bbd6fcfe3c64736f6c63430008180033000000000000000000000000a214a4fc09c42202c404e2976c50373fe5f5b7890000000000000000000000004300000000000000000000000000000000000002000000000000000000000000f237c20584daca970498917470864f4d027de4ca0000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd800000000000000000000000000454c0c1cf7be9341d82ce0f16979b8689ed4aad0
Deployed Bytecode
0x608060405260043610610126575f3560e01c80638a179be4116100a1578063ac9650d811610071578063e30c397811610057578063e30c3978146103b0578063ed250bf3146103da578063f2fde38b14610406575f80fd5b8063ac9650d81461035e578063b2bd6b501461037e575f80fd5b80638a179be4146102fc5780638cba7de81461030f5780638da5cb5b14610322578063aac290e81461034b575f80fd5b80634167ff42116100f6578063715018a6116100dc578063715018a6146102d957806379ba5097146102e157806385b53fc8146102e9575f80fd5b80634167ff42146102825780636d70f7ae14610295575f80fd5b806312110b2914610131578063175e1a7d1461018c5780631e17c0ca146101df5780632b2ea1071461026d575f80fd5b3661012d57005b5f80fd5b34801561013c575f80fd5b5061017761014b3660046111fb565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602052604090205416151590565b60405190151581526020015b60405180910390f35b348015610197575f80fd5b507f00000000000000000000000043000000000000000000000000000000000000025b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610183565b3480156101ea575f80fd5b506102416101f93660046111fb565b73ffffffffffffffffffffffffffffffffffffffff9081165f908152600460209081526040918290208251808401909352805490931680835260019093015491018190529091565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610183565b61028061027b366004611214565b610419565b005b61028061029036600461122a565b61042d565b3480156102a0575f80fd5b506101776102af3660046111fb565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205460ff1690565b61028061046c565b61028061047f565b6102806102f7366004611299565b6104db565b61028061030a36600461133e565b610638565b61028061031d36600461122a565b61074b565b34801561032d575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166101ba565b610280610359366004611214565b610785565b61037161036c36600461138d565b610796565b60405161018391906113ee565b348015610389575f80fd5b507f0000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd8006101ba565b3480156103bb575f80fd5b5060015473ffffffffffffffffffffffffffffffffffffffff166101ba565b3480156103e5575f80fd5b506103f96103f43660046114a2565b61087e565b60405161018391906114ca565b6102806104143660046111fb565b61092d565b6104216109aa565b61042a816109f2565b50565b6104356109aa565b5f5b818110156104675761045f83838381811061045457610454611532565b905060800201610c44565b600101610437565b505050565b610474610c8b565b61047d5f610cdb565b565b600154339073ffffffffffffffffffffffffffffffffffffffff1681146104d2576040517f3d6f519e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61042a81610cdb565b6104e3610c8b565b5f5b81811015610467578282828181106104ff576104ff611532565b9050604002016020016020810190610517919061156c565b60025f85858581811061052c5761052c611532565b61054292602060409092020190810191506111fb565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790558282828181106105a6576105a6611532565b6105bc92602060409092020190810191506111fb565b73ffffffffffffffffffffffffffffffffffffffff167f1a594081ae893ab78e67d9b9e843547318164322d32c65369d78a96172d9dc8f84848481811061060557610605611532565b905060400201602001602081019061061d919061156c565b604051901515815260200160405180910390a26001016104e5565b610640610c8b565b5f5b81811015610745575f83838381811061065d5761065d611532565b905060200201602081019061067291906111fb565b905073ffffffffffffffffffffffffffffffffffffffff811661069f576106998547610d59565b5061073c565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152819061073a908290889073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610711573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107359190611587565b610e4e565b505b50600101610642565b50505050565b6107536109aa565b5f5b818110156104675761077d83838381811061077257610772611532565b9050608002016109f2565b600101610755565b61078d6109aa565b61042a81610c44565b60608167ffffffffffffffff8111156107b1576107b161159e565b6040519080825280602002602001820160405280156107e457816020015b60608152602001906001900390816107cf5790505b5090505f5b82811015610877576108523085858481811061080757610807611532565b905060200281019061081991906115cb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610edb92505050565b82828151811061086457610864611532565b60209081029190910101526001016107e9565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526003602090815260408083208484528252808320805482518185028101850190935280835260609492939192909184015b82821015610921575f8481526020908190206040805180820190915260028502909101805473ffffffffffffffffffffffffffffffffffffffff9081168352600191820154168284015290835290920191016108ca565b50505050905092915050565b610935610c8b565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092555f8054604051929316917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a350565b335f9081526002602052604090205460ff1661047d576040517f7c214f0400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600481610a0360208501856111fb565b73ffffffffffffffffffffffffffffffffffffffff908116825260208201929092526040015f2080549092501615610a67576040517f3a81d6fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a7760608301604084016111fb565b81547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9190911617815560608201803560018301556003905f90610ad490604086016111fb565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081206060860135825283528190208151808301909252918190610b21908601866111fb565b73ffffffffffffffffffffffffffffffffffffffff168152602001846020016020810190610b4f91906111fb565b73ffffffffffffffffffffffffffffffffffffffff9081169091528254600180820185555f948552602094859020845160029093020180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169385169390931781559390940151929093018054909316911617905560608201803590610bdb90604085016111fb565b73ffffffffffffffffffffffffffffffffffffffff16610bfe60208501856111fb565b73ffffffffffffffffffffffffffffffffffffffff167fae6249e1b0de18c2723755a5833e4712be14aaa5c1d2b8923223ad3784964f6e60405160405180910390a45050565b5f600481610c5560208501856111fb565b73ffffffffffffffffffffffffffffffffffffffff908116825260208201929092526040015f2080549092501615610a67575050565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461047d576040517fbfcafd3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091555f805473ffffffffffffffffffffffffffffffffffffffff848116938216841783556040519116929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606081471015610d95576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808473ffffffffffffffffffffffffffffffffffffffff16846040515f6040518083038185875af1925050503d805f8114610dec576040519150601f19603f3d011682016040523d82523d5f602084013e610df1565b606091505b50915091508115610e0457809250610e46565b805115610e145780518082602001fd5b6040517f3204506f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505092915050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610467908490610f96565b60605f808473ffffffffffffffffffffffffffffffffffffffff1684604051610f04919061162c565b5f60405180830381855af49150503d805f8114610f3c576040519150601f19603f3d011682016040523d82523d5f602084013e610f41565b606091505b50915091508115610f5457809250610e46565b805115610f645780518082602001fd5b6040517f18cecad500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610fb773ffffffffffffffffffffffffffffffffffffffff84168361102f565b905080515f14158015610fdb575080806020019051810190610fd99190611647565b155b15610467576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024015b60405180910390fd5b606061103c83835f611043565b9392505050565b606081471015611081576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401611026565b5f808573ffffffffffffffffffffffffffffffffffffffff1684866040516110a9919061162c565b5f6040518083038185875af1925050503d805f81146110e3576040519150601f19603f3d011682016040523d82523d5f602084013e6110e8565b606091505b50915091506110f8868383611102565b9695505050505050565b6060826111175761111282611191565b61103c565b815115801561113b575073ffffffffffffffffffffffffffffffffffffffff84163b155b1561118a576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401611026565b508061103c565b8051156111a15780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff811681146111f6575f80fd5b919050565b5f6020828403121561120b575f80fd5b61103c826111d3565b5f60808284031215611224575f80fd5b50919050565b5f806020838503121561123b575f80fd5b823567ffffffffffffffff80821115611252575f80fd5b818501915085601f830112611265575f80fd5b813581811115611273575f80fd5b8660208260071b8501011115611287575f80fd5b60209290920196919550909350505050565b5f80602083850312156112aa575f80fd5b823567ffffffffffffffff808211156112c1575f80fd5b818501915085601f8301126112d4575f80fd5b8135818111156112e2575f80fd5b8660208260061b8501011115611287575f80fd5b5f8083601f840112611306575f80fd5b50813567ffffffffffffffff81111561131d575f80fd5b6020830191508360208260051b8501011115611337575f80fd5b9250929050565b5f805f60408486031215611350575f80fd5b611359846111d3565b9250602084013567ffffffffffffffff811115611374575f80fd5b611380868287016112f6565b9497909650939450505050565b5f806020838503121561139e575f80fd5b823567ffffffffffffffff8111156113b4575f80fd5b6113c0858286016112f6565b90969095509350505050565b5f5b838110156113e65781810151838201526020016113ce565b50505f910152565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b82811015611495577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845281518051808752611458818989018a85016113cc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01695909501860194509285019290850190600101611413565b5092979650505050505050565b5f80604083850312156114b3575f80fd5b6114bc836111d3565b946020939093013593505050565b602080825282518282018190525f919060409081850190868401855b82811015611525578151805173ffffffffffffffffffffffffffffffffffffffff908116865290870151168685015292840192908501906001016114e6565b5091979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b801515811461042a575f80fd5b5f6020828403121561157c575f80fd5b813561103c8161155f565b5f60208284031215611597575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126115fe575f80fd5b83018035915067ffffffffffffffff821115611618575f80fd5b602001915036819003821315611337575f80fd5b5f825161163d8184602087016113cc565b9190910192915050565b5f60208284031215611657575f80fd5b815161103c8161155f56fea2646970667358221220ddc08851dadc7b483e8c424fc757eb6eb897782c4bf9f8fe7362e7bbd6fcfe3c64736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a214a4fc09c42202c404e2976c50373fe5f5b7890000000000000000000000004300000000000000000000000000000000000002000000000000000000000000f237c20584daca970498917470864f4d027de4ca0000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd800000000000000000000000000454c0c1cf7be9341d82ce0f16979b8689ed4aad0
-----Decoded View---------------
Arg [0] : owner_ (address): 0xA214a4fc09C42202C404E2976c50373fE5F5B789
Arg [1] : blast_ (address): 0x4300000000000000000000000000000000000002
Arg [2] : gasCollector_ (address): 0xf237c20584DaCA970498917470864f4d027de4ca
Arg [3] : blastPoints_ (address): 0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800
Arg [4] : pointsOperator_ (address): 0x454c0C1CF7be9341d82ce0F16979B8689ED4AAD0
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000a214a4fc09c42202c404e2976c50373fe5f5b789
Arg [1] : 0000000000000000000000004300000000000000000000000000000000000002
Arg [2] : 000000000000000000000000f237c20584daca970498917470864f4d027de4ca
Arg [3] : 0000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd800
Arg [4] : 000000000000000000000000454c0c1cf7be9341d82ce0f16979b8689ed4aad0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.