Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 4 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
6887616 | 55 days ago | Contract Creation | 0 ETH | |||
6851699 | 61 days ago | Contract Creation | 0 ETH | |||
6851676 | 61 days ago | Contract Creation | 0 ETH | |||
6851400 | 61 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:
DelegatorFactory
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.25; import {Factory} from "./common/Factory.sol"; import {IDelegatorFactory} from "../interfaces/IDelegatorFactory.sol"; contract DelegatorFactory is Factory, IDelegatorFactory { constructor( address owner_ ) Factory(owner_) {} }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.25; import {Registry} from "./Registry.sol"; import {IEntity} from "../../interfaces/common/IEntity.sol"; import {IFactory} from "../../interfaces/common/IFactory.sol"; import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; contract Factory is Registry, Ownable, IFactory { using EnumerableSet for EnumerableSet.AddressSet; using Clones for address; /** * @inheritdoc IFactory */ mapping(uint64 type_ => bool value) public blacklisted; EnumerableSet.AddressSet private _whitelistedImplementations; modifier checkType( uint64 type_ ) { if (type_ >= totalTypes()) { revert InvalidType(); } _; } constructor( address owner_ ) Ownable(owner_) {} /** * @inheritdoc IFactory */ function totalTypes() public view returns (uint64) { return uint64(_whitelistedImplementations.length()); } /** * @inheritdoc IFactory */ function implementation( uint64 type_ ) public view returns (address) { return _whitelistedImplementations.at(type_); } /** * @inheritdoc IFactory */ function whitelist( address implementation_ ) external onlyOwner { if (IEntity(implementation_).FACTORY() != address(this) || IEntity(implementation_).TYPE() != totalTypes()) { revert InvalidImplementation(); } if (!_whitelistedImplementations.add(implementation_)) { revert AlreadyWhitelisted(); } emit Whitelist(implementation_); } /** * @inheritdoc IFactory */ function blacklist( uint64 type_ ) external onlyOwner checkType(type_) { if (blacklisted[type_]) { revert AlreadyBlacklisted(); } blacklisted[type_] = true; emit Blacklist(type_); } /** * @inheritdoc IFactory */ function create(uint64 type_, bytes calldata data) external returns (address entity_) { entity_ = implementation(type_).cloneDeterministic(keccak256(abi.encode(totalEntities(), type_, data))); _addEntity(entity_); IEntity(entity_).initialize(data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IFactory} from "./common/IFactory.sol"; interface IDelegatorFactory is IFactory {}
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.25; import {IRegistry} from "../../interfaces/common/IRegistry.sol"; import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; abstract contract Registry is IRegistry { using EnumerableSet for EnumerableSet.AddressSet; EnumerableSet.AddressSet private _entities; modifier checkEntity( address account ) { _checkEntity(account); _; } /** * @inheritdoc IRegistry */ function isEntity( address entity_ ) public view returns (bool) { return _entities.contains(entity_); } /** * @inheritdoc IRegistry */ function totalEntities() public view returns (uint256) { return _entities.length(); } /** * @inheritdoc IRegistry */ function entity( uint256 index ) public view returns (address) { return _entities.at(index); } function _addEntity( address entity_ ) internal { _entities.add(entity_); emit AddEntity(entity_); } function _checkEntity( address account ) internal view { if (!isEntity(account)) { revert EntityNotExist(); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IEntity { error NotInitialized(); /** * @notice Get the factory's address. * @return address of the factory */ function FACTORY() external view returns (address); /** * @notice Get the entity's type. * @return type of the entity */ function TYPE() external view returns (uint64); /** * @notice Initialize this entity contract by using a given data. * @param data some data to use */ function initialize( bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IRegistry} from "./IRegistry.sol"; interface IFactory is IRegistry { error AlreadyBlacklisted(); error AlreadyWhitelisted(); error InvalidImplementation(); error InvalidType(); /** * @notice Emitted when a new type is whitelisted. * @param implementation address of the new implementation */ event Whitelist(address indexed implementation); /** * @notice Emitted when a type is blacklisted (e.g., in case of invalid implementation). * @param type_ type that was blacklisted * @dev The given type is still deployable. */ event Blacklist(uint64 indexed type_); /** * @notice Get the total number of whitelisted types. * @return total number of types */ function totalTypes() external view returns (uint64); /** * @notice Get the implementation for a given type. * @param type_ position to get the implementation at * @return address of the implementation */ function implementation( uint64 type_ ) external view returns (address); /** * @notice Get if a type is blacklisted (e.g., in case of invalid implementation). * @param type_ type to check * @return whether the type is blacklisted * @dev The given type is still deployable. */ function blacklisted( uint64 type_ ) external view returns (bool); /** * @notice Whitelist a new type of entity. * @param implementation address of the new implementation */ function whitelist( address implementation ) external; /** * @notice Blacklist a type of entity. * @param type_ type to blacklist * @dev The given type will still be deployable. */ function blacklist( uint64 type_ ) external; /** * @notice Create a new entity at the factory. * @param type_ type's implementation to use * @param data initial data for the entity creation * @return address of the entity * @dev CREATE2 salt is constructed from the given parameters. */ function create(uint64 type_, bytes calldata data) external returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/Clones.sol) pragma solidity ^0.8.20; /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. */ library Clones { /** * @dev A clone instance deployment failed. */ error ERC1167FailedCreateClone(); /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes // of the `implementation` address with the bytecode before the address. mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000)) // Packs the remaining 17 bytes of `implementation` with the bytecode after the address. mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)) instance := create(0, 0x09, 0x37) } if (instance == address(0)) { revert ERC1167FailedCreateClone(); } } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes // of the `implementation` address with the bytecode before the address. mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000)) // Packs the remaining 17 bytes of `implementation` with the bytecode after the address. mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)) instance := create2(0, 0x09, 0x37, salt) } if (instance == address(0)) { revert ERC1167FailedCreateClone(); } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(add(ptr, 0x38), deployer) mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff) mstore(add(ptr, 0x14), implementation) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73) mstore(add(ptr, 0x58), salt) mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37)) predicted := keccak256(add(ptr, 0x43), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt ) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } }
// 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.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 pragma solidity ^0.8.0; interface IRegistry { error EntityNotExist(); /** * @notice Emitted when an entity is added. * @param entity address of the added entity */ event AddEntity(address indexed entity); /** * @notice Get if a given address is an entity. * @param account address to check * @return if the given address is an entity */ function isEntity( address account ) external view returns (bool); /** * @notice Get a total number of entities. * @return total number of entities added */ function totalEntities() external view returns (uint256); /** * @notice Get an entity given its index. * @param index index of the entity to get * @return address of the entity */ function entity( uint256 index ) external view returns (address); }
// 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": [ "forge-std/=lib/forge-std/src/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "viaIR": true, "libraries": {} }
[{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyBlacklisted","type":"error"},{"inputs":[],"name":"AlreadyWhitelisted","type":"error"},{"inputs":[],"name":"ERC1167FailedCreateClone","type":"error"},{"inputs":[],"name":"EntityNotExist","type":"error"},{"inputs":[],"name":"InvalidImplementation","type":"error"},{"inputs":[],"name":"InvalidType","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":"entity","type":"address"}],"name":"AddEntity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"type_","type":"uint64"}],"name":"Blacklist","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Whitelist","type":"event"},{"inputs":[{"internalType":"uint64","name":"type_","type":"uint64"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"type_","type":"uint64"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"value","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"type_","type":"uint64"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"create","outputs":[{"internalType":"address","name":"entity_","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"entity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"type_","type":"uint64"}],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"entity_","type":"address"}],"name":"isEntity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalEntities","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTypes","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"implementation_","type":"address"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60803460b757601f610a1338819003918201601f19168301916001600160401b0383118484101760bc5780849260209460405283398101031260b757516001600160a01b03908181169081900360b7578015609e57600280546001600160a01b03198116831790915560405192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a361094090816100d38239f35b604051631e4fbdf760e01b815260006004820152602490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c91826314887c58146106d2575081635cd8b15e146106b5578163715018a6146106585781638da5cb5b1461062f5781639b19251a146104a8578163b42ba2a21461043c578163b572a96614610394578163b6caa11914610357578163cd108ef8146101a9578163f15df2e51461017e578163f2fde38b146100e2575063f9661602146100a957600080fd5b346100de5760203660031901126100de576020906100cd6100c861070b565b610780565b90516001600160a01b039091168152f35b5080fd5b9190503461017a57602036600319011261017a576001600160a01b03823581811693919290849003610176576101166107de565b8315610160575050600254826bffffffffffffffffffffffff60a01b821617600255167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b51631e4fbdf760e01b8152908101849052602490fd5b8480fd5b8280fd5b8284346101a657806003193601126101a6575067ffffffffffffffff60209254169051908152f35b80fd5b8383346100de57806003193601126100de576101c361070b565b6024359267ffffffffffffffff8085116100de57366023860112156100de57848601359281841161017a576024860195602485369201011161017a576e5af43d82803e903d91602b57fd5bf361021882610780565b918454908488519160208301938452168882015260608082015261025281610244608082018a8d61075f565b03601f198101835282610727565b519020608883901c62ffffff16763d602d80600a3d3981f3363d3d373d3d3d363d7300000017855260789290921b176020526001600160a01b03906037600985f516948515610347576102a4866108a2565b50845193867fb919910dcefbf753bfd926ab3b1d3f85d877190c3d01ba1bd585047b99b99f0b8580a2863b1561034357846102f68593829363439fab9160e01b845260208c850152602484019161075f565b038183895af1801561033957610311575b6020858551908152f35b82116103265750602093508152838080610307565b634e487b7160e01b815260418552602490fd5b84513d84823e3d90fd5b8380fd5b84516330be1a3d60e21b81528790fd5b5050346100de5760203660031901126100de5760ff8160209367ffffffffffffffff61038161070b565b1681526003855220541690519015158152f35b9190503461017a57602036600319011261017a576103b061070b565b916103b96107de565b67ffffffffffffffff8082541693169283101561042e57828452600360205260ff8285205416610420575081835260036020528220805460ff191660011790557ffc8245c2838846b295ae66fbe0d08e20c799b737c93b56f7b209df2e5fa2d4588280a280f35b905163f53de75f60e01b8152fd5b905163b968846160e01b8152fd5b8284346101a65760203660031901126101a65782359080548210156104955780527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563015490516001600160a01b03909116815260209150f35b634e487b7160e01b815260328452602490fd5b90503461017a57602091826003193601126103435781356001600160a01b03818116949185900361062b576104db6107de565b82516202dd3160ec1b81529082828681895afa9182156106215787926105e5575b501630148015919061055f575b50610552576105178361080a565b156105455750507feb73900b98b6a3e2b8b01708fe544760cf570d21e7fbe5225f24e48b5b2b432e8280a280f35b5163b73e95e160e01b8152fd5b5163340aafcd60e11b8152fd5b8251635d927f4560e11b815290915081818581885afa9182156105db57869261059c575b505067ffffffffffffffff808454169116141538610509565b90809250813d83116105d4575b6105b38183610727565b81010312610176575167ffffffffffffffff81168103610176573880610583565b503d6105a9565b83513d88823e3d90fd5b9091508281813d831161061a575b6105fd8183610727565b81010312610616575181811681036106165790386104fc565b8680fd5b503d6105f3565b84513d89823e3d90fd5b8580fd5b5050346100de57816003193601126100de5760025490516001600160a01b039091168152602090f35b83346101a657806003193601126101a6576106716107de565b600280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5050346100de57816003193601126100de57602091549051908152f35b9291503461034357602036600319011261034357356001600160a01b038116908190036103435792602093815260018452205415158152f35b6004359067ffffffffffffffff8216820361072257565b600080fd5b90601f8019910116810190811067ffffffffffffffff82111761074957604052565b634e487b7160e01b600052604160045260246000fd5b908060209392818452848401376000828201840152601f01601f1916010190565b67ffffffffffffffff166004548110156107c85760046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01546001600160a01b031690565b634e487b7160e01b600052603260045260246000fd5b6002546001600160a01b031633036107f257565b60405163118cdaa760e01b8152336004820152602490fd5b60008181526005602052604081205461089d57600454600160401b8110156108895760018101806004558110156108755790826040927f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b015560045492815260056020522055600190565b634e487b7160e01b82526032600452602482fd5b634e487b7160e01b82526041600452602482fd5b905090565b60008181526001602052604081205461089d578054600160401b81101561088957600181018083558110156108755790826040927f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563015580549281526001602052205560019056fea2646970667358221220a186e9cb7c001cb1df8b17fc71172f9c816f5e516ccb0cae47a916edd268286564736f6c63430008190033000000000000000000000000854b26ec648f3cca70879bb3405d28c9505adbbd
Deployed Bytecode
0x608060408181526004918236101561001657600080fd5b600092833560e01c91826314887c58146106d2575081635cd8b15e146106b5578163715018a6146106585781638da5cb5b1461062f5781639b19251a146104a8578163b42ba2a21461043c578163b572a96614610394578163b6caa11914610357578163cd108ef8146101a9578163f15df2e51461017e578163f2fde38b146100e2575063f9661602146100a957600080fd5b346100de5760203660031901126100de576020906100cd6100c861070b565b610780565b90516001600160a01b039091168152f35b5080fd5b9190503461017a57602036600319011261017a576001600160a01b03823581811693919290849003610176576101166107de565b8315610160575050600254826bffffffffffffffffffffffff60a01b821617600255167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b51631e4fbdf760e01b8152908101849052602490fd5b8480fd5b8280fd5b8284346101a657806003193601126101a6575067ffffffffffffffff60209254169051908152f35b80fd5b8383346100de57806003193601126100de576101c361070b565b6024359267ffffffffffffffff8085116100de57366023860112156100de57848601359281841161017a576024860195602485369201011161017a576e5af43d82803e903d91602b57fd5bf361021882610780565b918454908488519160208301938452168882015260608082015261025281610244608082018a8d61075f565b03601f198101835282610727565b519020608883901c62ffffff16763d602d80600a3d3981f3363d3d373d3d3d363d7300000017855260789290921b176020526001600160a01b03906037600985f516948515610347576102a4866108a2565b50845193867fb919910dcefbf753bfd926ab3b1d3f85d877190c3d01ba1bd585047b99b99f0b8580a2863b1561034357846102f68593829363439fab9160e01b845260208c850152602484019161075f565b038183895af1801561033957610311575b6020858551908152f35b82116103265750602093508152838080610307565b634e487b7160e01b815260418552602490fd5b84513d84823e3d90fd5b8380fd5b84516330be1a3d60e21b81528790fd5b5050346100de5760203660031901126100de5760ff8160209367ffffffffffffffff61038161070b565b1681526003855220541690519015158152f35b9190503461017a57602036600319011261017a576103b061070b565b916103b96107de565b67ffffffffffffffff8082541693169283101561042e57828452600360205260ff8285205416610420575081835260036020528220805460ff191660011790557ffc8245c2838846b295ae66fbe0d08e20c799b737c93b56f7b209df2e5fa2d4588280a280f35b905163f53de75f60e01b8152fd5b905163b968846160e01b8152fd5b8284346101a65760203660031901126101a65782359080548210156104955780527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563015490516001600160a01b03909116815260209150f35b634e487b7160e01b815260328452602490fd5b90503461017a57602091826003193601126103435781356001600160a01b03818116949185900361062b576104db6107de565b82516202dd3160ec1b81529082828681895afa9182156106215787926105e5575b501630148015919061055f575b50610552576105178361080a565b156105455750507feb73900b98b6a3e2b8b01708fe544760cf570d21e7fbe5225f24e48b5b2b432e8280a280f35b5163b73e95e160e01b8152fd5b5163340aafcd60e11b8152fd5b8251635d927f4560e11b815290915081818581885afa9182156105db57869261059c575b505067ffffffffffffffff808454169116141538610509565b90809250813d83116105d4575b6105b38183610727565b81010312610176575167ffffffffffffffff81168103610176573880610583565b503d6105a9565b83513d88823e3d90fd5b9091508281813d831161061a575b6105fd8183610727565b81010312610616575181811681036106165790386104fc565b8680fd5b503d6105f3565b84513d89823e3d90fd5b8580fd5b5050346100de57816003193601126100de5760025490516001600160a01b039091168152602090f35b83346101a657806003193601126101a6576106716107de565b600280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5050346100de57816003193601126100de57602091549051908152f35b9291503461034357602036600319011261034357356001600160a01b038116908190036103435792602093815260018452205415158152f35b6004359067ffffffffffffffff8216820361072257565b600080fd5b90601f8019910116810190811067ffffffffffffffff82111761074957604052565b634e487b7160e01b600052604160045260246000fd5b908060209392818452848401376000828201840152601f01601f1916010190565b67ffffffffffffffff166004548110156107c85760046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01546001600160a01b031690565b634e487b7160e01b600052603260045260246000fd5b6002546001600160a01b031633036107f257565b60405163118cdaa760e01b8152336004820152602490fd5b60008181526005602052604081205461089d57600454600160401b8110156108895760018101806004558110156108755790826040927f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b015560045492815260056020522055600190565b634e487b7160e01b82526032600452602482fd5b634e487b7160e01b82526041600452602482fd5b905090565b60008181526001602052604081205461089d578054600160401b81101561088957600181018083558110156108755790826040927f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563015580549281526001602052205560019056fea2646970667358221220a186e9cb7c001cb1df8b17fc71172f9c816f5e516ccb0cae47a916edd268286564736f6c63430008190033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000854b26ec648f3cca70879bb3405d28c9505adbbd
-----Decoded View---------------
Arg [0] : owner_ (address): 0x854b26Ec648F3cCa70879bb3405d28C9505AdBbd
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000854b26ec648f3cca70879bb3405d28c9505adbbd
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.