Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x60806040 | 23826982 | 79 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TRACERSRegistry
Compiler Version
v0.8.22+commit.4fc1097e
Optimization Enabled:
Yes with 20000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.22;
import {ERC165} from "openzeppelin/utils/introspection/ERC165.sol";
import {Ownable, OwnableAccessControl} from "tl-sol-tools/access/OwnableAccessControl.sol";
import {ITRACERSRegistry} from "src/ITRACERSRegistry.sol";
/// @title TRACERSRegistry
/// @notice Registry for TRACE Registered agents
/// @author transientlabs.xyz
/// @custom:version 3.0.0
contract TRACERSRegistry is Ownable, ERC165, ITRACERSRegistry {
/*//////////////////////////////////////////////////////////////////////////
State Variables
//////////////////////////////////////////////////////////////////////////*/
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
mapping(address => RegisteredAgent) private _registeredAgents; // registered agent address -> registered agent (global so should not use `numberOfStories`)
mapping(address => mapping(address => RegisteredAgent)) private _registeredAgentOverrides; // nft contract -> registered agent address -> registered agent (not global so can use `numberOfStories` or `isPermanent`)
/*//////////////////////////////////////////////////////////////////////////
Custom Errors
//////////////////////////////////////////////////////////////////////////*/
/// @dev not creator or admin for nft contract
error NotCreatorOrAdmin();
/*//////////////////////////////////////////////////////////////////////////
Constructor
//////////////////////////////////////////////////////////////////////////*/
/// @param initOwner The initial owner of the contract
constructor(address initOwner) Ownable(initOwner) {}
/*//////////////////////////////////////////////////////////////////////////
Registered Agent Functions
//////////////////////////////////////////////////////////////////////////*/
/// @inheritdoc ITRACERSRegistry
function setRegisteredAgent(address registeredAgentAddress, RegisteredAgent memory registeredAgent)
external
onlyOwner
{
// set `registeredAgent.numberOfStories` to 0
registeredAgent.numberOfStories = 0;
// set registered agent
_registeredAgents[registeredAgentAddress] = registeredAgent;
emit RegisteredAgentUpdate(msg.sender, registeredAgentAddress, registeredAgent);
}
/// @inheritdoc ITRACERSRegistry
function setRegisteredAgentOverride(
address nftContract,
address registeredAgentAddress,
RegisteredAgent calldata registeredAgent
) external {
// restrict access to creator or admin
OwnableAccessControl c = OwnableAccessControl(nftContract);
if (c.owner() != msg.sender && !c.hasRole(ADMIN_ROLE, msg.sender)) revert NotCreatorOrAdmin();
//set registered agent
_registeredAgentOverrides[nftContract][registeredAgentAddress] = registeredAgent;
emit RegisteredAgentOverrideUpdate(msg.sender, nftContract, registeredAgentAddress, registeredAgent);
}
/*//////////////////////////////////////////////////////////////////////////
External Functions
//////////////////////////////////////////////////////////////////////////*/
/// @inheritdoc ITRACERSRegistry
function isRegisteredAgent(address registeredAgentAddress) external returns (bool, string memory) {
RegisteredAgent storage registeredAgent = _registeredAgents[registeredAgentAddress];
RegisteredAgent storage registeredAgentOverride = _registeredAgentOverrides[msg.sender][registeredAgentAddress];
if (registeredAgentOverride.isPermanent) {
return (true, registeredAgentOverride.name);
} else if (registeredAgentOverride.numberOfStories > 0) {
registeredAgentOverride.numberOfStories--;
return (true, registeredAgentOverride.name);
} else if (registeredAgent.isPermanent) {
return (true, registeredAgent.name);
} else {
return (false, "");
}
}
/// @inheritdoc ITRACERSRegistry
function getRegisteredAgent(address nftContract, address registeredAgentAddress)
external
view
returns (RegisteredAgent memory registeredAgent)
{
RegisteredAgent storage registeredAgentGlobal = _registeredAgents[registeredAgentAddress];
RegisteredAgent storage registeredAgentOverride = _registeredAgentOverrides[nftContract][registeredAgentAddress];
if (registeredAgentOverride.isPermanent || registeredAgentOverride.numberOfStories > 0) {
registeredAgent = registeredAgentOverride;
} else {
registeredAgent = registeredAgentGlobal;
}
return registeredAgent;
}
/*//////////////////////////////////////////////////////////////////////////
ERC165
//////////////////////////////////////////////////////////////////////////*/
/// @inheritdoc ERC165
function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
return ERC165.supportsInterface(interfaceId) || interfaceId == type(ITRACERSRegistry).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {Ownable} from "openzeppelin/access/Ownable.sol";
import {EnumerableSet} from "openzeppelin/utils/structs/EnumerableSet.sol";
/// @title OwnableAccessControl.sol
/// @notice Single owner, flexible access control mechanics
/// @dev Can easily be extended by inheriting and applying additional roles
/// @dev By default, only the owner can grant roles but by inheriting, but you
/// may allow other roles to grant roles by using the internal helper.
/// @author transientlabs.xyz
/// @custom:version 3.0.0
abstract contract OwnableAccessControl is Ownable {
/*//////////////////////////////////////////////////////////////////////////
State Variables
//////////////////////////////////////////////////////////////////////////*/
using EnumerableSet for EnumerableSet.AddressSet;
uint256 private _c; // counter to be able to revoke all priviledges
mapping(uint256 => mapping(bytes32 => mapping(address => bool))) private _roleStatus;
mapping(uint256 => mapping(bytes32 => EnumerableSet.AddressSet)) private _roleMembers;
/*//////////////////////////////////////////////////////////////////////////
Events
//////////////////////////////////////////////////////////////////////////*/
/// @param from Address that authorized the role change
/// @param user The address who's role has been changed
/// @param approved Boolean indicating the user's status in role
/// @param role The bytes32 role created in the inheriting contract
event RoleChange(address indexed from, address indexed user, bool indexed approved, bytes32 role);
/// @param from - address that authorized the revoke
event AllRolesRevoked(address indexed from);
/*//////////////////////////////////////////////////////////////////////////
Errors
//////////////////////////////////////////////////////////////////////////*/
/// @dev Does not have specified role
error NotSpecifiedRole(bytes32 role);
/// @dev Is not specified role or owner
error NotRoleOrOwner(bytes32 role);
/*//////////////////////////////////////////////////////////////////////////
Modifiers
//////////////////////////////////////////////////////////////////////////*/
modifier onlyRole(bytes32 role) {
if (!hasRole(role, msg.sender)) {
revert NotSpecifiedRole(role);
}
_;
}
modifier onlyRoleOrOwner(bytes32 role) {
if (!hasRole(role, msg.sender) && owner() != msg.sender) {
revert NotRoleOrOwner(role);
}
_;
}
/*//////////////////////////////////////////////////////////////////////////
Constructor
//////////////////////////////////////////////////////////////////////////*/
constructor() Ownable(msg.sender) {}
/*//////////////////////////////////////////////////////////////////////////
External Role Functions
//////////////////////////////////////////////////////////////////////////*/
/// @notice Function to revoke all roles currently present
/// @dev Increments the `_c` variables
/// @dev Requires owner privileges
function revokeAllRoles() external onlyOwner {
_c++;
emit AllRolesRevoked(msg.sender);
}
/// @notice Function to renounce role
/// @param role Bytes32 role created in inheriting contracts
function renounceRole(bytes32 role) external {
address[] memory members = new address[](1);
members[0] = msg.sender;
_setRole(role, members, false);
}
/// @notice Function to grant/revoke a role to an address
/// @dev Requires owner to call this function but this may be further
/// extended using the internal helper function in inheriting contracts
/// @param role Bytes32 role created in inheriting contracts
/// @param roleMembers List of addresses that should have roles attached to them based on `status`
/// @param status Bool whether to remove or add `roleMembers` to the `role`
function setRole(bytes32 role, address[] memory roleMembers, bool status) external onlyOwner {
_setRole(role, roleMembers, status);
}
/*//////////////////////////////////////////////////////////////////////////
External View Functions
//////////////////////////////////////////////////////////////////////////*/
/// @notice Function to see if an address is the owner
/// @param role Bytes32 role created in inheriting contracts
/// @param potentialRoleMember Address to check for role membership
function hasRole(bytes32 role, address potentialRoleMember) public view returns (bool) {
return _roleStatus[_c][role][potentialRoleMember];
}
/// @notice Function to get role members
/// @param role Bytes32 role created in inheriting contracts
function getRoleMembers(bytes32 role) public view returns (address[] memory) {
return _roleMembers[_c][role].values();
}
/*//////////////////////////////////////////////////////////////////////////
Internal Helper Functions
//////////////////////////////////////////////////////////////////////////*/
/// @notice Helper function to set addresses for a role
/// @param role Bytes32 role created in inheriting contracts
/// @param roleMembers List of addresses that should have roles attached to them based on `status`
/// @param status Bool whether to remove or add `roleMembers` to the `role`
function _setRole(bytes32 role, address[] memory roleMembers, bool status) internal {
for (uint256 i = 0; i < roleMembers.length; i++) {
_roleStatus[_c][role][roleMembers[i]] = status;
if (status) {
_roleMembers[_c][role].add(roleMembers[i]);
} else {
_roleMembers[_c][role].remove(roleMembers[i]);
}
emit RoleChange(msg.sender, roleMembers[i], status, role);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/// @title ITRACERSRegistry.sol
/// @notice Interface for TRACE Registered Agents Registry
/// @author transientlabs.xyz
/// @custom:version 3.0.0
interface ITRACERSRegistry {
/*//////////////////////////////////////////////////////////////////////////
Types
//////////////////////////////////////////////////////////////////////////*/
/// @dev Struct defining a registered agent
/// @param isPermanent A bool defining if the agent is a permanent agent (if true, ignore `numberOfStories`)
/// @param numberOfStories The number of stories allowed for this agent (N/A if `isPermanent` is true)
/// @param name The name of the registered agent
struct RegisteredAgent {
bool isPermanent;
uint128 numberOfStories;
string name;
}
/*//////////////////////////////////////////////////////////////////////////
Events
//////////////////////////////////////////////////////////////////////////*/
/// @dev event whenever a registered agent is added, removed, or updated
event RegisteredAgentUpdate(
address indexed sender, address indexed registeredAgentAddress, RegisteredAgent registeredAgent
);
/// @dev event whenever a registered agent override is added, removed, or updated
event RegisteredAgentOverrideUpdate(
address indexed sender,
address indexed nftContract,
address indexed indexedregisteredAgentAddress,
RegisteredAgent registeredAgent
);
/*//////////////////////////////////////////////////////////////////////////
Registered Agent Functions
//////////////////////////////////////////////////////////////////////////*/
/// @notice Function to add a global registered agent by the contract owner
/// @dev This is a for a global registered agent so `registeredAgent.numberOfStories` is ignored
/// @dev MUST emit the event `RegisteredAgentUpdate`
/// @param registeredAgentAddress The registered agent address
/// @param registeredAgent The registered agent
function setRegisteredAgent(address registeredAgentAddress, RegisteredAgent memory registeredAgent) external;
/// @notice Function to add a registered agent override by an nft contract owner or admin
/// @dev MUST emit the event `RegisteredAgentOverrideUpdate`
/// @param nftContract The nft contract
/// @param registeredAgentAddress The registered agent address
/// @param registeredAgent The registered agent
function setRegisteredAgentOverride(
address nftContract,
address registeredAgentAddress,
RegisteredAgent calldata registeredAgent
) external;
/*//////////////////////////////////////////////////////////////////////////
External Functions
//////////////////////////////////////////////////////////////////////////*/
/// @notice Function callable by an nft contract to check the registered agent
/// @dev This MUST be called by the nft contract in order to check overrides properly
/// @dev Adjusts overrides that are limited in the number of stories allowed, hence no view modifier
/// @param registeredAgentAddress The registered agent address
/// @return bool Boolean indicating if the address is question is a registered agent or not
/// @return string The name of the registered agent
function isRegisteredAgent(address registeredAgentAddress) external returns (bool, string memory);
/// @notice External view function to get a registered agent, returning an overrided agent for a contract if it exists
/// @param nftContract The nft contract (set to the zero address if not looking for an override)
/// @param registeredAgentAddress The registered agent address
/// @return registeredAgent The registered agent struct
function getRegisteredAgent(address nftContract, address registeredAgentAddress)
external
view
returns (RegisteredAgent memory registeredAgent);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev 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 virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.20;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```solidity
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position is the index of the value in the `values` array plus 1.
// Position 0 is used to mean a value is not in the set.
mapping(bytes32 value => uint256) _positions;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._positions[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We cache the value's position to prevent multiple reads from the same storage slot
uint256 position = set._positions[value];
if (position != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 valueIndex = position - 1;
uint256 lastIndex = set._values.length - 1;
if (valueIndex != lastIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the lastValue to the index where the value to delete is
set._values[valueIndex] = lastValue;
// Update the tracked position of the lastValue (that was just moved)
set._positions[lastValue] = position;
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the tracked position for the deleted slot
delete set._positions[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._positions[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}{
"remappings": [
"ds-test/=lib/forge-std/lib/ds-test/src/",
"forge-std/=lib/forge-std/src/",
"openzeppelin-contracts-upgradeable/=lib/tl-sol-tools/lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/tl-sol-tools/lib/openzeppelin-contracts/",
"openzeppelin-upgradeable/=lib/tl-sol-tools/lib/openzeppelin-contracts-upgradeable/contracts/",
"openzeppelin/=lib/tl-sol-tools/lib/openzeppelin-contracts/contracts/",
"tl-sol-tools/=lib/tl-sol-tools/src/",
"@manifoldxyz/libraries-solidity/=lib/tl-sol-tools/lib/royalty-registry-solidity/lib/libraries-solidity/",
"@openzeppelin/contracts-upgradeable/=lib/tl-sol-tools/lib/openzeppelin-contracts-upgradeable/contracts/",
"@openzeppelin/contracts/=lib/tl-sol-tools/lib/openzeppelin-contracts/contracts/",
"create2-helpers/=lib/tl-sol-tools/lib/royalty-registry-solidity/lib/create2-helpers/",
"create2-scripts/=lib/tl-sol-tools/lib/royalty-registry-solidity/lib/create2-helpers/script/",
"erc4626-tests/=lib/tl-sol-tools/lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
"libraries-solidity/=lib/tl-sol-tools/lib/royalty-registry-solidity/lib/libraries-solidity/contracts/",
"royalty-registry-solidity/=lib/tl-sol-tools/lib/royalty-registry-solidity/"
],
"optimizer": {
"enabled": true,
"runs": 20000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"initOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NotCreatorOrAdmin","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"nftContract","type":"address"},{"indexed":true,"internalType":"address","name":"indexedregisteredAgentAddress","type":"address"},{"components":[{"internalType":"bool","name":"isPermanent","type":"bool"},{"internalType":"uint128","name":"numberOfStories","type":"uint128"},{"internalType":"string","name":"name","type":"string"}],"indexed":false,"internalType":"struct ITRACERSRegistry.RegisteredAgent","name":"registeredAgent","type":"tuple"}],"name":"RegisteredAgentOverrideUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"registeredAgentAddress","type":"address"},{"components":[{"internalType":"bool","name":"isPermanent","type":"bool"},{"internalType":"uint128","name":"numberOfStories","type":"uint128"},{"internalType":"string","name":"name","type":"string"}],"indexed":false,"internalType":"struct ITRACERSRegistry.RegisteredAgent","name":"registeredAgent","type":"tuple"}],"name":"RegisteredAgentUpdate","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"address","name":"registeredAgentAddress","type":"address"}],"name":"getRegisteredAgent","outputs":[{"components":[{"internalType":"bool","name":"isPermanent","type":"bool"},{"internalType":"uint128","name":"numberOfStories","type":"uint128"},{"internalType":"string","name":"name","type":"string"}],"internalType":"struct ITRACERSRegistry.RegisteredAgent","name":"registeredAgent","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"registeredAgentAddress","type":"address"}],"name":"isRegisteredAgent","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registeredAgentAddress","type":"address"},{"components":[{"internalType":"bool","name":"isPermanent","type":"bool"},{"internalType":"uint128","name":"numberOfStories","type":"uint128"},{"internalType":"string","name":"name","type":"string"}],"internalType":"struct ITRACERSRegistry.RegisteredAgent","name":"registeredAgent","type":"tuple"}],"name":"setRegisteredAgent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"address","name":"registeredAgentAddress","type":"address"},{"components":[{"internalType":"bool","name":"isPermanent","type":"bool"},{"internalType":"uint128","name":"numberOfStories","type":"uint128"},{"internalType":"string","name":"name","type":"string"}],"internalType":"struct ITRACERSRegistry.RegisteredAgent","name":"registeredAgent","type":"tuple"}],"name":"setRegisteredAgentOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b5060405161158d38038061158d83398101604081905261002f916100be565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100678161006e565b50506100ee565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100d057600080fd5b81516001600160a01b03811681146100e757600080fd5b9392505050565b611490806100fd6000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c806375b238fc11610076578063e21b38d21161005b578063e21b38d21461016a578063e2d081ec1461018b578063f2fde38b1461019e57600080fd5b806375b238fc1461010d5780638da5cb5b1461014257600080fd5b806301ffc9a7146100a85780633bef529e146100d0578063465de92d146100f0578063715018a614610105575b600080fd5b6100bb6100b6366004610aeb565b6101b1565b60405190151581526020015b60405180910390f35b6100e36100de366004610b56565b61024a565b6040516100c79190610bf3565b6101036100fe366004610d11565b610474565b005b61010361059d565b6101347fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6040519081526020016100c7565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100c7565b61017d610178366004610e2b565b6105b1565b6040516100c7929190610e48565b610103610199366004610e63565b610760565b6101036101ac366004610e2b565b6109ba565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061024457507fffffffff0000000000000000000000000000000000000000000000000000000082167f7d79028d00000000000000000000000000000000000000000000000000000000145b92915050565b6040805160608082018352600080835260208301529181019190915273ffffffffffffffffffffffffffffffffffffffff808316600081815260016020908152604080832094881683526002825280832093835292905220805460ff16806102c95750805461010090046fffffffffffffffffffffffffffffffff1615155b1561039f5760408051606081018252825460ff81161515825261010090046fffffffffffffffffffffffffffffffff16602082015260018301805491928492908401919061031690610ecc565b80601f016020809104026020016040519081016040528092919081815260200182805461034290610ecc565b801561038f5780601f106103645761010080835404028352916020019161038f565b820191906000526020600020905b81548152906001019060200180831161037257829003601f168201915b505050505081525050925061046c565b60408051606081018252835460ff81161515825261010090046fffffffffffffffffffffffffffffffff1660208201526001840180549192859290840191906103e790610ecc565b80601f016020809104026020016040519081016040528092919081815260200182805461041390610ecc565b80156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b50505050508152505092505b505092915050565b61047c610a23565b6000602082810182815273ffffffffffffffffffffffffffffffffffffffff851683526001918290526040928390208451815492517fffffffffffffffffffffffffffffff00000000000000000000000000000000009093169015157fffffffffffffffffffffffffffffff00000000000000000000000000000000ff16176101006fffffffffffffffffffffffffffffffff90931692909202919091178155918301518392918201906105309082610f70565b509050508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f78a44eedc083c753c0b26bd3c92b1dd4561d59e5b3c0ff63ae27883e61d29f02836040516105919190610bf3565b60405180910390a35050565b6105a5610a23565b6105af6000610a76565b565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600160209081526040808320338452600283528184209484529390915281208054919260609290919060ff161561069b5760018160010180805461061090610ecc565b80601f016020809104026020016040519081016040528092919081815260200182805461063c90610ecc565b80156106895780601f1061065e57610100808354040283529160200191610689565b820191906000526020600020905b81548152906001019060200180831161066c57829003601f168201915b50505050509050935093505050915091565b805461010090046fffffffffffffffffffffffffffffffff161561072757805461010090046fffffffffffffffffffffffffffffffff168160016106de8361108a565b91906101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505060018160010180805461061090610ecc565b815460ff16156107435760018260010180805461061090610ecc565b600060405180602001604052806000815250935093505050915091565b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107eb91906110fb565b73ffffffffffffffffffffffffffffffffffffffff16141580156108c057506040517f91d148540000000000000000000000000000000000000000000000000000000081527fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775600482015233602482015273ffffffffffffffffffffffffffffffffffffffff8216906391d1485490604401602060405180830381865afa15801561089a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108be9190611118565b155b156108f7576040517f440e733300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808516600090815260026020908152604080832093871683529290522082906109358282611250565b9050508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd202352499d6a24a28b374e5259d46f797139e23679f95e7b1bf33e4d852ef86856040516109ac919061139b565b60405180910390a450505050565b6109c2610a23565b73ffffffffffffffffffffffffffffffffffffffff8116610a17576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b610a2081610a76565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105af576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610a0e565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215610afd57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610b2d57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610a2057600080fd5b60008060408385031215610b6957600080fd5b8235610b7481610b34565b91506020830135610b8481610b34565b809150509250929050565b6000815180845260005b81811015610bb557602081850181015186830182015201610b99565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081528151151560208201526fffffffffffffffffffffffffffffffff602083015116604082015260006040830151606080840152610c366080840182610b8f565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610c9057610c90610c3e565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610cdd57610cdd610c3e565b604052919050565b8015158114610a2057600080fd5b6fffffffffffffffffffffffffffffffff81168114610a2057600080fd5b60008060408385031215610d2457600080fd5b8235610d2f81610b34565b915060208381013567ffffffffffffffff80821115610d4d57600080fd5b9085019060608288031215610d6157600080fd5b610d69610c6d565b8235610d7481610ce5565b815282840135610d8381610cf3565b81850152604083013582811115610d9957600080fd5b80840193505087601f840112610dae57600080fd5b823582811115610dc057610dc0610c3e565b610df0857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610c96565b92508083528885828601011115610e0657600080fd5b8085850186850137600085828501015250816040820152809450505050509250929050565b600060208284031215610e3d57600080fd5b8135610b2d81610b34565b8215158152604060208201526000610c366040830184610b8f565b600080600060608486031215610e7857600080fd5b8335610e8381610b34565b92506020840135610e9381610b34565b9150604084013567ffffffffffffffff811115610eaf57600080fd5b840160608187031215610ec157600080fd5b809150509250925092565b600181811c90821680610ee057607f821691505b602082108103610f19577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115610f6b576000816000526020600020601f850160051c81016020861015610f485750805b601f850160051c820191505b81811015610f6757828155600101610f54565b5050505b505050565b815167ffffffffffffffff811115610f8a57610f8a610c3e565b610f9e81610f988454610ecc565b84610f1f565b602080601f831160018114610ff15760008415610fbb5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610f67565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561103e5788860151825594840194600190910190840161101f565b508582101561107a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60006fffffffffffffffffffffffffffffffff8216806110d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b60006020828403121561110d57600080fd5b8151610b2d81610b34565b60006020828403121561112a57600080fd5b8151610b2d81610ce5565b67ffffffffffffffff83111561114d5761114d610c3e565b6111618361115b8354610ecc565b83610f1f565b6000601f8411600181146111b3576000851561117d5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611249565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561120257868501358255602094850194600190920191016111e2565b508682101561123d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b813561125b81610ce5565b81547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811691151560ff169182178355602084013561129981610cf3565b70ffffffffffffffffffffffffffffffff008160081b16837fffffffffffffffffffffffffffffff000000000000000000000000000000000084161717845550505060408201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe183360301811261131057600080fd5b8201803567ffffffffffffffff81111561132957600080fd5b60208201915080360382131561133e57600080fd5b61134c818360018601611135565b50505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60208152600082356113ac81610ce5565b80151560208401525060208301356113c381610cf3565b6fffffffffffffffffffffffffffffffff811660408401525060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261141157600080fd5b830160208101903567ffffffffffffffff81111561142e57600080fd5b80360382131561143d57600080fd5b606080850152611451608085018284611352565b9594505050505056fea2646970667358221220fb66beb3e727c4a0639814d710f71a4d6976d91a7ff39327db40c255205f4eef64736f6c6343000816003300000000000000000000000077b35947d508012589a91ca4c9d168824376cc7d
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100a35760003560e01c806375b238fc11610076578063e21b38d21161005b578063e21b38d21461016a578063e2d081ec1461018b578063f2fde38b1461019e57600080fd5b806375b238fc1461010d5780638da5cb5b1461014257600080fd5b806301ffc9a7146100a85780633bef529e146100d0578063465de92d146100f0578063715018a614610105575b600080fd5b6100bb6100b6366004610aeb565b6101b1565b60405190151581526020015b60405180910390f35b6100e36100de366004610b56565b61024a565b6040516100c79190610bf3565b6101036100fe366004610d11565b610474565b005b61010361059d565b6101347fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6040519081526020016100c7565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100c7565b61017d610178366004610e2b565b6105b1565b6040516100c7929190610e48565b610103610199366004610e63565b610760565b6101036101ac366004610e2b565b6109ba565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061024457507fffffffff0000000000000000000000000000000000000000000000000000000082167f7d79028d00000000000000000000000000000000000000000000000000000000145b92915050565b6040805160608082018352600080835260208301529181019190915273ffffffffffffffffffffffffffffffffffffffff808316600081815260016020908152604080832094881683526002825280832093835292905220805460ff16806102c95750805461010090046fffffffffffffffffffffffffffffffff1615155b1561039f5760408051606081018252825460ff81161515825261010090046fffffffffffffffffffffffffffffffff16602082015260018301805491928492908401919061031690610ecc565b80601f016020809104026020016040519081016040528092919081815260200182805461034290610ecc565b801561038f5780601f106103645761010080835404028352916020019161038f565b820191906000526020600020905b81548152906001019060200180831161037257829003601f168201915b505050505081525050925061046c565b60408051606081018252835460ff81161515825261010090046fffffffffffffffffffffffffffffffff1660208201526001840180549192859290840191906103e790610ecc565b80601f016020809104026020016040519081016040528092919081815260200182805461041390610ecc565b80156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b50505050508152505092505b505092915050565b61047c610a23565b6000602082810182815273ffffffffffffffffffffffffffffffffffffffff851683526001918290526040928390208451815492517fffffffffffffffffffffffffffffff00000000000000000000000000000000009093169015157fffffffffffffffffffffffffffffff00000000000000000000000000000000ff16176101006fffffffffffffffffffffffffffffffff90931692909202919091178155918301518392918201906105309082610f70565b509050508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f78a44eedc083c753c0b26bd3c92b1dd4561d59e5b3c0ff63ae27883e61d29f02836040516105919190610bf3565b60405180910390a35050565b6105a5610a23565b6105af6000610a76565b565b73ffffffffffffffffffffffffffffffffffffffff81166000818152600160209081526040808320338452600283528184209484529390915281208054919260609290919060ff161561069b5760018160010180805461061090610ecc565b80601f016020809104026020016040519081016040528092919081815260200182805461063c90610ecc565b80156106895780601f1061065e57610100808354040283529160200191610689565b820191906000526020600020905b81548152906001019060200180831161066c57829003601f168201915b50505050509050935093505050915091565b805461010090046fffffffffffffffffffffffffffffffff161561072757805461010090046fffffffffffffffffffffffffffffffff168160016106de8361108a565b91906101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505060018160010180805461061090610ecc565b815460ff16156107435760018260010180805461061090610ecc565b600060405180602001604052806000815250935093505050915091565b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107eb91906110fb565b73ffffffffffffffffffffffffffffffffffffffff16141580156108c057506040517f91d148540000000000000000000000000000000000000000000000000000000081527fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775600482015233602482015273ffffffffffffffffffffffffffffffffffffffff8216906391d1485490604401602060405180830381865afa15801561089a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108be9190611118565b155b156108f7576040517f440e733300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808516600090815260026020908152604080832093871683529290522082906109358282611250565b9050508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd202352499d6a24a28b374e5259d46f797139e23679f95e7b1bf33e4d852ef86856040516109ac919061139b565b60405180910390a450505050565b6109c2610a23565b73ffffffffffffffffffffffffffffffffffffffff8116610a17576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b610a2081610a76565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105af576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610a0e565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215610afd57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610b2d57600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610a2057600080fd5b60008060408385031215610b6957600080fd5b8235610b7481610b34565b91506020830135610b8481610b34565b809150509250929050565b6000815180845260005b81811015610bb557602081850181015186830182015201610b99565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081528151151560208201526fffffffffffffffffffffffffffffffff602083015116604082015260006040830151606080840152610c366080840182610b8f565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610c9057610c90610c3e565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610cdd57610cdd610c3e565b604052919050565b8015158114610a2057600080fd5b6fffffffffffffffffffffffffffffffff81168114610a2057600080fd5b60008060408385031215610d2457600080fd5b8235610d2f81610b34565b915060208381013567ffffffffffffffff80821115610d4d57600080fd5b9085019060608288031215610d6157600080fd5b610d69610c6d565b8235610d7481610ce5565b815282840135610d8381610cf3565b81850152604083013582811115610d9957600080fd5b80840193505087601f840112610dae57600080fd5b823582811115610dc057610dc0610c3e565b610df0857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610c96565b92508083528885828601011115610e0657600080fd5b8085850186850137600085828501015250816040820152809450505050509250929050565b600060208284031215610e3d57600080fd5b8135610b2d81610b34565b8215158152604060208201526000610c366040830184610b8f565b600080600060608486031215610e7857600080fd5b8335610e8381610b34565b92506020840135610e9381610b34565b9150604084013567ffffffffffffffff811115610eaf57600080fd5b840160608187031215610ec157600080fd5b809150509250925092565b600181811c90821680610ee057607f821691505b602082108103610f19577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115610f6b576000816000526020600020601f850160051c81016020861015610f485750805b601f850160051c820191505b81811015610f6757828155600101610f54565b5050505b505050565b815167ffffffffffffffff811115610f8a57610f8a610c3e565b610f9e81610f988454610ecc565b84610f1f565b602080601f831160018114610ff15760008415610fbb5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610f67565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561103e5788860151825594840194600190910190840161101f565b508582101561107a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60006fffffffffffffffffffffffffffffffff8216806110d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b60006020828403121561110d57600080fd5b8151610b2d81610b34565b60006020828403121561112a57600080fd5b8151610b2d81610ce5565b67ffffffffffffffff83111561114d5761114d610c3e565b6111618361115b8354610ecc565b83610f1f565b6000601f8411600181146111b3576000851561117d5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611249565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561120257868501358255602094850194600190920191016111e2565b508682101561123d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b813561125b81610ce5565b81547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811691151560ff169182178355602084013561129981610cf3565b70ffffffffffffffffffffffffffffffff008160081b16837fffffffffffffffffffffffffffffff000000000000000000000000000000000084161717845550505060408201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe183360301811261131057600080fd5b8201803567ffffffffffffffff81111561132957600080fd5b60208201915080360382131561133e57600080fd5b61134c818360018601611135565b50505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60208152600082356113ac81610ce5565b80151560208401525060208301356113c381610cf3565b6fffffffffffffffffffffffffffffffff811660408401525060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261141157600080fd5b830160208101903567ffffffffffffffff81111561142e57600080fd5b80360382131561143d57600080fd5b606080850152611451608085018284611352565b9594505050505056fea2646970667358221220fb66beb3e727c4a0639814d710f71a4d6976d91a7ff39327db40c255205f4eef64736f6c63430008160033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000077b35947d508012589a91ca4c9d168824376cc7d
-----Decoded View---------------
Arg [0] : initOwner (address): 0x77B35947d508012589a91CA4c9d168824376Cc7D
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000077b35947d508012589a91ca4c9d168824376cc7d
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.