More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
6404985 | 10 days ago | 0.00001144 ETH | ||||
6404234 | 10 days ago | 0.00001222 ETH | ||||
6404152 | 10 days ago | 0.00001222 ETH | ||||
5879381 | 17 days ago | 0.00001062 ETH | ||||
5874584 | 17 days ago | 0.00001051 ETH | ||||
5874217 | 17 days ago | 0.00001051 ETH | ||||
5796103 | 18 days ago | 0.00001061 ETH | ||||
5795401 | 18 days ago | 0.00001064 ETH | ||||
5664378 | 19 days ago | 0.00001047 ETH | ||||
5648957 | 20 days ago | 0.00001456 ETH | ||||
5642299 | 20 days ago | 0.00001876 ETH | ||||
5640538 | 20 days ago | 0.0000137 ETH | ||||
5640410 | 20 days ago | 0.0000137 ETH | ||||
5640310 | 20 days ago | 0.0000137 ETH | ||||
5627841 | 20 days ago | 0.00001081 ETH | ||||
5627382 | 20 days ago | 0.00001081 ETH | ||||
5624394 | 20 days ago | 0.00001053 ETH | ||||
5624203 | 20 days ago | 0.00001074 ETH | ||||
5615539 | 20 days ago | 0.00001044 ETH | ||||
5614138 | 20 days ago | 0.00001039 ETH | ||||
5612315 | 20 days ago | 0.00001051 ETH | ||||
5612093 | 20 days ago | 0.00001051 ETH | ||||
5611633 | 20 days ago | 0.00001049 ETH | ||||
5611193 | 20 days ago | 0.00001033 ETH | ||||
5611130 | 20 days ago | 0.00001033 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:
DedicatedPaymaster
Compiler Version
v0.8.28+commit.7893614a
ZkSolc Version
v1.5.12
Optimization Enabled:
Yes with Mode 3
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import { IPaymaster, ExecutionResult, PAYMASTER_VALIDATION_SUCCESS_MAGIC } from "@matterlabs/zksync-contracts/contracts/system-contracts/interfaces/IPaymaster.sol"; import {IPaymasterFlow} from "@matterlabs/zksync-contracts/contracts/system-contracts/interfaces/IPaymasterFlow.sol"; import {Transaction} from "@matterlabs/zksync-contracts/contracts/system-contracts/libraries/TransactionHelper.sol"; import "@matterlabs/zksync-contracts/contracts/system-contracts/Constants.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; /// @title DedicatedPaymaster /// @author RpGmAx /// @notice This paymaster is limited to work only with specific contract addresses. contract DedicatedPaymaster is IPaymaster, Ownable { // Errors error OnlyBootloaderAllowed(); error InvalidContractAddress(); error ContractAlreadyAllowed(); error ContractNotAllowed(); error UnsupportedPaymasterFlow(); error InsufficientPaymasterBalance(); error WithdrawFailed(); error InvalidPaymasterInput(); // Mapping to track allowed contract addresses mapping(address => bool) public allowedContracts; /// @notice Constructor sets the initial owner. constructor(address initialOwner) Ownable(initialOwner) {} /// @notice Allows the owner to add an allowed contract address function addAllowedContract(address _contract) external onlyOwner { if (_contract == address(0)) revert InvalidContractAddress(); if (allowedContracts[_contract]) revert ContractAlreadyAllowed(); allowedContracts[_contract] = true; } /// @notice Allows the owner to remove an allowed contract address function removeAllowedContract(address _contract) external onlyOwner { if (!allowedContracts[_contract]) revert ContractNotAllowed(); allowedContracts[_contract] = false; } modifier onlyBootloader() { if (msg.sender != BOOTLOADER_FORMAL_ADDRESS) revert OnlyBootloaderAllowed(); _; } /// @notice Validates the paymaster transaction and pays the fee only if the transaction targets an allowed contract. function validateAndPayForPaymasterTransaction(bytes32, bytes32, Transaction calldata _transaction) external payable onlyBootloader returns (bytes4 magic, bytes memory context) { address targetContract = address(uint160(_transaction.to)); if (!allowedContracts[targetContract]) revert ContractNotAllowed(); if (_transaction.paymasterInput.length < 4) revert InvalidPaymasterInput(); bytes4 paymasterInputSelector = bytes4(_transaction.paymasterInput[0:4]); if (paymasterInputSelector == IPaymasterFlow.general.selector) { uint256 requiredETH = _transaction.gasLimit * _transaction.maxFeePerGas; (bool success,) = payable(BOOTLOADER_FORMAL_ADDRESS).call{value: requiredETH}(""); if (!success) revert InsufficientPaymasterBalance(); magic = PAYMASTER_VALIDATION_SUCCESS_MAGIC; } else { revert UnsupportedPaymasterFlow(); } } function postTransaction( bytes calldata _context, Transaction calldata _transaction, bytes32, bytes32, ExecutionResult _txResult, uint256 _maxRefundedGas ) external payable override onlyBootloader {} function withdraw(address payable _to) external onlyOwner { uint256 balance = address(this).balance; (bool success,) = _to.call{value: balance}(""); if (!success) revert WithdrawFailed(); } receive() external payable {} }
// 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 // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; import {IAccountCodeStorage} from "./interfaces/IAccountCodeStorage.sol"; import {INonceHolder} from "./interfaces/INonceHolder.sol"; import {IContractDeployer} from "./interfaces/IContractDeployer.sol"; import {IKnownCodesStorage} from "./interfaces/IKnownCodesStorage.sol"; import {IImmutableSimulator} from "./interfaces/IImmutableSimulator.sol"; import {IBaseToken} from "./interfaces/IBaseToken.sol"; import {IBridgehub} from "./interfaces/IBridgehub.sol"; import {IL1Messenger} from "./interfaces/IL1Messenger.sol"; import {ISystemContext} from "./interfaces/ISystemContext.sol"; import {ICompressor} from "./interfaces/ICompressor.sol"; import {IComplexUpgrader} from "./interfaces/IComplexUpgrader.sol"; import {IBootloaderUtilities} from "./interfaces/IBootloaderUtilities.sol"; import {IPubdataChunkPublisher} from "./interfaces/IPubdataChunkPublisher.sol"; import {IMessageRoot} from "./interfaces/IMessageRoot.sol"; import {ICreate2Factory} from "./interfaces/ICreate2Factory.sol"; /// @dev All the system contracts introduced by ZKsync have their addresses /// started from 2^15 in order to avoid collision with Ethereum precompiles. uint160 constant SYSTEM_CONTRACTS_OFFSET = 0x8000; // 2^15 /// @dev Unlike the value above, it is not overridden for the purpose of testing and /// is identical to the constant value actually used as the system contracts offset on /// mainnet. uint160 constant REAL_SYSTEM_CONTRACTS_OFFSET = 0x8000; /// @dev All the system contracts must be located in the kernel space, /// i.e. their addresses must be below 2^16. uint160 constant MAX_SYSTEM_CONTRACT_ADDRESS = 0xffff; // 2^16 - 1 /// @dev The offset from which the built-in, but user space contracts are located. uint160 constant USER_CONTRACTS_OFFSET = MAX_SYSTEM_CONTRACT_ADDRESS + 1; address constant ECRECOVER_SYSTEM_CONTRACT = address(0x01); address constant SHA256_SYSTEM_CONTRACT = address(0x02); address constant ECADD_SYSTEM_CONTRACT = address(0x06); address constant ECMUL_SYSTEM_CONTRACT = address(0x07); address constant ECPAIRING_SYSTEM_CONTRACT = address(0x08); /// @dev The number of gas that need to be spent for a single byte of pubdata regardless of the pubdata price. /// This variable is used to ensure the following: /// - That the long-term storage of the operator is compensated properly. /// - That it is not possible that the pubdata counter grows too high without spending proportional amount of computation. uint256 constant COMPUTATIONAL_PRICE_FOR_PUBDATA = 80; /// @dev The maximal possible address of an L1-like precompie. These precompiles maintain the following properties: /// - Their extcodehash is EMPTY_STRING_KECCAK /// - Their extcodesize is 0 despite having a bytecode formally deployed there. uint256 constant CURRENT_MAX_PRECOMPILE_ADDRESS = 0xff; address payable constant BOOTLOADER_FORMAL_ADDRESS = payable(address(SYSTEM_CONTRACTS_OFFSET + 0x01)); IAccountCodeStorage constant ACCOUNT_CODE_STORAGE_SYSTEM_CONTRACT = IAccountCodeStorage( address(SYSTEM_CONTRACTS_OFFSET + 0x02) ); INonceHolder constant NONCE_HOLDER_SYSTEM_CONTRACT = INonceHolder(address(SYSTEM_CONTRACTS_OFFSET + 0x03)); IKnownCodesStorage constant KNOWN_CODE_STORAGE_CONTRACT = IKnownCodesStorage(address(SYSTEM_CONTRACTS_OFFSET + 0x04)); IImmutableSimulator constant IMMUTABLE_SIMULATOR_SYSTEM_CONTRACT = IImmutableSimulator( address(SYSTEM_CONTRACTS_OFFSET + 0x05) ); IContractDeployer constant DEPLOYER_SYSTEM_CONTRACT = IContractDeployer(address(SYSTEM_CONTRACTS_OFFSET + 0x06)); IContractDeployer constant REAL_DEPLOYER_SYSTEM_CONTRACT = IContractDeployer(address(REAL_SYSTEM_CONTRACTS_OFFSET + 0x06)); // A contract that is allowed to deploy any codehash // on any address. To be used only during an upgrade. address constant FORCE_DEPLOYER = address(SYSTEM_CONTRACTS_OFFSET + 0x07); IL1Messenger constant L1_MESSENGER_CONTRACT = IL1Messenger(address(SYSTEM_CONTRACTS_OFFSET + 0x08)); address constant MSG_VALUE_SYSTEM_CONTRACT = address(SYSTEM_CONTRACTS_OFFSET + 0x09); IBaseToken constant BASE_TOKEN_SYSTEM_CONTRACT = IBaseToken(address(SYSTEM_CONTRACTS_OFFSET + 0x0a)); IBaseToken constant REAL_BASE_TOKEN_SYSTEM_CONTRACT = IBaseToken(address(REAL_SYSTEM_CONTRACTS_OFFSET + 0x0a)); ICreate2Factory constant L2_CREATE2_FACTORY = ICreate2Factory(address(USER_CONTRACTS_OFFSET)); address constant L2_ASSET_ROUTER = address(USER_CONTRACTS_OFFSET + 0x03); IBridgehub constant L2_BRIDGE_HUB = IBridgehub(address(USER_CONTRACTS_OFFSET + 0x02)); address constant L2_NATIVE_TOKEN_VAULT_ADDR = address(USER_CONTRACTS_OFFSET + 0x04); IMessageRoot constant L2_MESSAGE_ROOT = IMessageRoot(address(USER_CONTRACTS_OFFSET + 0x05)); // Note, that on its own this contract does not provide much functionality, but having it on a constant address // serves as a convenient storage for its bytecode to be accessible via `extcodehash`. address constant SLOAD_CONTRACT_ADDRESS = address(USER_CONTRACTS_OFFSET + 0x06); address constant WRAPPED_BASE_TOKEN_IMPL_ADDRESS = address(USER_CONTRACTS_OFFSET + 0x07); // Hardcoded because even for tests we should keep the address. (Instead `SYSTEM_CONTRACTS_OFFSET + 0x10`) // Precompile call depends on it. // And we don't want to mock this contract. address constant KECCAK256_SYSTEM_CONTRACT = address(0x8010); ISystemContext constant SYSTEM_CONTEXT_CONTRACT = ISystemContext(payable(address(SYSTEM_CONTRACTS_OFFSET + 0x0b))); ISystemContext constant REAL_SYSTEM_CONTEXT_CONTRACT = ISystemContext(payable(address(REAL_SYSTEM_CONTRACTS_OFFSET + 0x0b))); IBootloaderUtilities constant BOOTLOADER_UTILITIES = IBootloaderUtilities(address(SYSTEM_CONTRACTS_OFFSET + 0x0c)); // It will be a different value for tests, while shouldn't. But for now, this constant is not used by other contracts, so that's fine. address constant EVENT_WRITER_CONTRACT = address(SYSTEM_CONTRACTS_OFFSET + 0x0d); ICompressor constant COMPRESSOR_CONTRACT = ICompressor(address(SYSTEM_CONTRACTS_OFFSET + 0x0e)); IComplexUpgrader constant COMPLEX_UPGRADER_CONTRACT = IComplexUpgrader(address(SYSTEM_CONTRACTS_OFFSET + 0x0f)); IPubdataChunkPublisher constant PUBDATA_CHUNK_PUBLISHER = IPubdataChunkPublisher( address(SYSTEM_CONTRACTS_OFFSET + 0x11) ); /// @dev If the bitwise AND of the extraAbi[2] param when calling the MSG_VALUE_SIMULATOR /// is non-zero, the call will be assumed to be a system one. uint256 constant MSG_VALUE_SIMULATOR_IS_SYSTEM_BIT = 1; /// @dev The maximal msg.value that context can have uint256 constant MAX_MSG_VALUE = type(uint128).max; /// @dev Prefix used during derivation of account addresses using CREATE2 /// @dev keccak256("zksyncCreate2") bytes32 constant CREATE2_PREFIX = 0x2020dba91b30cc0006188af794c2fb30dd8520db7e2c088b7fc7c103c00ca494; /// @dev Prefix used during derivation of account addresses using CREATE /// @dev keccak256("zksyncCreate") bytes32 constant CREATE_PREFIX = 0x63bae3a9951d38e8a3fbb7b70909afc1200610fc5bc55ade242f815974674f23; /// @dev Each state diff consists of 156 bytes of actual data and 116 bytes of unused padding, needed for circuit efficiency. uint256 constant STATE_DIFF_ENTRY_SIZE = 272; enum SystemLogKey { L2_TO_L1_LOGS_TREE_ROOT_KEY, PACKED_BATCH_AND_L2_BLOCK_TIMESTAMP_KEY, CHAINED_PRIORITY_TXN_HASH_KEY, NUMBER_OF_LAYER_1_TXS_KEY, // Note, that it is important that `PREV_BATCH_HASH_KEY` has position // `4` since it is the same as it was in the previous protocol version and // it is the only one that is emitted before the system contracts are upgraded. PREV_BATCH_HASH_KEY, L2_DA_VALIDATOR_OUTPUT_HASH_KEY, USED_L2_DA_VALIDATOR_ADDRESS_KEY, EXPECTED_SYSTEM_CONTRACT_UPGRADE_TX_HASH_KEY } /// @dev The number of leaves in the L2->L1 log Merkle tree. /// While formally a tree of any length is acceptable, the node supports only a constant length of 16384 leaves. uint256 constant L2_TO_L1_LOGS_MERKLE_TREE_LEAVES = 16_384; /// @dev The length of the derived key in bytes inside compressed state diffs. uint256 constant DERIVED_KEY_LENGTH = 32; /// @dev The length of the enum index in bytes inside compressed state diffs. uint256 constant ENUM_INDEX_LENGTH = 8; /// @dev The length of value in bytes inside compressed state diffs. uint256 constant VALUE_LENGTH = 32; /// @dev The length of the compressed initial storage write in bytes. uint256 constant COMPRESSED_INITIAL_WRITE_SIZE = DERIVED_KEY_LENGTH + VALUE_LENGTH; /// @dev The length of the compressed repeated storage write in bytes. uint256 constant COMPRESSED_REPEATED_WRITE_SIZE = ENUM_INDEX_LENGTH + VALUE_LENGTH; /// @dev The position from which the initial writes start in the compressed state diffs. uint256 constant INITIAL_WRITE_STARTING_POSITION = 4; /// @dev Each storage diffs consists of the following elements: /// [20bytes address][32bytes key][32bytes derived key][8bytes enum index][32bytes initial value][32bytes final value] /// @dev The offset of the derived key in a storage diff. uint256 constant STATE_DIFF_DERIVED_KEY_OFFSET = 52; /// @dev The offset of the enum index in a storage diff. uint256 constant STATE_DIFF_ENUM_INDEX_OFFSET = 84; /// @dev The offset of the final value in a storage diff. uint256 constant STATE_DIFF_FINAL_VALUE_OFFSET = 124; /// @dev Total number of bytes in a blob. Blob = 4096 field elements * 31 bytes per field element /// @dev EIP-4844 defines it as 131_072 but we use 4096 * 31 within our circuits to always fit within a field element /// @dev Our circuits will prove that a EIP-4844 blob and our internal blob are the same. uint256 constant BLOB_SIZE_BYTES = 126_976; /// @dev Max number of blobs currently supported uint256 constant MAX_NUMBER_OF_BLOBS = 6;
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; import {Transaction} from "../libraries/TransactionHelper.sol"; enum ExecutionResult { Revert, Success } bytes4 constant PAYMASTER_VALIDATION_SUCCESS_MAGIC = IPaymaster .validateAndPayForPaymasterTransaction .selector; interface IPaymaster { /// @dev Called by the bootloader to verify that the paymaster agrees to pay for the /// fee for the transaction. This transaction should also send the necessary amount of funds onto the bootloader /// address. /// @param _txHash The hash of the transaction /// @param _suggestedSignedHash The hash of the transaction that is signed by an EOA /// @param _transaction The transaction itself. /// @return magic The value that should be equal to the signature of the validateAndPayForPaymasterTransaction /// if the paymaster agrees to pay for the transaction. /// @return context The "context" of the transaction: an array of bytes of length at most 1024 bytes, which will be /// passed to the `postTransaction` method of the account. /// @dev The developer should strive to preserve as many steps as possible both for valid /// and invalid transactions as this very method is also used during the gas fee estimation /// (without some of the necessary data, e.g. signature). function validateAndPayForPaymasterTransaction( bytes32 _txHash, bytes32 _suggestedSignedHash, Transaction calldata _transaction ) external payable returns (bytes4 magic, bytes memory context); /// @dev Called by the bootloader after the execution of the transaction. Please note that /// there is no guarantee that this method will be called at all. Unlike the original EIP4337, /// this method won't be called if the transaction execution results in out-of-gas. /// @param _context, the context of the execution, returned by the "validateAndPayForPaymasterTransaction" method. /// @param _transaction, the users' transaction. /// @param _txResult, the result of the transaction execution (success or failure). /// @param _maxRefundedGas, the upper bound on the amount of gas that could be refunded to the paymaster. /// @dev The exact amount refunded depends on the gas spent by the "postOp" itself and so the developers should /// take that into account. function postTransaction( bytes calldata _context, Transaction calldata _transaction, bytes32 _txHash, bytes32 _suggestedSignedHash, ExecutionResult _txResult, uint256 _maxRefundedGas ) external payable; }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; /** * @author Matter Labs * @dev The interface that is used for encoding/decoding of * different types of paymaster flows. * @notice This is NOT an interface to be implemented * by contracts. It is just used for encoding. */ interface IPaymasterFlow { function general(bytes calldata input) external; function approvalBased( address _token, uint256 _minAllowance, bytes calldata _innerInput ) external; }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; /// @dev The type id of ZKsync's EIP-712-signed transaction. uint8 constant EIP_712_TX_TYPE = 0x71; /// @dev The type id of legacy transactions. uint8 constant LEGACY_TX_TYPE = 0x0; /// @dev The type id of legacy transactions. uint8 constant EIP_2930_TX_TYPE = 0x01; /// @dev The type id of EIP1559 transactions. uint8 constant EIP_1559_TX_TYPE = 0x02; /// @notice Structure used to represent a ZKsync transaction. struct Transaction { // The type of the transaction. uint256 txType; // The caller. uint256 from; // The callee. uint256 to; // The gasLimit to pass with the transaction. // It has the same meaning as Ethereum's gasLimit. uint256 gasLimit; // The maximum amount of gas the user is willing to pay for a byte of pubdata. uint256 gasPerPubdataByteLimit; // The maximum fee per gas that the user is willing to pay. // It is akin to EIP1559's maxFeePerGas. uint256 maxFeePerGas; // The maximum priority fee per gas that the user is willing to pay. // It is akin to EIP1559's maxPriorityFeePerGas. uint256 maxPriorityFeePerGas; // The transaction's paymaster. If there is no paymaster, it is equal to 0. uint256 paymaster; // The nonce of the transaction. uint256 nonce; // The value to pass with the transaction. uint256 value; // In the future, we might want to add some // new fields to the struct. The `txData` struct // is to be passed to account and any changes to its structure // would mean a breaking change to these accounts. In order to prevent this, // we should keep some fields as "reserved". // It is also recommended that their length is fixed, since // it would allow easier proof integration (in case we will need // some special circuit for preprocessing transactions). uint256[4] reserved; // The transaction's calldata. bytes data; // The signature of the transaction. bytes signature; // The properly formatted hashes of bytecodes that must be published on L1 // with the inclusion of this transaction. Note, that a bytecode has been published // before, the user won't pay fees for its republishing. bytes32[] factoryDeps; // The input to the paymaster. bytes paymasterInput; // Reserved dynamic type for the future use-case. Using it should be avoided, // But it is still here, just in case we want to enable some additional functionality. bytes reservedDynamic; }
// 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; } }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; interface IAccountCodeStorage { function storeAccountConstructingCodeHash( address _address, bytes32 _hash ) external; function storeAccountConstructedCodeHash( address _address, bytes32 _hash ) external; function markAccountCodeHashAsConstructed(address _address) external; function getRawCodeHash( address _address ) external view returns (bytes32 codeHash); function getCodeHash( uint256 _input ) external view returns (bytes32 codeHash); function getCodeSize( uint256 _input ) external view returns (uint256 codeSize); }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; /// @notice A struct that describes a forced deployment on an address struct ForceDeployment { // The bytecode hash to put on an address bytes32 bytecodeHash; // The address on which to deploy the bytecodehash to address newAddress; // Whether to run the constructor on the force deployment bool callConstructor; // The value with which to initialize a contract uint256 value; // The constructor calldata bytes input; } interface IContractDeployer { /// @notice Defines the version of the account abstraction protocol /// that a contract claims to follow. /// - `None` means that the account is just a contract and it should never be interacted /// with as a custom account /// - `Version1` means that the account follows the first version of the account abstraction protocol enum AccountAbstractionVersion { None, Version1 } /// @notice Defines the nonce ordering used by the account /// - `Sequential` means that it is expected that the nonces are monotonic and increment by 1 /// at a time (the same as EOAs). /// - `Arbitrary` means that the nonces for the accounts can be arbitrary. The operator /// should serve the transactions from such an account on a first-come-first-serve basis. /// @dev This ordering is more of a suggestion to the operator on how the AA expects its transactions /// to be processed and is not considered as a system invariant. enum AccountNonceOrdering { Sequential, Arbitrary } struct AccountInfo { AccountAbstractionVersion supportedAAVersion; AccountNonceOrdering nonceOrdering; } event ContractDeployed( address indexed deployerAddress, bytes32 indexed bytecodeHash, address indexed contractAddress ); event AccountNonceOrderingUpdated( address indexed accountAddress, AccountNonceOrdering nonceOrdering ); event AccountVersionUpdated( address indexed accountAddress, AccountAbstractionVersion aaVersion ); function getNewAddressCreate2( address _sender, bytes32 _bytecodeHash, bytes32 _salt, bytes calldata _input ) external view returns (address newAddress); function getNewAddressCreate( address _sender, uint256 _senderNonce ) external pure returns (address newAddress); function create2( bytes32 _salt, bytes32 _bytecodeHash, bytes calldata _input ) external payable returns (address newAddress); function create2Account( bytes32 _salt, bytes32 _bytecodeHash, bytes calldata _input, AccountAbstractionVersion _aaVersion ) external payable returns (address newAddress); /// @dev While the `_salt` parameter is not used anywhere here, /// it is still needed for consistency between `create` and /// `create2` functions (required by the compiler). function create( bytes32 _salt, bytes32 _bytecodeHash, bytes calldata _input ) external payable returns (address newAddress); /// @dev While `_salt` is never used here, we leave it here as a parameter /// for the consistency with the `create` function. function createAccount( bytes32 _salt, bytes32 _bytecodeHash, bytes calldata _input, AccountAbstractionVersion _aaVersion ) external payable returns (address newAddress); /// @notice Returns the information about a certain AA. function getAccountInfo( address _address ) external view returns (AccountInfo memory info); /// @notice Can be called by an account to update its account version function updateAccountVersion(AccountAbstractionVersion _version) external; /// @notice Can be called by an account to update its nonce ordering function updateNonceOrdering(AccountNonceOrdering _nonceOrdering) external; /// @notice This method is to be used only during an upgrade to set bytecodes on specific addresses. function forceDeployOnAddresses( ForceDeployment[] calldata _deployments ) external payable; }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; /** * @author Matter Labs * @custom:security-contact [email protected] * @notice The interface for the KnownCodesStorage contract, which is responsible * for storing the hashes of the bytecodes that have been published to the network. */ interface IKnownCodesStorage { event MarkedAsKnown( bytes32 indexed bytecodeHash, bool indexed sendBytecodeToL1 ); function markFactoryDeps( bool _shouldSendToL1, bytes32[] calldata _hashes ) external; function markBytecodeAsPublished(bytes32 _bytecodeHash) external; function getMarker(bytes32 _hash) external view returns (uint256); }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; /// @author Matter Labs /// @custom:security-contact [email protected] interface IBridgehub { function setAddresses( address _assetRouter, address _ctmDeployer, address _messageRoot ) external; function owner() external view returns (address); }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; struct ImmutableData { uint256 index; bytes32 value; } interface IImmutableSimulator { function getImmutable( address _dest, uint256 _index ) external view returns (bytes32); function setImmutables( address _dest, ImmutableData[] calldata _immutables ) external; }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; /// @dev The log passed from L2 /// @param l2ShardId The shard identifier, 0 - rollup, 1 - porter. All other values are not used but are reserved for the future /// @param isService A boolean flag that is part of the log along with `key`, `value`, and `sender` address. /// This field is required formally but does not have any special meaning. /// @param txNumberInBlock The L2 transaction number in a block, in which the log was sent /// @param sender The L2 address which sent the log /// @param key The 32 bytes of information that was sent in the log /// @param value The 32 bytes of information that was sent in the log // Both `key` and `value` are arbitrary 32-bytes selected by the log sender struct L2ToL1Log { uint8 l2ShardId; bool isService; uint16 txNumberInBlock; address sender; bytes32 key; bytes32 value; } /// @dev Bytes in raw L2 to L1 log /// @dev Equal to the bytes size of the tuple - (uint8 ShardId, bool isService, uint16 txNumberInBlock, address sender, bytes32 key, bytes32 value) uint256 constant L2_TO_L1_LOG_SERIALIZE_SIZE = 88; /// @dev The value of default leaf hash for L2 to L1 logs Merkle tree /// @dev An incomplete fixed-size tree is filled with this value to be a full binary tree /// @dev Actually equal to the `keccak256(new bytes(L2_TO_L1_LOG_SERIALIZE_SIZE))` bytes32 constant L2_L1_LOGS_TREE_DEFAULT_LEAF_HASH = 0x72abee45b59e344af8a6e520241c4744aff26ed411f4c4b00f8af09adada43ba; /// @dev The current version of state diff compression being used. uint256 constant STATE_DIFF_COMPRESSION_VERSION_NUMBER = 1; /** * @author Matter Labs * @custom:security-contact [email protected] * @notice The interface of the L1 Messenger contract, responsible for sending messages to L1. */ interface IL1Messenger { // Possibly in the future we will be able to track the messages sent to L1 with // some hooks in the VM. For now, it is much easier to track them with L2 events. event L1MessageSent( address indexed _sender, bytes32 indexed _hash, bytes _message ); event L2ToL1LogSent(L2ToL1Log _l2log); event BytecodeL1PublicationRequested(bytes32 _bytecodeHash); function sendToL1(bytes calldata _message) external returns (bytes32); function sendL2ToL1Log( bool _isService, bytes32 _key, bytes32 _value ) external returns (uint256 logIdInMerkleTree); // This function is expected to be called only by the KnownCodesStorage system contract function requestBytecodeL1Publication(bytes32 _bytecodeHash) external; }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; /** * @author Matter Labs * @custom:security-contact [email protected] * @notice Contract that stores some of the context variables, that may be either * block-scoped, tx-scoped or system-wide. */ interface ISystemContext { struct BlockInfo { uint128 timestamp; uint128 number; } /// @notice A structure representing the timeline for the upgrade from the batch numbers to the L2 block numbers. /// @dev It will be used for the L1 batch -> L2 block migration in Q3 2023 only. struct VirtualBlockUpgradeInfo { /// @notice In order to maintain consistent results for `blockhash` requests, we'll /// have to remember the number of the batch when the upgrade to the virtual blocks has been done. /// The hashes for virtual blocks before the upgrade are identical to the hashes of the corresponding batches. uint128 virtualBlockStartBatch; /// @notice L2 block when the virtual blocks have caught up with the L2 blocks. Starting from this block, /// all the information returned to users for block.timestamp/number, etc should be the information about the L2 blocks and /// not virtual blocks. uint128 virtualBlockFinishL2Block; } function chainId() external view returns (uint256); function origin() external view returns (address); function gasPrice() external view returns (uint256); function blockGasLimit() external view returns (uint256); function coinbase() external view returns (address); function difficulty() external view returns (uint256); function baseFee() external view returns (uint256); function txNumberInBlock() external view returns (uint16); function getBlockHashEVM(uint256 _block) external view returns (bytes32); function getBatchHash( uint256 _batchNumber ) external view returns (bytes32 hash); function getBlockNumber() external view returns (uint128); function getBlockTimestamp() external view returns (uint128); function getBatchNumberAndTimestamp() external view returns (uint128 blockNumber, uint128 blockTimestamp); function getL2BlockNumberAndTimestamp() external view returns (uint128 blockNumber, uint128 blockTimestamp); function gasPerPubdataByte() external view returns (uint256 gasPerPubdataByte); function getCurrentPubdataSpent() external view returns (uint256 currentPubdataSpent); function setChainId(uint256 _newChainId) external; }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; // The bitmask by applying which to the compressed state diff metadata we retrieve its operation. uint8 constant OPERATION_BITMASK = 7; // The number of bits shifting the compressed state diff metadata by which we retrieve its length. uint8 constant LENGTH_BITS_OFFSET = 3; // The maximal length in bytes that an enumeration index can have. uint8 constant MAX_ENUMERATION_INDEX_SIZE = 8; /** * @author Matter Labs * @custom:security-contact [email protected] * @notice The interface for the Compressor contract, responsible for verifying the correctness of * the compression of the state diffs and bytecodes. */ interface ICompressor { function publishCompressedBytecode( bytes calldata _bytecode, bytes calldata _rawCompressedData ) external returns (bytes32 bytecodeHash); function verifyCompressedStateDiffs( uint256 _numberOfStateDiffs, uint256 _enumerationIndexSize, bytes calldata _stateDiffs, bytes calldata _compressedStateDiffs ) external returns (bytes32 stateDiffHash); }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; import {ForceDeployment} from "./IContractDeployer.sol"; /** * @author Matter Labs * @custom:security-contact [email protected] * @notice The interface for the ComplexUpgrader contract. */ interface IComplexUpgrader { function forceDeployAndUpgrade( ForceDeployment[] calldata _forceDeployments, address _delegateTo, bytes calldata _calldata ) external payable; function upgrade( address _delegateTo, bytes calldata _calldata ) external payable; }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; interface IBaseToken { function balanceOf(uint256) external view returns (uint256); function transferFromTo( address _from, address _to, uint256 _amount ) external; function totalSupply() external view returns (uint256); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function mint(address _account, uint256 _amount) external; function withdraw(address _l1Receiver) external payable; function withdrawWithMessage( address _l1Receiver, bytes calldata _additionalData ) external payable; event Mint(address indexed account, uint256 amount); event Transfer(address indexed from, address indexed to, uint256 value); event Withdrawal( address indexed _l2Sender, address indexed _l1Receiver, uint256 _amount ); event WithdrawalWithMessage( address indexed _l2Sender, address indexed _l1Receiver, uint256 _amount, bytes _additionalData ); }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; /** * @author Matter Labs * @custom:security-contact [email protected] * @notice Interface for contract responsible chunking pubdata into the appropriate size for EIP-4844 blobs. */ interface IPubdataChunkPublisher { /// @notice Chunks pubdata into pieces that can fit into blobs. /// @param _pubdata The total l2 to l1 pubdata that will be sent via L1 blobs. /// @dev Note: This is an early implementation, in the future we plan to support up to 16 blobs per l1 batch. function chunkPubdataToBlobs( bytes calldata _pubdata ) external pure returns (bytes32[] memory blobLinearHashes); }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; /** * @author Matter Labs * @notice MessageRoot contract is responsible for storing and aggregating the roots of the batches from different chains into the MessageRoot. * @custom:security-contact [email protected] */ interface IMessageRoot { /// @notice The aggregated root of the batches from different chains. /// @return aggregatedRoot of the batches from different chains. function getAggregatedRoot() external view returns (bytes32 aggregatedRoot); }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; import {Transaction} from "../libraries/TransactionHelper.sol"; interface IBootloaderUtilities { function getTransactionHashes( Transaction calldata _transaction ) external view returns (bytes32 txHash, bytes32 signedTxHash); }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; import {IContractDeployer} from "./IContractDeployer.sol"; /// @custom:security-contact [email protected] /// @author Matter Labs /// @notice The contract that can be used for deterministic contract deployment. interface ICreate2Factory { /// @notice Function that calls the `create2` method of the `ContractDeployer` contract. /// @dev This function accepts the same parameters as the `create2` function of the ContractDeployer system contract, /// so that we could efficiently relay the calldata. function create2( bytes32, // _salt bytes32, // _bytecodeHash bytes calldata // _input ) external payable returns (address); /// @notice Function that calls the `create2Account` method of the `ContractDeployer` contract. /// @dev This function accepts the same parameters as the `create2Account` function of the ContractDeployer system contract, /// so that we could efficiently relay the calldata. function create2Account( bytes32, // _salt bytes32, // _bytecodeHash bytes calldata, // _input IContractDeployer.AccountAbstractionVersion // _aaVersion ) external payable returns (address); }
// SPDX-License-Identifier: MIT // We use a floating point pragma here so it can be used within other projects that interact with the ZKsync ecosystem without using our exact pragma version. pragma solidity ^0.8.0; /** * @author Matter Labs * @dev Interface of the nonce holder contract -- a contract used by the system to ensure * that there is always a unique identifier for a transaction with a particular account (we call it nonce). * In other words, the pair of (address, nonce) should always be unique. * @dev Custom accounts should use methods of this contract to store nonces or other possible unique identifiers * for the transaction. */ interface INonceHolder { event ValueSetUnderNonce( address indexed accountAddress, uint256 indexed key, uint256 value ); /// @dev Returns the current minimal nonce for account. function getMinNonce(address _address) external view returns (uint256); /// @dev Returns the raw version of the current minimal nonce /// (equal to minNonce + 2^128 * deployment nonce). function getRawNonce(address _address) external view returns (uint256); /// @dev Increases the minimal nonce for the msg.sender. function increaseMinNonce(uint256 _value) external returns (uint256); /// @dev Sets the nonce value `key` as used. function setValueUnderNonce(uint256 _key, uint256 _value) external; /// @dev Gets the value stored inside a custom nonce. function getValueUnderNonce(uint256 _key) external view returns (uint256); /// @dev A convenience method to increment the minimal nonce if it is equal /// to the `_expectedNonce`. function incrementMinNonceIfEquals(uint256 _expectedNonce) external; /// @dev Returns the deployment nonce for the accounts used for CREATE opcode. function getDeploymentNonce( address _address ) external view returns (uint256); /// @dev Increments the deployment nonce for the account and returns the previous one. function incrementDeploymentNonce( address _address ) external returns (uint256); /// @dev Determines whether a certain nonce has been already used for an account. function validateNonceUsage( address _address, uint256 _key, bool _shouldBeUsed ) external view; /// @dev Returns whether a nonce has been used for an account. function isNonceUsed( address _address, uint256 _nonce ) external view returns (bool); }
{ "evmVersion": "paris", "optimizer": { "enabled": true, "mode": "3" }, "outputSelection": { "*": { "*": [ "abi" ] } }, "detectMissingLibraries": false, "forceEVMLA": false, "enableEraVMExtensions": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ContractAlreadyAllowed","type":"error"},{"inputs":[],"name":"ContractNotAllowed","type":"error"},{"inputs":[],"name":"InsufficientPaymasterBalance","type":"error"},{"inputs":[],"name":"InvalidContractAddress","type":"error"},{"inputs":[],"name":"InvalidPaymasterInput","type":"error"},{"inputs":[],"name":"OnlyBootloaderAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"UnsupportedPaymasterFlow","type":"error"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"addAllowedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedContracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_context","type":"bytes"},{"components":[{"internalType":"uint256","name":"txType","type":"uint256"},{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"gasPerPubdataByteLimit","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"uint256","name":"paymaster","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256[4]","name":"reserved","type":"uint256[4]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes32[]","name":"factoryDeps","type":"bytes32[]"},{"internalType":"bytes","name":"paymasterInput","type":"bytes"},{"internalType":"bytes","name":"reservedDynamic","type":"bytes"}],"internalType":"struct Transaction","name":"_transaction","type":"tuple"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"enum ExecutionResult","name":"_txResult","type":"uint8"},{"internalType":"uint256","name":"_maxRefundedGas","type":"uint256"}],"name":"postTransaction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"removeAllowedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"components":[{"internalType":"uint256","name":"txType","type":"uint256"},{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"gasPerPubdataByteLimit","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"uint256","name":"paymaster","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256[4]","name":"reserved","type":"uint256[4]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes32[]","name":"factoryDeps","type":"bytes32[]"},{"internalType":"bytes","name":"paymasterInput","type":"bytes"},{"internalType":"bytes","name":"reservedDynamic","type":"bytes"}],"internalType":"struct Transaction","name":"_transaction","type":"tuple"}],"name":"validateAndPayForPaymasterTransaction","outputs":[{"internalType":"bytes4","name":"magic","type":"bytes4"},{"internalType":"bytes","name":"context","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
9c4d535b0000000000000000000000000000000000000000000000000000000000000000010000d9b8d7c3afa4a8534cc5b6bfb3f18ff354008f181995f93f1a6fd5efa900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000ab552703847725cfb8707a90ec46d636b8ca0fea
Deployed Bytecode
0x0002000000000002000200000000000200010000000103550000006003100270000000a90030019d000000a9033001970000000100200190000000340000c13d0000008002000039000000400020043f000000040030008c0000005e0000413d000000000201043b000000e002200270000000b10020009c000000620000a13d000000b20020009c000000950000a13d000000b30020009c000000d10000613d000000b40020009c000000d90000613d000000b50020009c000001690000c13d000000240030008c000001690000413d0000000002000416000000000002004b000001690000c13d0000000401100370000000000101043b000000ac0010009c000001690000213d000000000200041a000000ac052001970000000003000411000000000035004b000001700000c13d000000ac06100198000000590000613d000000ad01200197000000000161019f000000000010041b0000000001000414000000a90010009c000000a901008041000000c001100210000000ae011001c70000800d020000390000000303000039000000af04000041000001660000013d0000000002000416000000000002004b000001690000c13d0000001f02300039000000aa022001970000008002200039000000400020043f0000001f0430018f000000ab053001980000008002500039000000450000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b000000410000c13d000000000004004b000000520000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000200030008c000001690000413d000000800100043d000000ac0010009c000001690000213d000000ac06100198000000bc0000c13d000000bf01000041000000000010043f000000040000043f000000be01000041000002a200010430000000000003004b000001690000c13d0000000001000019000002a10001042e000000b80020009c0000007c0000213d000000bb0020009c000001040000613d000000bc0020009c000001690000c13d000000240030008c000001690000413d0000000002000416000000000002004b000001690000c13d0000000401100370000000000101043b000000ac0010009c000001690000213d000000000200041a000000ac032001970000000002000411000000000023004b0000016b0000c13d000000ac011001980000017e0000c13d000000ca01000041000000000010043f000000c801000041000002a200010430000000b90020009c0000012c0000613d000000ba0020009c000001690000c13d000000240030008c000001690000413d0000000002000416000000000002004b000001690000c13d0000000401100370000000000101043b000000ac0010009c000001690000213d000000000010043f0000000101000039000000200010043f000000000100001902a002850000040f000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f000000c101000041000002a10001042e000000b60020009c000001530000613d000000b70020009c000001690000c13d000000c40030008c000001690000413d0000000402100370000000000202043b000000c20020009c000001690000213d0000002304200039000000000034004b000001690000813d0000000404200039000000000441034f000000000404043b000000c20040009c000001690000213d00000000024200190000002402200039000000000032004b000001690000213d0000002402100370000000000202043b000000c20020009c000001690000213d0000000002230049000000c30020009c000001690000213d000002640020008c000001690000413d0000008401100370000000000101043b000000010010008c000001690000213d0000000001000411000080010010008c000000600000613d0000017a0000013d000000000100041a000000ad02100197000000000262019f000000000020041b0000000002000414000000ac05100197000000a90020009c000000a902008041000000c001200210000000ae011001c70000800d020000390000000303000039000000af0400004102a002960000040f0000000100200190000001690000613d000000200100003900000100001004430000012000000443000000b001000041000002a10001042e0000000001000416000000000001004b000001690000c13d000000000100041a000000ac01100197000000800010043f000000c101000041000002a10001042e000000240030008c000001690000413d0000000002000416000000000002004b000001690000c13d0000000401100370000000000101043b000000ac0010009c000001690000213d000000000200041a000000ac032001970000000002000411000000000023004b0000016b0000c13d000000ac01100197000200000001001d000000000010043f0000000101000039000000200010043f0000000001000414000000a90010009c000000a901008041000000c001100210000000c0011001c7000080100200003902a0029b0000040f0000000100200190000001690000613d000000000101043b000000000101041a000000ff00100190000001280000613d0000000201000029000000000010043f0000000101000039000000200010043f000000000100001902a002850000040f000000000201041a000000d502200197000000000021041b0000000001000019000002a10001042e000000640030008c000001690000413d0000004402100370000000000402043b000000c20040009c000001690000213d0000000002430049000000c30020009c000001690000213d000002640020008c000001690000413d0000000002000411000080010020008c0000017a0000c13d000100440040003d0000000101100360000000000101043b000000ac01100197000000000010043f0000000101000039000000200010043f0000000001000414000000a90010009c000000a901008041000000c001100210000000c0011001c70000801002000039000200000004001d02a0029b0000040f00000002090000290000000100200190000001690000613d000000000101043b000000000101041a000000ff00100190000001cf0000c13d000000d401000041000000000010043f000000c801000041000002a200010430000000240030008c000001690000413d0000000002000416000000000002004b000001690000c13d0000000401100370000000000301043b000000ac0030009c000001690000213d000000000100041a000000ac021001970000000001000411000000000012004b000001750000c13d000200000003001d000000c4010000410000000000100443000000000100041000000004001004430000000001000414000000a90010009c000000a901008041000000c001100210000000c5011001c70000800a0200003902a0029b0000040f00000001002001900000019b0000613d0000000202000029000000ac04200197000000000301043b0000000001000414000000a90010009c000000a901008041000000c001100210000000000003004b0000019c0000c13d00000000020400190000019f0000013d0000000001000416000000000001004b000001690000c13d000000000100041a000000ac051001970000000002000411000000000025004b0000016b0000c13d000000ad01100197000000000010041b0000000001000414000000a90010009c000000a901008041000000c001100210000000ae011001c70000800d020000390000000303000039000000af04000041000000000600001902a002960000040f0000000100200190000000600000c13d0000000001000019000002a200010430000000bd01000041000000000010043f000000040020043f000000be01000041000002a200010430000000bd01000041000000000010043f000000040030043f000000be01000041000002a200010430000000bd02000041000000000020043f000000040010043f000000be01000041000002a200010430000000cb01000041000000000010043f000000c801000041000002a200010430000200000001001d000000000010043f0000000101000039000000200010043f0000000001000414000000a90010009c000000a901008041000000c001100210000000c0011001c7000080100200003902a0029b0000040f0000000100200190000001690000613d000000000101043b000000000101041a000000ff00100190000001ff0000c13d0000000201000029000000000010043f0000000101000039000000200010043f000000000100001902a002850000040f000000000201041a000000d50220019700000001022001bf000000000021041b0000000001000019000002a10001042e000000000001042f000000ae011001c70000800902000039000000000500001902a002960000040f0000006003100270000000a903300198000001a90000c13d0000000100200190000000600000c13d000000c701000041000000000010043f000000c801000041000002a2000104300000001f04300039000000aa044001970000003f04400039000000c604400197000000400500043d0000000004450019000000000054004b00000000060000390000000106004039000000c20040009c000002610000213d0000000100600190000002610000c13d000000400040043f0000001f0430018f0000000006350436000000ab053001980000000003560019000001c10000613d000000000701034f000000007807043c0000000006860436000000000036004b000001bd0000c13d000000000004004b000001a30000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000001a30000013d0000000101000029000001e0021000390000000101000367000000000321034f000000000403043b00000000030000310000000005930049000000230550008a000000cc06500197000000cc07400197000000000867013f000000000067004b0000000006000019000000cc06004041000000000054004b0000000005000019000000cc05008041000000cc0080009c000000000605c019000000000006004b000001690000c13d00000004059000390000000005450019000000000451034f000000000404043b000000c20040009c000001690000213d00000000064300490000002003500039000000cc05600197000000cc07300197000000000857013f000000000057004b0000000005000019000000cc05004041000000000063004b0000000006000019000000cc06002041000000cc0080009c000000000506c019000000000005004b000001690000c13d000000030040008c000002030000213d000000d301000041000000000010043f000000c801000041000002a200010430000000c901000041000000000010043f000000c801000041000002a200010430000000000331034f000000000303043b000000cd03300197000000ce0030009c000002670000c13d000001c00320008a000000000331034f000001800220008a000000000121034f000000000101043b000000000203043b000000000002004b0000026b0000c13d0000000001000414000000a90010009c000000a901008041000000c001100210000080010200003902a002960000040f0000006003100270000000a9033001980000023e0000613d0000001f04300039000000aa044001970000003f04400039000000c604400197000000400500043d0000000004450019000000000054004b00000000060000390000000106004039000000c20040009c000002610000213d0000000100600190000002610000c13d000000400040043f0000001f0430018f0000000006350436000000ab053001980000000003560019000002310000613d000000000701034f000000007807043c0000000006860436000000000036004b0000022d0000c13d000000000004004b0000023e0000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f000000000013043500000001002001900000027a0000613d000000400100043d000000200210003900000040030000390000000000320435000000d20200004100000000002104350000004003100039000000600200043d00000000002304350000006003100039000000000002004b000002540000613d000000000400001900000000053400190000008006400039000000000606043300000000006504350000002004400039000000000024004b0000024d0000413d0000001f04200039000000d604400197000000000232001900000000000204350000006002400039000000a90020009c000000a9020080410000006002200210000000a90010009c000000a9010080410000004001100210000000000112019f000002a10001042e000000d001000041000000000010043f0000004101000039000000040010043f000000be01000041000002a200010430000000cf01000041000000000010043f000000c801000041000002a20001043000000000032100a900000000022300d9000000000021004b0000027e0000c13d0000000001000414000000000003004b000002110000613d000000a90010009c000000a901008041000000c001100210000000ae011001c7000080090200003900008001040000390000000005000019000002150000013d000000d101000041000000000010043f000000c801000041000002a200010430000000d001000041000000000010043f0000001101000039000000040010043f000000be01000041000002a200010430000000000001042f0000000002000414000000a90020009c000000a902008041000000c002200210000000a90010009c000000a9010080410000004001100210000000000121019f000000c0011001c7000080100200003902a0029b0000040f0000000100200190000002940000613d000000000101043b000000000001042d0000000001000019000002a20001043000000299002104210000000102000039000000000001042d0000000002000019000000000001042d0000029e002104230000000102000039000000000001042d0000000002000019000000000001042d000002a000000432000002a10001042e000002a200010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000715018a5000000000000000000000000000000000000000000000000000000008da5cb5a000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000009800fc1600000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000715018a600000000000000000000000000000000000000000000000000000000817b17f00000000000000000000000000000000000000000000000000000000051cff8d80000000000000000000000000000000000000000000000000000000051cff8d90000000000000000000000000000000000000000000000000000000051e0e26b00000000000000000000000000000000000000000000000000000000038a24bc000000000000000000000000000000000000000000000000000000002c56462f118cdaa70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000001e4fbdf70000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f39020000020000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffe0750b219c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000008332320d00000000000000000000000000000000000000000000000000000000a710429d000000000000000000000000000000000000000000000000000000003fac65d9000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000ffffffff000000000000000000000000000000000000000000000000000000008c5a344500000000000000000000000000000000000000000000000000000000ff15b069000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000055d9613100000000000000000000000000000000000000000000000000000000038a24bc000000000000000000000000000000000000000000000000000000008ff523f7000000000000000000000000000000000000000000000000000000008cb8716800000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000002a2549fc58030a7ae28de31f82039499884fbf8ea06677a9e42fdd867caf3297
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ab552703847725cfb8707a90ec46d636b8ca0fea
-----Decoded View---------------
Arg [0] : initialOwner (address): 0xAB552703847725cFb8707A90Ec46d636B8ca0feA
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ab552703847725cfb8707a90ec46d636b8ca0fea
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.