Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 10 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x3d602d80 | 23714496 | 139 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 23699491 | 142 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 23699459 | 142 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 23699122 | 142 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 23684441 | 144 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 23684423 | 144 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 23681814 | 144 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 23668929 | 146 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 23668673 | 146 days ago | Contract Creation | 0 ETH | |||
| 0x3d602d80 | 23668635 | 146 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
EtfTokenDeployer
Compiler Version
v0.8.30+commit.73712a01
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.30;
import "@openzeppelin/contracts/proxy/Clones.sol";
import "hopium/common/interface/imDirectory.sol";
import "hopium/etf/interface/iEtfToken.sol";
abstract contract Helpers is ImDirectory {
function _randomSalt() internal view returns (bytes32) {
return keccak256(
abi.encodePacked(
block.timestamp,
block.prevrandao, // replaces block.difficulty since 0.8.18
msg.sender,
gasleft()
)
);
}
error ImplNotSet();
function _getTokenImplAddress() internal view returns (address tokenImpl) {
tokenImpl = fetchFromDirectory("etf-token-impl");
if (tokenImpl == address(0)) revert ImplNotSet();
}
}
/// @notice Factory that mints minimal-proxy clones of EtfToken (EIP-1167)
contract EtfTokenDeployer is ImDirectory, Helpers {
using Clones for address;
constructor(address _directory) ImDirectory(_directory) {}
/// @notice Deploy a new ETF token clone with per-clone name/symbol
function deployEtfToken(uint256 etfId, string calldata name, string calldata symbol) external returns (address proxy) {
// Create deterministic clone (CREATE2). Reverts if already deployed for same salt.
proxy = Clones.cloneDeterministic(_getTokenImplAddress(), _randomSalt());
// Initialize with per-clone params
IEtfToken(proxy).initialize(etfId, name, symbol, address(Directory));
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.30;
interface IEtfToken {
function initialize(uint256 etfId_, string memory name_, string memory symbol_, address directory_) external;
function mint(address to, uint256 amount) external;
function burn(address from, uint256 amount) external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.30;
/// @notice Interface used by the registry to talk to the external directory.
interface IDirectory {
function owner() external view returns (address);
function fetchFromDirectory(string memory _key) external view returns (address);
}
abstract contract ImDirectory {
IDirectory public Directory;
constructor(address _directory) {
_setDirectory(_directory); // no modifier here
}
function changeDirectoryAddress(address _directory) external onlyOwner {
_setDirectory(_directory);
}
function _setDirectory(address _directory) internal {
require(_directory != address(0), "Directory cannot be zero address");
require(_directory.code.length > 0, "Directory must be a contract");
// Sanity check the interface
try IDirectory(_directory).owner() returns (address) {
Directory = IDirectory(_directory);
} catch {
revert("Directory address does not implement owner()");
}
}
modifier onlyOwner() {
require(msg.sender == Directory.owner(), "Caller is not the owner");
_;
}
function owner() public view returns (address) {
return Directory.owner();
}
function fetchFromDirectory(string memory _key) public view returns (address) {
return Directory.fetchFromDirectory(_key);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (proxy/Clones.sol)
pragma solidity ^0.8.20;
import {Create2} from "../utils/Create2.sol";
import {Errors} from "../utils/Errors.sol";
/**
* @dev https://eips.ethereum.org/EIPS/eip-1167[ERC-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 {
error CloneArgumentsTooLong();
/**
* @dev Deploys and returns the address of a clone that mimics the behavior of `implementation`.
*
* This function uses the create opcode, which should never revert.
*
* WARNING: This function does not check if `implementation` has code. A clone that points to an address
* without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
* have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
*/
function clone(address implementation) internal returns (address instance) {
return clone(implementation, 0);
}
/**
* @dev Same as {xref-Clones-clone-address-}[clone], but with a `value` parameter to send native currency
* to the new contract.
*
* WARNING: This function does not check if `implementation` has code. A clone that points to an address
* without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
* have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
*
* NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
* to always have enough balance for new deployments. Consider exposing this function under a payable method.
*/
function clone(address implementation, uint256 value) internal returns (address instance) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
assembly ("memory-safe") {
// 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(value, 0x09, 0x37)
}
if (instance == address(0)) {
revert Errors.FailedDeployment();
}
}
/**
* @dev Deploys and returns the address of a clone that mimics the behavior of `implementation`.
*
* This function uses the create2 opcode and a `salt` to deterministically deploy
* the clone. Using the same `implementation` and `salt` multiple times will revert, since
* the clones cannot be deployed twice at the same address.
*
* WARNING: This function does not check if `implementation` has code. A clone that points to an address
* without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
* have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
*/
function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
return cloneDeterministic(implementation, salt, 0);
}
/**
* @dev Same as {xref-Clones-cloneDeterministic-address-bytes32-}[cloneDeterministic], but with
* a `value` parameter to send native currency to the new contract.
*
* WARNING: This function does not check if `implementation` has code. A clone that points to an address
* without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
* have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
*
* NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
* to always have enough balance for new deployments. Consider exposing this function under a payable method.
*/
function cloneDeterministic(
address implementation,
bytes32 salt,
uint256 value
) internal returns (address instance) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
assembly ("memory-safe") {
// 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(value, 0x09, 0x37, salt)
}
if (instance == address(0)) {
revert Errors.FailedDeployment();
}
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(
address implementation,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
assembly ("memory-safe") {
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 := and(keccak256(add(ptr, 0x43), 0x55), 0xffffffffffffffffffffffffffffffffffffffff)
}
}
/**
* @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));
}
/**
* @dev Deploys and returns the address of a clone that mimics the behavior of `implementation` with custom
* immutable arguments. These are provided through `args` and cannot be changed after deployment. To
* access the arguments within the implementation, use {fetchCloneArgs}.
*
* This function uses the create opcode, which should never revert.
*
* WARNING: This function does not check if `implementation` has code. A clone that points to an address
* without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
* have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
*/
function cloneWithImmutableArgs(address implementation, bytes memory args) internal returns (address instance) {
return cloneWithImmutableArgs(implementation, args, 0);
}
/**
* @dev Same as {xref-Clones-cloneWithImmutableArgs-address-bytes-}[cloneWithImmutableArgs], but with a `value`
* parameter to send native currency to the new contract.
*
* WARNING: This function does not check if `implementation` has code. A clone that points to an address
* without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
* have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
*
* NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
* to always have enough balance for new deployments. Consider exposing this function under a payable method.
*/
function cloneWithImmutableArgs(
address implementation,
bytes memory args,
uint256 value
) internal returns (address instance) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
bytes memory bytecode = _cloneCodeWithImmutableArgs(implementation, args);
assembly ("memory-safe") {
instance := create(value, add(bytecode, 0x20), mload(bytecode))
}
if (instance == address(0)) {
revert Errors.FailedDeployment();
}
}
/**
* @dev Deploys and returns the address of a clone that mimics the behavior of `implementation` with custom
* immutable arguments. These are provided through `args` and cannot be changed after deployment. To
* access the arguments within the implementation, use {fetchCloneArgs}.
*
* This function uses the create2 opcode and a `salt` to deterministically deploy the clone. Using the same
* `implementation`, `args` and `salt` multiple times will revert, since the clones cannot be deployed twice
* at the same address.
*
* WARNING: This function does not check if `implementation` has code. A clone that points to an address
* without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
* have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
*/
function cloneDeterministicWithImmutableArgs(
address implementation,
bytes memory args,
bytes32 salt
) internal returns (address instance) {
return cloneDeterministicWithImmutableArgs(implementation, args, salt, 0);
}
/**
* @dev Same as {xref-Clones-cloneDeterministicWithImmutableArgs-address-bytes-bytes32-}[cloneDeterministicWithImmutableArgs],
* but with a `value` parameter to send native currency to the new contract.
*
* WARNING: This function does not check if `implementation` has code. A clone that points to an address
* without code cannot be initialized. Initialization calls may appear to be successful when, in reality, they
* have no effect and leave the clone uninitialized, allowing a third party to initialize it later.
*
* NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
* to always have enough balance for new deployments. Consider exposing this function under a payable method.
*/
function cloneDeterministicWithImmutableArgs(
address implementation,
bytes memory args,
bytes32 salt,
uint256 value
) internal returns (address instance) {
bytes memory bytecode = _cloneCodeWithImmutableArgs(implementation, args);
return Create2.deploy(value, salt, bytecode);
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministicWithImmutableArgs}.
*/
function predictDeterministicAddressWithImmutableArgs(
address implementation,
bytes memory args,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
bytes memory bytecode = _cloneCodeWithImmutableArgs(implementation, args);
return Create2.computeAddress(salt, keccak256(bytecode), deployer);
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministicWithImmutableArgs}.
*/
function predictDeterministicAddressWithImmutableArgs(
address implementation,
bytes memory args,
bytes32 salt
) internal view returns (address predicted) {
return predictDeterministicAddressWithImmutableArgs(implementation, args, salt, address(this));
}
/**
* @dev Get the immutable args attached to a clone.
*
* - If `instance` is a clone that was deployed using `clone` or `cloneDeterministic`, this
* function will return an empty array.
* - If `instance` is a clone that was deployed using `cloneWithImmutableArgs` or
* `cloneDeterministicWithImmutableArgs`, this function will return the args array used at
* creation.
* - If `instance` is NOT a clone deployed using this library, the behavior is undefined. This
* function should only be used to check addresses that are known to be clones.
*/
function fetchCloneArgs(address instance) internal view returns (bytes memory) {
bytes memory result = new bytes(instance.code.length - 45); // revert if length is too short
assembly ("memory-safe") {
extcodecopy(instance, add(result, 32), 45, mload(result))
}
return result;
}
/**
* @dev Helper that prepares the initcode of the proxy with immutable args.
*
* An assembly variant of this function requires copying the `args` array, which can be efficiently done using
* `mcopy`. Unfortunately, that opcode is not available before cancun. A pure solidity implementation using
* abi.encodePacked is more expensive but also more portable and easier to review.
*
* NOTE: https://eips.ethereum.org/EIPS/eip-170[EIP-170] limits the length of the contract code to 24576 bytes.
* With the proxy code taking 45 bytes, that limits the length of the immutable args to 24531 bytes.
*/
function _cloneCodeWithImmutableArgs(
address implementation,
bytes memory args
) private pure returns (bytes memory) {
if (args.length > 24531) revert CloneArgumentsTooLong();
return
abi.encodePacked(
hex"61",
uint16(args.length + 45),
hex"3d81600a3d39f3363d3d373d3d3d363d73",
implementation,
hex"5af43d82803e903d91602b57fd5bf3",
args
);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of common custom errors used in multiple contracts
*
* IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
* It is recommended to avoid relying on the error API for critical functionality.
*
* _Available since v5.1._
*/
library Errors {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error InsufficientBalance(uint256 balance, uint256 needed);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedCall();
/**
* @dev The deployment failed.
*/
error FailedDeployment();
/**
* @dev A necessary precompile is missing.
*/
error MissingPrecompile(address);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/Create2.sol)
pragma solidity ^0.8.20;
import {Errors} from "./Errors.sol";
/**
* @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.
* `CREATE2` can be used to compute in advance the address where a smart
* contract will be deployed, which allows for interesting new mechanisms known
* as 'counterfactual interactions'.
*
* See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more
* information.
*/
library Create2 {
/**
* @dev There's no code to deploy.
*/
error Create2EmptyBytecode();
/**
* @dev Deploys a contract using `CREATE2`. The address where the contract
* will be deployed can be known in advance via {computeAddress}.
*
* The bytecode for a contract can be obtained from Solidity with
* `type(contractName).creationCode`.
*
* Requirements:
*
* - `bytecode` must not be empty.
* - `salt` must have not been used for `bytecode` already.
* - the factory must have a balance of at least `amount`.
* - if `amount` is non-zero, `bytecode` must have a `payable` constructor.
*/
function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {
if (address(this).balance < amount) {
revert Errors.InsufficientBalance(address(this).balance, amount);
}
if (bytecode.length == 0) {
revert Create2EmptyBytecode();
}
assembly ("memory-safe") {
addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)
// if no address was created, and returndata is not empty, bubble revert
if and(iszero(addr), not(iszero(returndatasize()))) {
let p := mload(0x40)
returndatacopy(p, 0, returndatasize())
revert(p, returndatasize())
}
}
if (addr == address(0)) {
revert Errors.FailedDeployment();
}
}
/**
* @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the
* `bytecodeHash` or `salt` will result in a new destination address.
*/
function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {
return computeAddress(salt, bytecodeHash, address(this));
}
/**
* @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at
* `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.
*/
function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {
assembly ("memory-safe") {
let ptr := mload(0x40) // Get free memory pointer
// | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |
// |-------------------|---------------------------------------------------------------------------|
// | bytecodeHash | CCCCCCCCCCCCC...CC |
// | salt | BBBBBBBBBBBBB...BB |
// | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |
// | 0xFF | FF |
// |-------------------|---------------------------------------------------------------------------|
// | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |
// | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |
mstore(add(ptr, 0x40), bytecodeHash)
mstore(add(ptr, 0x20), salt)
mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes
let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff
mstore8(start, 0xff)
addr := and(keccak256(start, 85), 0xffffffffffffffffffffffffffffffffffffffff)
}
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": []
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_directory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FailedDeployment","type":"error"},{"inputs":[],"name":"ImplNotSet","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"Directory","outputs":[{"internalType":"contract IDirectory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_directory","type":"address"}],"name":"changeDirectoryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"etfId","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"name":"deployEtfToken","outputs":[{"internalType":"address","name":"proxy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_key","type":"string"}],"name":"fetchFromDirectory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561000f575f5ffd5b50604051610abb380380610abb83398101604081905261002e916101ce565b806100388161003f565b50506101fb565b6001600160a01b03811661009a5760405162461bcd60e51b815260206004820181905260248201527f4469726563746f72792063616e6e6f74206265207a65726f206164647265737360448201526064015b60405180910390fd5b5f816001600160a01b03163b116100f35760405162461bcd60e51b815260206004820152601c60248201527f4469726563746f7279206d757374206265206120636f6e7472616374000000006044820152606401610091565b806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561014d575060408051601f3d908101601f1916820190925261014a918101906101ce565b60015b6101ae5760405162461bcd60e51b815260206004820152602c60248201527f4469726563746f7279206164647265737320646f6573206e6f7420696d706c6560448201526b6d656e74206f776e6572282960a01b6064820152608401610091565b505f80546001600160a01b0383166001600160a01b031990911617905550565b5f602082840312156101de575f5ffd5b81516001600160a01b03811681146101f4575f5ffd5b9392505050565b6108b3806102085f395ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80632726261814610059578063658a847a1461008857806378f6c7c41461009a5780638da5cb5b146100ad578063ba4c7be1146100b5575b5f5ffd5b61006c61006736600461061d565b6100ca565b6040516001600160a01b03909116815260200160405180910390f35b5f5461006c906001600160a01b031681565b61006c6100a8366004610715565b61013f565b61006c6101cc565b6100c86100c33660046107a2565b610245565b005b5f80546040516304e4c4c360e31b81526001600160a01b03909116906327262618906100fa9085906004016107bd565b602060405180830381865afa158015610115573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061013991906107f2565b92915050565b5f61015861014b610329565b610153610385565b6103d7565b5f54604051631baf4d8b60e21b81529192506001600160a01b0380841692636ebd362c92610196928b928b928b928b928b9290911690600401610835565b5f604051808303815f87803b1580156101ad575f5ffd5b505af11580156101bf573d5f5f3e3d5ffd5b5050505095945050505050565b5f5f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561021c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024091906107f2565b905090565b5f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610294573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102b891906107f2565b6001600160a01b0316336001600160a01b03161461031d5760405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b610326816103ea565b50565b5f6103596040518060400160405280600e81526020016d195d198b5d1bdad95b8b5a5b5c1b60921b8152506100ca565b90506001600160a01b03811661038257604051638020a5c760e01b815260040160405180910390fd5b90565b5f4244335a6040805160208101959095528401929092526bffffffffffffffffffffffff19606091821b1690830152607482015260940160405160208183030381529060405280519060200120905090565b5f6103e383835f610574565b9392505050565b6001600160a01b0381166104405760405162461bcd60e51b815260206004820181905260248201527f4469726563746f72792063616e6e6f74206265207a65726f20616464726573736044820152606401610314565b5f816001600160a01b03163b116104995760405162461bcd60e51b815260206004820152601c60248201527f4469726563746f7279206d757374206265206120636f6e7472616374000000006044820152606401610314565b806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156104f3575060408051601f3d908101601f191682019092526104f0918101906107f2565b60015b6105545760405162461bcd60e51b815260206004820152602c60248201527f4469726563746f7279206164647265737320646f6573206e6f7420696d706c6560448201526b6d656e74206f776e6572282960a01b6064820152608401610314565b505f80546001600160a01b0383166001600160a01b031990911617905550565b5f8147101561059f5760405163cf47918160e01b815247600482015260248101839052604401610314565b763d602d80600a3d3981f3363d3d373d3d3d363d730000008460601b60e81c175f526e5af43d82803e903d91602b57fd5bf38460781b17602052826037600984f590506001600160a01b0381166103e35760405163b06ebf3d60e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561062d575f5ffd5b813567ffffffffffffffff811115610643575f5ffd5b8201601f81018413610653575f5ffd5b803567ffffffffffffffff81111561066d5761066d610609565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561069c5761069c610609565b6040528181528282016020018610156106b3575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f83601f8401126106e0575f5ffd5b50813567ffffffffffffffff8111156106f7575f5ffd5b60208301915083602082850101111561070e575f5ffd5b9250929050565b5f5f5f5f5f60608688031215610729575f5ffd5b85359450602086013567ffffffffffffffff811115610746575f5ffd5b610752888289016106d0565b909550935050604086013567ffffffffffffffff811115610771575f5ffd5b61077d888289016106d0565b969995985093965092949392505050565b6001600160a01b0381168114610326575f5ffd5b5f602082840312156107b2575f5ffd5b81356103e38161078e565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215610802575f5ffd5b81516103e38161078e565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b868152608060208201525f61084e60808301878961080d565b828103604084015261086181868861080d565b91505060018060a01b038316606083015297965050505050505056fea26469706673582212204cb3d1d90b4a22406ff9e6bf8539e4a596407d94412c4e4908d1727da2db5ddd64736f6c634300081e0033000000000000000000000000ec8b3d03fae8ff245fd629172e776811188c5447
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610055575f3560e01c80632726261814610059578063658a847a1461008857806378f6c7c41461009a5780638da5cb5b146100ad578063ba4c7be1146100b5575b5f5ffd5b61006c61006736600461061d565b6100ca565b6040516001600160a01b03909116815260200160405180910390f35b5f5461006c906001600160a01b031681565b61006c6100a8366004610715565b61013f565b61006c6101cc565b6100c86100c33660046107a2565b610245565b005b5f80546040516304e4c4c360e31b81526001600160a01b03909116906327262618906100fa9085906004016107bd565b602060405180830381865afa158015610115573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061013991906107f2565b92915050565b5f61015861014b610329565b610153610385565b6103d7565b5f54604051631baf4d8b60e21b81529192506001600160a01b0380841692636ebd362c92610196928b928b928b928b928b9290911690600401610835565b5f604051808303815f87803b1580156101ad575f5ffd5b505af11580156101bf573d5f5f3e3d5ffd5b5050505095945050505050565b5f5f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561021c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024091906107f2565b905090565b5f5f9054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610294573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102b891906107f2565b6001600160a01b0316336001600160a01b03161461031d5760405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b610326816103ea565b50565b5f6103596040518060400160405280600e81526020016d195d198b5d1bdad95b8b5a5b5c1b60921b8152506100ca565b90506001600160a01b03811661038257604051638020a5c760e01b815260040160405180910390fd5b90565b5f4244335a6040805160208101959095528401929092526bffffffffffffffffffffffff19606091821b1690830152607482015260940160405160208183030381529060405280519060200120905090565b5f6103e383835f610574565b9392505050565b6001600160a01b0381166104405760405162461bcd60e51b815260206004820181905260248201527f4469726563746f72792063616e6e6f74206265207a65726f20616464726573736044820152606401610314565b5f816001600160a01b03163b116104995760405162461bcd60e51b815260206004820152601c60248201527f4469726563746f7279206d757374206265206120636f6e7472616374000000006044820152606401610314565b806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156104f3575060408051601f3d908101601f191682019092526104f0918101906107f2565b60015b6105545760405162461bcd60e51b815260206004820152602c60248201527f4469726563746f7279206164647265737320646f6573206e6f7420696d706c6560448201526b6d656e74206f776e6572282960a01b6064820152608401610314565b505f80546001600160a01b0383166001600160a01b031990911617905550565b5f8147101561059f5760405163cf47918160e01b815247600482015260248101839052604401610314565b763d602d80600a3d3981f3363d3d373d3d3d363d730000008460601b60e81c175f526e5af43d82803e903d91602b57fd5bf38460781b17602052826037600984f590506001600160a01b0381166103e35760405163b06ebf3d60e01b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561062d575f5ffd5b813567ffffffffffffffff811115610643575f5ffd5b8201601f81018413610653575f5ffd5b803567ffffffffffffffff81111561066d5761066d610609565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561069c5761069c610609565b6040528181528282016020018610156106b3575f5ffd5b816020840160208301375f91810160200191909152949350505050565b5f5f83601f8401126106e0575f5ffd5b50813567ffffffffffffffff8111156106f7575f5ffd5b60208301915083602082850101111561070e575f5ffd5b9250929050565b5f5f5f5f5f60608688031215610729575f5ffd5b85359450602086013567ffffffffffffffff811115610746575f5ffd5b610752888289016106d0565b909550935050604086013567ffffffffffffffff811115610771575f5ffd5b61077d888289016106d0565b969995985093965092949392505050565b6001600160a01b0381168114610326575f5ffd5b5f602082840312156107b2575f5ffd5b81356103e38161078e565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215610802575f5ffd5b81516103e38161078e565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b868152608060208201525f61084e60808301878961080d565b828103604084015261086181868861080d565b91505060018060a01b038316606083015297965050505050505056fea26469706673582212204cb3d1d90b4a22406ff9e6bf8539e4a596407d94412c4e4908d1727da2db5ddd64736f6c634300081e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ec8b3d03fae8ff245fd629172e776811188c5447
-----Decoded View---------------
Arg [0] : _directory (address): 0xEC8B3D03fae8fF245Fd629172E776811188C5447
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ec8b3d03fae8ff245fd629172e776811188c5447
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.