Source Code
Overview
ETH Balance
0.01 ETH
Token Holdings
More Info
ContractCreator
Multichain Info
N/A
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | Amount | ||
|---|---|---|---|---|---|---|
| 2413677 | 481 days ago | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
TestnetPaymaster
Compiler Version
v0.8.20+commit.a1b79de6
ZkSolc Version
v1.3.18
Optimization Enabled:
Yes with Mode 3
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IPaymaster, ExecutionResult, PAYMASTER_VALIDATION_SUCCESS_MAGIC} from "./interfaces/IPaymaster.sol";
import {IPaymasterFlow} from "./interfaces/IPaymasterFlow.sol";
import {Transaction, BOOTLOADER_ADDRESS} from "./L2ContractHelper.sol";
// This is a dummy paymaster. It expects the paymasterInput to contain its "signature" as well as the needed exchange rate.
// It supports only approval-based paymaster flow.
contract TestnetPaymaster is IPaymaster {
function validateAndPayForPaymasterTransaction(
bytes32,
bytes32,
Transaction calldata _transaction
) external payable returns (bytes4 magic, bytes memory context) {
// By default we consider the transaction as accepted.
magic = PAYMASTER_VALIDATION_SUCCESS_MAGIC;
require(msg.sender == BOOTLOADER_ADDRESS, "Only bootloader can call this contract");
require(_transaction.paymasterInput.length >= 4, "The standard paymaster input must be at least 4 bytes long");
bytes4 paymasterInputSelector = bytes4(_transaction.paymasterInput[0:4]);
if (paymasterInputSelector == IPaymasterFlow.approvalBased.selector) {
// While the actual data consists of address, uint256 and bytes data,
// the data is not needed for the testnet paymaster
(address token, uint256 amount, ) = abi.decode(_transaction.paymasterInput[4:], (address, uint256, bytes));
// Firstly, we verify that the user has provided enough allowance
address userAddress = address(uint160(_transaction.from));
address thisAddress = address(this);
uint256 providedAllowance = IERC20(token).allowance(userAddress, thisAddress);
require(providedAllowance >= amount, "The user did not provide enough allowance");
// The testnet paymaster exchanges X wei of the token to the X wei of ETH.
uint256 requiredETH = _transaction.gasLimit * _transaction.maxFeePerGas;
if (amount < requiredETH) {
// Important note: while this clause definitely means that the user
// has underpaid the paymaster and the transaction should not accepted,
// we do not want the transaction to revert, because for fee estimation
// we allow users to provide smaller amount of funds then necessary to preserve
// the property that if using X gas the transaction success, then it will succeed with X+1 gas.
magic = bytes4(0);
}
// Pulling all the tokens from the user
try IERC20(token).transferFrom(userAddress, thisAddress, amount) {} catch (bytes memory revertReason) {
// If the revert reason is empty or represented by just a function selector,
// we replace the error with a more user-friendly message
if (revertReason.length <= 4) {
revert("Failed to transferFrom from users' account");
} else {
assembly {
revert(add(0x20, revertReason), mload(revertReason))
}
}
}
// The bootloader never returns any data, so it can safely be ignored here.
(bool success, ) = payable(BOOTLOADER_ADDRESS).call{value: requiredETH}("");
require(success, "Failed to transfer funds to the bootloader");
} else {
revert("Unsupported paymaster flow");
}
}
function postTransaction(
bytes calldata _context,
Transaction calldata _transaction,
bytes32,
bytes32,
ExecutionResult _txResult,
uint256 _maxRefundedGas
) external payable override {
// Refunds are not supported yet.
}
receive() external payable {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT pragma solidity 0.8.20; /** * @author Matter Labs * @custom:security-contact [email protected] * @notice Smart contract for sending arbitrary length messages to L1 * @dev by default ZkSync can send fixed-length messages on L1. * A fixed length message has 4 parameters `senderAddress`, `isService`, `key`, `value`, * the first one is taken from the context, the other three are chosen by the sender. * @dev To send a variable-length message we use this trick: * - This system contract accepts an arbitrary length message and sends a fixed length message with * parameters `senderAddress == this`, `isService == true`, `key == msg.sender`, `value == keccak256(message)`. * - The contract on L1 accepts all sent messages and if the message came from this system contract * it requires that the preimage of `value` be provided. */ interface IL2Messenger { /// @notice Sends an arbitrary length message to L1. /// @param _message The variable length message to be sent to L1. /// @return Returns the keccak256 hashed value of the message. function sendToL1(bytes memory _message) external returns (bytes32); } /** * @author Matter Labs * @custom:security-contact [email protected] * @notice Interface for the contract that is used to deploy contracts on L2. */ interface IContractDeployer { /// @notice A struct that describes a forced deployment on an address. /// @param bytecodeHash The bytecode hash to put on an address. /// @param newAddress The address on which to deploy the bytecodehash to. /// @param callConstructor Whether to run the constructor on the force deployment. /// @param value The `msg.value` with which to initialize a contract. /// @param input The constructor calldata. struct ForceDeployment { bytes32 bytecodeHash; address newAddress; bool callConstructor; uint256 value; bytes input; } /// @notice This method is to be used only during an upgrade to set bytecodes on specific addresses. /// @param _deployParams A set of parameters describing force deployment. function forceDeployOnAddresses(ForceDeployment[] calldata _deployParams) external payable; /// @notice Creates a new contract at a determined address using the `CREATE2` salt on L2 /// @param _salt a unique value to create the deterministic address of the new contract /// @param _bytecodeHash the bytecodehash of the new contract to be deployed /// @param _input the calldata to be sent to the constructor of the new contract function create2(bytes32 _salt, bytes32 _bytecodeHash, bytes calldata _input) external returns (address); } /** * @author Matter Labs * @custom:security-contact [email protected] * @notice Interface for the contract that is used to simulate ETH on L2. */ interface IBaseToken { /// @notice Allows the withdrawal of ETH to a given L1 receiver along with an additional message. /// @param _l1Receiver The address on L1 to receive the withdrawn ETH. /// @param _additionalData Additional message or data to be sent alongside the withdrawal. function withdrawWithMessage(address _l1Receiver, bytes memory _additionalData) external payable; } uint160 constant SYSTEM_CONTRACTS_OFFSET = 0x8000; // 2^15 address constant BOOTLOADER_ADDRESS = address(SYSTEM_CONTRACTS_OFFSET + 0x01); address constant MSG_VALUE_SYSTEM_CONTRACT = address(SYSTEM_CONTRACTS_OFFSET + 0x09); address constant DEPLOYER_SYSTEM_CONTRACT = address(SYSTEM_CONTRACTS_OFFSET + 0x06); IL2Messenger constant L2_MESSENGER = IL2Messenger(address(SYSTEM_CONTRACTS_OFFSET + 0x08)); IBaseToken constant L2_BASE_TOKEN_ADDRESS = IBaseToken(address(SYSTEM_CONTRACTS_OFFSET + 0x0a)); /** * @author Matter Labs * @custom:security-contact [email protected] * @notice Helper library for working with L2 contracts on L1. */ library L2ContractHelper { /// @dev The prefix used to create CREATE2 addresses. bytes32 private constant CREATE2_PREFIX = keccak256("zksyncCreate2"); /// @notice Sends L2 -> L1 arbitrary-long message through the system contract messenger. /// @param _message Data to be sent to L1. /// @return keccak256 hash of the sent message. function sendMessageToL1(bytes memory _message) internal returns (bytes32) { return L2_MESSENGER.sendToL1(_message); } /// @notice Computes the create2 address for a Layer 2 contract. /// @param _sender The address of the contract creator. /// @param _salt The salt value to use in the create2 address computation. /// @param _bytecodeHash The contract bytecode hash. /// @param _constructorInputHash The keccak256 hash of the constructor input data. /// @return The create2 address of the contract. /// NOTE: L2 create2 derivation is different from L1 derivation! function computeCreate2Address( address _sender, bytes32 _salt, bytes32 _bytecodeHash, bytes32 _constructorInputHash ) internal pure returns (address) { bytes32 senderBytes = bytes32(uint256(uint160(_sender))); bytes32 data = keccak256( // solhint-disable-next-line func-named-parameters bytes.concat(CREATE2_PREFIX, senderBytes, _salt, _bytecodeHash, _constructorInputHash) ); return address(uint160(uint256(data))); } } /// @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
pragma solidity 0.8.20;
import {Transaction} from "../L2ContractHelper.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 pragma solidity 0.8.20; /** * @author Matter Labs * @custom:security-contact [email protected] * @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; }
{
"compilerPath": "",
"experimental": {},
"isSystem": true,
"optimizer": {
"enabled": true,
"mode": "3"
},
"outputSelection": {
"*": {
"*": [
"abi"
]
}
}
}Contract ABI
API[{"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":"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"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
3cda33510000000000000000000000000000000000000000000000000000000000000000010000d56de48b30ab16cb298b67423444bf3f6ef1d70feb75c2dd2fb67c6fc600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x000200000000000200090000000000020001000000010355000000800b0000390000004000b0043f00000000030100190000006003300270000000b2033001970000000102200190000000430000c13d000000040230008c0000004b0000413d000000000201043b000000e002200270000000b40420009c0000004f0000613d000000b50220009c000000630000c13d000000040230008a000000c00420008c000000630000413d0000000404100370000000000404043b000000b60540009c000000630000213d0000002305400039000000b706000041000000000735004b00000000070000190000000007068019000000b705500197000000000805004b0000000006008019000000b70550009c000000000607c019000000000506004b000000630000c13d0000000405400039000000000551034f000000000505043b000000b60650009c000000630000213d00000000045400190000002404400039000000000334004b000000630000213d0000002403100370000000000303043b000000b60430009c000000630000213d0000000002320049000000b703000041000002600420008c00000000040000190000000004034019000000b702200197000000000502004b000000000300a019000000b70220009c000000000304c019000000000203004b000000630000c13d0000008401100370000000000101043b000000010110008c000000630000213d0000004d0000013d0000000001000416000000000101004b000000630000c13d000000200100003900000100001004430000012000000443000000b301000041000002c50001042e000000000103004b000000630000c13d0000000001000019000002c50001042e000000040230008a000000600220008c000000630000413d0000004402100370000000000202043b000000b60420009c000000630000213d00000004042000390000000005430049000000b706000041000002600750008c00000000070000190000000007064019000000b708500197000000000908004b000000000600a019000000b70880009c000000000607c019000000000606004b000000650000613d0000000001000019000002c6000104300000000006000411000080010660008c000000990000c13d0000022406200039000000000661034f000000000606043b0000001f0550008a000000b707000041000000000856004b00000000080000190000000008078019000000b705500197000000b709600197000000000a59004b0000000007008019000000000559013f000000b70550009c000000000708c019000000000507004b000000630000c13d0000000004460019000000000541034f000000000505043b000000b60650009c000000630000213d00000000065300490000002003400039000000b707000041000000000863004b00000000080000190000000008072019000000b706600197000000b709300197000000000a69004b0000000007008019000000000669013f000000b70660009c000000000708c019000000000607004b000000630000c13d000000030650008c000000a50000213d000000b801000041000000800010043f0000002001000039000000840010043f0000003a01000039000000a40010043f000000d201000041000000c40010043f000000d301000041000000a20000013d000000b801000041000000800010043f0000002001000039000000840010043f0000002601000039000000a40010043f000000b901000041000000c40010043f000000ba01000041000000e40010043f000000bb01000041000002c600010430000000000631034f000000000606043b000000bc06600197000000bd0660009c000000dd0000c13d000000040550008a000000600650008c000000630000413d0000000403300039000000000631034f000000000606043b000900000006001d000000c00660009c000000630000213d0000004006300039000000000661034f0000002003300039000000000331034f000000000303043b000800000003001d000000000306043b000000b60630009c000000630000213d0000002406400039000000000465001900000000056300190000001f03500039000000b706000041000000000743004b00000000070000190000000007068019000000b703300197000000b708400197000000000983004b0000000006008019000000000383013f000000b70330009c000000000607c019000000000306004b000000630000c13d00070000000b001d000000000351034f000000000303043b000000c10630009c000000d70000813d000000bf063000390006002000000092000000060660017f000000b60760009c000000e70000a13d000000c40100004100000000001004350000004101000039000000040010043f000000c501000041000002c600010430000000b801000041000000800010043f0000002001000039000000840010043f0000001a01000039000000a40010043f000000be01000041000000c40010043f000000bf01000041000002c600010430000000400060043f000000800030043f00000020055000390000000006530019000000000446004b000000630000213d000000000451034f0000001f0530018f0000000506300272000000fa0000613d00000000070000190000000508700210000000000984034f000000000909043b000000a00880003900000000009804350000000107700039000000000867004b000000f20000413d000000000705004b000001090000613d0000000506600210000000000464034f0000000305500210000000a006600039000000000706043300000000075701cf000000000757022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000474019f0000000000460435000000a0033000390000000000030435000300240020003d0000000301100360000000000101043b000000400400043d000000c20200004100000000002404350000000002000410000000c0032001970000002402400039000100000003001d0000000000320435000000c002100197000500000004001d0000000401400039000200000002001d000000000021043500000000010004140000000902000029000000040220008c000001240000c13d0000000003000031000000200130008c00000000040300190000002004008039000001550000013d000000b202000041000000b20310009c00000000010280190000000504000029000000b20340009c00000000020440190000004002200210000000c001100210000000000121019f000000c3011001c7000000090200002902c402bf0000040f000000050a00002900000000030100190000006003300270000000b203300197000000200430008c000000000403001900000020040080390000001f0540018f0000000506400272000001430000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b0000013b0000413d000000000705004b000001520000613d0000000506600210000000000761034f00000005066000290000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f00000001022001900000017d0000613d0000001f01400039000000600110018f0000000504100029000000000214004b00000000020000190000000102004039000400000004001d000000b60440009c000000d70000213d0000000102200190000000d70000c13d0000000402000029000000400020043f000000200230008c000000630000413d00000005020000290000000002020433000000080220006c000001a00000813d00000004030000290000006401300039000000d00200004100000000002104350000004401300039000000d1020000410000000000210435000000240130003900000029020000390000000000210435000000b8010000410000000000130435000000040130003900000020020000390000000000210435000000b201000041000000b20230009c00000000030180190000004001300210000000cc011001c7000002c600010430000000400200043d0000001f0430018f00000005053002720000018a0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000001820000413d000000000604004b000001990000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000000b201000041000000b20420009c000000000201801900000040012002100000006002300210000000000121019f000002c60001043000000003060000290000004002600039000000010520036700000080026000390000000102200367000000000202043b000000000405043b00050000502400ad000000000504004b000001ad0000613d00000005544000f9000000000224004b0000020b0000c13d0000000404000029000000240240003900000001050000290000000000520435000000c6020000410000000000240435000000040240003900000002050000290000000000520435000000440240003900000008040000290000000000420435000000c705000041000000050240006c0000000005004019000800000005001d00000000020004140000000904000029000000040440008c000001f40000613d000000b201000041000000b20320009c00000000020180190000000404000029000000b20340009c00000000010440190000004001100210000000c002200210000000000112019f000000c8011001c7000000090200002902c402ba0000040f000000040a00002900000000030100190000006003300270000000b203300197000000200430008c000000000403001900000020040080390000001f0540018f0000000506400272000001e00000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000001d80000413d000000000705004b000001ef0000613d0000000506600210000000000761034f00000004066000290000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f00000001022001900000020f0000613d0000001f01400039000000600110018f0000000401100029000000b60210009c000000d70000213d000000400010043f000000200130008c000000630000413d00000004010000290000000001010433000000000201004b0000000002000019000000010200c039000000000121004b000000630000c13d000000b2010000410000000002000414000000b20320009c0000000002018019000000c001200210000000050200006b000002500000c13d000080010200003902c402ba0000040f000002560000013d000000c40100004100000000001004350000001101000039000000da0000013d0000006002000039000000000403004b0000021f0000c13d0000000001020433000000050210008c000002490000413d000000b202000041000000b20310009c00000000010280190000000704000029000000b20340009c000000000402801900000040024002100000006001100210000000000121019f000002c6000104300000003f02300039000000c904200197000000400200043d0000000004420019000000000524004b00000000050000190000000105004039000000b60640009c000000d70000213d0000000105500190000000d70000c13d000000400040043f0000001f0430018f00000000083204360000000503300272000002380000613d000000000500001900000005065002100000000007680019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b000002300000413d000700000008001d000000000504004b000002120000613d0000000503300210000000000131034f00000007033000290000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000002120000013d000000400100043d0000006402100039000000ca0300004100000000003204350000004402100039000000cb03000041000002ab0000013d000000cd011001c7000080090200003900008001040000390000000503000029000000000500001902c402ba0000040f00000000030100190000006003300270000000b20030019d000000b205300198000002830000613d0000003f03500039000000c903300197000000400400043d0000000003340019000000000643004b00000000060000190000000106004039000000b60730009c000000d70000213d0000000106600190000000d70000c13d000000400030043f0000001f0350018f00000000045404360000000505500272000002740000613d000000000600001900000005076002100000000008740019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000026c0000413d000000000603004b000002830000613d0000000505500210000000000151034f00000000045400190000000303300210000000000504043300000000053501cf000000000535022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000151019f0000000000140435000000400100043d0000000102200190000002a60000613d000000200210003900000040030000390000000000320435000000080200002900000000002104350000004003100039000000600200043d00000000002304350000006003100039000000000402004b000002990000613d000000000400001900000000053400190000008006400039000000000606043300000000006504350000002004400039000000000524004b000002920000413d000000000332001900000000000304350000007f02200039000000060220017f000000b203000041000000b20420009c0000000002038019000000b20410009c000000000103801900000040011002100000006002200210000000000112019f000002c50001042e0000006402100039000000ce0300004100000000003204350000004402100039000000cf03000041000000000032043500000024021000390000002a030000390000000000320435000000b8020000410000000000210435000000040210003900000020030000390000000000320435000000b202000041000000b20310009c00000000010280190000004001100210000000cc011001c7000002c600010430000002bd002104210000000102000039000000000001042d0000000002000019000000000001042d000002c2002104230000000102000039000000000001042d0000000002000019000000000001042d000002c400000432000002c50001042e000002c600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000038a24bc00000000000000000000000000000000000000000000000000000000817b17f0000000000000000000000000000000000000000000000000ffffffffffffffff800000000000000000000000000000000000000000000000000000000000000008c379a0000000000000000000000000000000000000000000000000000000004f6e6c7920626f6f746c6f616465722063616e2063616c6c207468697320636f6e747261637400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084000000800000000000000000ffffffff00000000000000000000000000000000000000000000000000000000949431dc00000000000000000000000000000000000000000000000000000000556e737570706f72746564207061796d617374657220666c6f770000000000000000000000000000000000000000000000000064000000800000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000010000000000000000dd62ed3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000004e487b7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000038a24bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffe07327206163636f756e74000000000000000000000000000000000000000000004661696c656420746f207472616e7366657246726f6d2066726f6d207573657200000000000000000000000000000000000000840000000000000000000000000200000000000000000000000000000000000000000000000000000000000000626f6f746c6f61646572000000000000000000000000000000000000000000004661696c656420746f207472616e736665722066756e647320746f2074686520616c6c6f77616e63650000000000000000000000000000000000000000000000546865207573657220646964206e6f742070726f7669646520656e6f75676820546865207374616e64617264207061796d617374657220696e707574206d757374206265206174206c656173742034206279746573206c6f6e67000000000000b0960a96ba306890fc3c3af6461cb5342452d854f6c8b2df60162b632f9fdd65
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.