Source Code
Overview
APE Balance
0 APE
More Info
ContractCreator
Latest 3 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
13746890 | 4 days ago | Contract Creation | 0 APE | |||
13746890 | 4 days ago | 0 APE | ||||
13746487 | 4 days ago | Contract Creation | 0 APE |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Create2Factory
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; import {Create2} from "@openzeppelin/contracts/utils/Create2.sol"; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import {ICreate2Factory} from "./ICreate2Factory.sol"; /** * @dev CREATE2 Factory * Deploys contracts deterministically with `msg.sender` checks and initData. * Salt is computed as keccak256 of: * - `salt` * - `msgSender` (address(0) or `msg.sender`) * - `initData` post-deploy init call */ contract Create2Factory is ICreate2Factory { error InvalidSender(address expected, address actual); /** * @dev Compute salt based keccak256(salt, msgSender, initData) * Pass msgSender = address(0) if contract can be deployed by anyone * Pass initData = 0x if contract has no initialization */ function _salt(address msgSender, bytes32 salt, bytes memory initData) internal pure returns (bytes32) { return keccak256(abi.encode(msgSender, salt, initData)); } /** * @inheritdoc ICreate2Factory */ function create(address msgSender, Contract[] calldata contracts) external returns (address[] memory) { if (msgSender != address(0) && msgSender != msg.sender) revert InvalidSender(msgSender, msg.sender); address[] memory contractAddresses = new address[](contracts.length); for (uint256 i = 0; i < contracts.length; i++) { // Compute keccak256(abi.encode(msgSender, salt, initData)); bytes32 salt = _salt(msgSender, contracts[i].salt, contracts[i].initData); bytes32 bytecodeHash = keccak256(contracts[i].bytecode); // Compute counterfactual address address contractAddress = Create2.computeAddress(salt, bytecodeHash, address(this)); // If contract not deployed, we deploy it // Else we do NOT error, simply return address (to avoid race conditions) if (contractAddress.code.length == 0) { // Create contract Create2.deploy(0, salt, contracts[i].bytecode); // Emit ContractCreated event bool implementation = msgSender == address(0) && salt == bytes32(0) && contracts[i].initData.length == 0; emit ContractCreated(msgSender, bytecodeHash, implementation, contractAddress); //Initialize if needed if (contracts[i].initData.length > 0) { // Initialize Address.functionCall(contractAddress, contracts[i].initData); } } // Add contractAddress to return array contractAddresses[i] = contractAddress; } return contractAddresses; } }
// 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/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Create2.sol) pragma solidity ^0.8.20; /** * @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 Not enough balance for performing a CREATE2 deploy. */ error Create2InsufficientBalance(uint256 balance, uint256 needed); /** * @dev There's no code to deploy. */ error Create2EmptyBytecode(); /** * @dev The deployment failed. */ error Create2FailedDeployment(); /** * @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 Create2InsufficientBalance(address(this).balance, amount); } if (bytecode.length == 0) { revert Create2EmptyBytecode(); } /// @solidity memory-safe-assembly assembly { addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt) } if (addr == address(0)) { revert Create2FailedDeployment(); } } /** * @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) { /// @solidity memory-safe-assembly assembly { 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 := keccak256(start, 85) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * @dev CREATE2 Factory. * Create contracts deterministically, adds optional salt that can be tied to msg.sender address */ interface ICreate2Factory { /** * Event emitted on contract creation, indexed fields enable filtering. * This enables advanced fields for finding contracts with specific behaviour. * Salt and initData are not included because initData would make the cost of the event variable, and salt would not * be useful to filter by. We recommend fetching the original transaction if this data is needed. * * Event fields * - msgSender: Filter for initialized contracts from a specific sender. * - bytecodeHash: Filter by bytecodeHash (eg. Find all specific ERC20 implementations). * This will include constructor data if provided, reducing the ability to filter. * - implementation: Filter for implementation contracts. True if msgSender == address(0) && salt == 0 && initData == 0. * Contracts with constructor data, may still show up as true and should NOT be used as proxy implementations. * - contractAddress: Contract address. Not indexed. */ event ContractCreated( address indexed msgSender, bytes32 indexed bytecodeHash, bool indexed implementation, address contractAddress ); /** * Contract creation struct includes core parameters for CREATE2 contract creation * - salt: A unique salt. This is rehashed with the msgSender and initData parameters. * - bytecode: Contract deployment bytecode. MUST include constructor data if needed. * - initData: Post-creation initData. A call is immediately made to the contract post-creation. Useful for proxies. */ struct Contract { bytes32 salt; bytes bytecode; bytes initData; } /** * @dev Create batch of contracts with CREATE, with optional initialization * @param msgSender enforce `msg.sender === msgSender` if non-zero. Added to salt to prevent different users from deploying at same address on other chains. * @param contracts CREATE2 contract creation data */ function create(address msgSender, Contract[] calldata contracts) external returns (address[] memory); }
{ "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 1000000 }, "evmVersion": "paris", "viaIR": true, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"Create2EmptyBytecode","type":"error"},{"inputs":[],"name":"Create2FailedDeployment","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"Create2InsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"expected","type":"address"},{"internalType":"address","name":"actual","type":"address"}],"name":"InvalidSender","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"msgSender","type":"address"},{"indexed":true,"internalType":"bytes32","name":"bytecodeHash","type":"bytes32"},{"indexed":true,"internalType":"bool","name":"implementation","type":"bool"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"ContractCreated","type":"event"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"},{"components":[{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"bytes","name":"bytecode","type":"bytes"},{"internalType":"bytes","name":"initData","type":"bytes"}],"internalType":"struct ICreate2Factory.Contract[]","name":"contracts","type":"tuple[]"}],"name":"create","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60808060405234610016576107c1908161001c8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c638cfcfbc71461002857600080fd5b3461055c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261055c5760043573ffffffffffffffffffffffffffffffffffffffff8116810361055c576024359167ffffffffffffffff80841161055c573660238501121561055c5783600401351161055c57366024846004013560051b8501011161055c5773ffffffffffffffffffffffffffffffffffffffff821615158061053c575b6104f357506100e482600401356105d1565b916100f26040519384610561565b60048101358084527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090610125906105d1565b0136602085013760005b81600401358110610196578360405180916020820160208352815180915260206040840192019060005b818110610167575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101610159565b6101a8818360040135602485016105e9565b356101d26101cb6101c1848660040135602488016105e9565b6040810190610629565b36916106b4565b6040519173ffffffffffffffffffffffffffffffffffffffff86166020840152604083015260608083015280519081608084015260005b8281106104de57505061025790827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60a093600085828601015201168101036080810184520182610561565b60208151910120906102816101cb610277838660040135602488016105e9565b6020810190610629565b60208151910120916055600b6040518560408201528360208201523081520160ff81532092833b15610311575b505084518110156102e25773ffffffffffffffffffffffffffffffffffffffff6001921660208260051b870101520161012f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6103296101cb61027785886004013560248a016105e9565b8051156104b4578281602073ffffffffffffffffffffffffffffffffffffffff935191016000f5161561048a5773ffffffffffffffffffffffffffffffffffffffff8616159182610481575b5081610461575b6040519173ffffffffffffffffffffffffffffffffffffffff851683521515917fda1c8afc2018a6f895a3f022a42fe4ee3df09d1a0fbaa7d3b47f9d8fa1628f33602073ffffffffffffffffffffffffffffffffffffffff891692a46103ed6101c1828560040135602487016105e9565b90506103fb575b38806102ae565b6104536000806104196101cb6101c186896004013560248b016105e9565b60208151910182875af13d15610459573d906104348261067a565b916104426040519384610561565b82523d6000602084013e5b846106eb565b506103f4565b60609061044d565b90506104786101c1838660040135602488016105e9565b9050159061037c565b15915038610375565b60046040517f741752c2000000000000000000000000000000000000000000000000000000008152fd5b60046040517f4ca249dc000000000000000000000000000000000000000000000000000000008152fd5b602081830181015160a0868401015201610209565b73ffffffffffffffffffffffffffffffffffffffff6044927fe1130dba000000000000000000000000000000000000000000000000000000008352166004820152336024820152fd5b503373ffffffffffffffffffffffffffffffffffffffff831614156100d2565b600080fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176105a257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116105a25760051b60200190565b91908110156102e25760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18136030182121561055c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561055c570180359067ffffffffffffffff821161055c5760200191813603831361055c57565b67ffffffffffffffff81116105a257601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926106c08261067a565b916106ce6040519384610561565b82948184528183011161055c578281602093846000960137010152565b9061072a575080511561070057805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b81511580610782575b61073b575090565b60249073ffffffffffffffffffffffffffffffffffffffff604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b1561073356fea2646970667358221220390b33b5aad15a7a4a2adfbd8fd21db27bb73542ec44ce93b5c24526470fb11f64736f6c63430008170033
Deployed Bytecode
0x608080604052600436101561001357600080fd5b60003560e01c638cfcfbc71461002857600080fd5b3461055c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261055c5760043573ffffffffffffffffffffffffffffffffffffffff8116810361055c576024359167ffffffffffffffff80841161055c573660238501121561055c5783600401351161055c57366024846004013560051b8501011161055c5773ffffffffffffffffffffffffffffffffffffffff821615158061053c575b6104f357506100e482600401356105d1565b916100f26040519384610561565b60048101358084527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090610125906105d1565b0136602085013760005b81600401358110610196578360405180916020820160208352815180915260206040840192019060005b818110610167575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101610159565b6101a8818360040135602485016105e9565b356101d26101cb6101c1848660040135602488016105e9565b6040810190610629565b36916106b4565b6040519173ffffffffffffffffffffffffffffffffffffffff86166020840152604083015260608083015280519081608084015260005b8281106104de57505061025790827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60a093600085828601015201168101036080810184520182610561565b60208151910120906102816101cb610277838660040135602488016105e9565b6020810190610629565b60208151910120916055600b6040518560408201528360208201523081520160ff81532092833b15610311575b505084518110156102e25773ffffffffffffffffffffffffffffffffffffffff6001921660208260051b870101520161012f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6103296101cb61027785886004013560248a016105e9565b8051156104b4578281602073ffffffffffffffffffffffffffffffffffffffff935191016000f5161561048a5773ffffffffffffffffffffffffffffffffffffffff8616159182610481575b5081610461575b6040519173ffffffffffffffffffffffffffffffffffffffff851683521515917fda1c8afc2018a6f895a3f022a42fe4ee3df09d1a0fbaa7d3b47f9d8fa1628f33602073ffffffffffffffffffffffffffffffffffffffff891692a46103ed6101c1828560040135602487016105e9565b90506103fb575b38806102ae565b6104536000806104196101cb6101c186896004013560248b016105e9565b60208151910182875af13d15610459573d906104348261067a565b916104426040519384610561565b82523d6000602084013e5b846106eb565b506103f4565b60609061044d565b90506104786101c1838660040135602488016105e9565b9050159061037c565b15915038610375565b60046040517f741752c2000000000000000000000000000000000000000000000000000000008152fd5b60046040517f4ca249dc000000000000000000000000000000000000000000000000000000008152fd5b602081830181015160a0868401015201610209565b73ffffffffffffffffffffffffffffffffffffffff6044927fe1130dba000000000000000000000000000000000000000000000000000000008352166004820152336024820152fd5b503373ffffffffffffffffffffffffffffffffffffffff831614156100d2565b600080fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176105a257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116105a25760051b60200190565b91908110156102e25760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18136030182121561055c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561055c570180359067ffffffffffffffff821161055c5760200191813603831361055c57565b67ffffffffffffffff81116105a257601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926106c08261067a565b916106ce6040519384610561565b82948184528183011161055c578281602093846000960137010152565b9061072a575080511561070057805190602001fd5b60046040517f1425ea42000000000000000000000000000000000000000000000000000000008152fd5b81511580610782575b61073b575090565b60249073ffffffffffffffffffffffffffffffffffffffff604051917f9996b315000000000000000000000000000000000000000000000000000000008352166004820152fd5b50803b1561073356fea2646970667358221220390b33b5aad15a7a4a2adfbd8fd21db27bb73542ec44ce93b5c24526470fb11f64736f6c63430008170033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.