ETH Price: $3,068.91 (-1.60%)
Gas: 3 Gwei

Contract

0xa8CB082A5a689E0d594d7da1E2d72A3D63aDc1bD
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Commit Blob199078182024-05-20 1:20:231 min ago1716168023IN
zkSync Era: Validator Timelock 3
0 ETH0.00079893.46334097
Prove Batches199077862024-05-20 1:13:598 mins ago1716167639IN
zkSync Era: Validator Timelock 3
0 ETH0.001690663.68784896
Commit Blob199077682024-05-20 1:10:2311 mins ago1716167423IN
zkSync Era: Validator Timelock 3
0 ETH0.000990813.99923942
Prove Batches199077302024-05-20 1:02:4719 mins ago1716166967IN
zkSync Era: Validator Timelock 3
0 ETH0.001807593.94144748
Commit Blob199077092024-05-20 0:58:3523 mins ago1716166715IN
zkSync Era: Validator Timelock 3
0 ETH0.00104954.54948916
Commit Blob199076512024-05-20 0:46:5935 mins ago1716166019IN
zkSync Era: Validator Timelock 3
0 ETH0.000830363.5991791
Prove Batches199076092024-05-20 0:38:3543 mins ago1716165515IN
zkSync Era: Validator Timelock 3
0 ETH0.001761663.8420085
Commit Blob199075912024-05-20 0:34:5947 mins ago1716165299IN
zkSync Era: Validator Timelock 3
0 ETH0.000818393.54746017
Commit Blob199075352024-05-20 0:23:3558 mins ago1716164615IN
zkSync Era: Validator Timelock 3
0 ETH0.001244825.39618093
Prove Batches199074852024-05-20 0:13:351 hr ago1716164015IN
zkSync Era: Validator Timelock 3
0 ETH0.00176783.85519241
Commit Blob199074812024-05-20 0:12:471 hr ago1716163967IN
zkSync Era: Validator Timelock 3
0 ETH0.001110954.81664081
Prove Batches199074742024-05-20 0:11:111 hr ago1716163871IN
zkSync Era: Validator Timelock 3
0 ETH0.001775623.87204266
Execute Batches199074602024-05-20 0:08:231 hr ago1716163703IN
zkSync Era: Validator Timelock 3
0 ETH0.008385563.91350051
Commit Blob199074162024-05-19 23:59:231 hr ago1716163163IN
zkSync Era: Validator Timelock 3
0 ETH0.000990094.29172427
Prove Batches199074132024-05-19 23:58:471 hr ago1716163127IN
zkSync Era: Validator Timelock 3
0 ETH0.001978324.3138379
Prove Batches199073632024-05-19 23:48:351 hr ago1716162515IN
zkSync Era: Validator Timelock 3
0 ETH0.001917874.18279194
Commit Blob199073522024-05-19 23:46:231 hr ago1716162383IN
zkSync Era: Validator Timelock 3
0 ETH0.000983744.26397234
Prove Batches199073132024-05-19 23:38:351 hr ago1716161915IN
zkSync Era: Validator Timelock 3
0 ETH0.001902364.1489776
Commit Blob199072932024-05-19 23:34:351 hr ago1716161675IN
zkSync Era: Validator Timelock 3
0 ETH0.000997734.02640847
Prove Batches199072932024-05-19 23:34:351 hr ago1716161675IN
zkSync Era: Validator Timelock 3
0 ETH0.001846124.02640847
Commit Blob199072322024-05-19 23:22:231 hr ago1716160943IN
zkSync Era: Validator Timelock 3
0 ETH0.001235635.35690244
Commit Blob199071682024-05-19 23:09:352 hrs ago1716160175IN
zkSync Era: Validator Timelock 3
0 ETH0.000834613.61796645
Prove Batches199071192024-05-19 22:59:472 hrs ago1716159587IN
zkSync Era: Validator Timelock 3
0 ETH0.001771173.86265658
Prove Batches199071172024-05-19 22:59:232 hrs ago1716159563IN
zkSync Era: Validator Timelock 3
0 ETH0.001686333.6782048
Commit Blob199071142024-05-19 22:58:472 hrs ago1716159527IN
zkSync Era: Validator Timelock 3
0 ETH0.001138644.93618348
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ValidatorTimelock

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 7 : ValidatorTimelock.sol
pragma solidity 0.8.20;

// SPDX-License-Identifier: MIT



import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {LibMap} from "./libraries/LibMap.sol";
import {IExecutor} from "./interfaces/IExecutor.sol";

/// @author Matter Labs
/// @custom:security-contact [email protected]
/// @notice Intermediate smart contract between the validator EOA account and the zkSync smart contract.
/// @dev The primary purpose of this contract is to provide a trustless means of delaying batch execution without
/// modifying the main zkSync contract. As such, even if this contract is compromised, it will not impact the main
/// contract.
/// @dev zkSync actively monitors the chain activity and reacts to any suspicious activity by freezing the chain.
/// This allows time for investigation and mitigation before resuming normal operations.
/// @dev The contract overloads all of the 4 methods, that are used in state transition. When the batch is committed,
/// the timestamp is stored for it. Later, when the owner calls the batch execution, the contract checks that batch
/// was committed not earlier than X time ago.
contract ValidatorTimelock is IExecutor, Ownable2Step {
    using LibMap for LibMap.Uint32Map;

    /// @dev Part of the IBase interface. Not used in this contract.
    string public constant override getName = "ValidatorTimelock";

    /// @notice The delay between committing and executing batches is changed.
    event NewExecutionDelay(uint256 _newExecutionDelay);

    /// @notice A new validator has been added.
    event ValidatorAdded(address _addedValidator);

    /// @notice A validator has been removed.
    event ValidatorRemoved(address _removedValidator);

    /// @notice Error for when an address is already a validator.
    error AddressAlreadyValidator();

    /// @notice Error for when an address is not a validator.
    error ValidatorDoesNotExist();

    /// @dev The main zkSync smart contract.
    address public immutable zkSyncContract;

    /// @dev The mapping of L2 batch number => timestamp when it was committed.
    LibMap.Uint32Map internal committedBatchTimestamp;

    /// @dev The delay between committing and executing batches.ValidatorTimelock
    uint32 public executionDelay;

    /// @dev Mapping denoting if an address is also a validator
    mapping(address => bool) public validators;

    constructor(address _initialOwner, address _zkSyncContract, uint32 _executionDelay, address[] memory _validators) {
        _transferOwnership(_initialOwner);
        zkSyncContract = _zkSyncContract;
        executionDelay = _executionDelay;

        for (uint256 i = 0; i < _validators.length; i++) {
            validators[_validators[i]] = true;
        }
    }

    /// @dev Sets an address as a validator.
    function addValidator(address _newValidator) external onlyOwner {
        if (validators[_newValidator]) {
            revert AddressAlreadyValidator();
        }
        validators[_newValidator] = true;
        emit ValidatorAdded(_newValidator);
    }

    /// @dev Removes an address as a validator.
    function removeValidator(address _validator) external onlyOwner {
        if (!validators[_validator]) {
            revert ValidatorDoesNotExist();
        }
        validators[_validator] = false;
        emit ValidatorRemoved(_validator);
    }

    /// @dev Set the delay between committing and executing batches.
    function setExecutionDelay(uint32 _executionDelay) external onlyOwner {
        executionDelay = _executionDelay;
        emit NewExecutionDelay(_executionDelay);
    }

    /// @notice Checks if the caller is a validator.
    modifier onlyValidator() {
        require(validators[msg.sender] == true, "8h");
        _;
    }

    /// @dev Returns the timestamp when `_l2BatchNumber` was committed.
    function getCommittedBatchTimestamp(uint256 _l2BatchNumber) external view returns (uint256) {
        return committedBatchTimestamp.get(_l2BatchNumber);
    }

    /// @dev Records the timestamp for all provided committed batches and make
    /// a call to the zkSync contract with the same calldata.
    function commitBatches(
        StoredBatchInfo calldata,
        CommitBatchInfo[] calldata _newBatchesData
    ) external onlyValidator {
        unchecked {
            // This contract is only a temporary solution, that hopefully will be disabled until 2106 year, so...
            // It is safe to cast.
            uint32 timestamp = uint32(block.timestamp);
            for (uint256 i = 0; i < _newBatchesData.length; ++i) {
                committedBatchTimestamp.set(_newBatchesData[i].batchNumber, timestamp);
            }
        }

        _propagateToZkSync();
    }

    /// @dev Make a call to the zkSync contract with the same calldata.
    /// Note: If the batch is reverted, it needs to be committed first before the execution.
    /// So it's safe to not override the committed batches.
    function revertBatches(uint256) external onlyValidator {
        _propagateToZkSync();
    }

    /// @dev Make a call to the zkSync contract with the same calldata.
    /// Note: We don't track the time when batches are proven, since all information about
    /// the batch is known on the commit stage and the proved is not finalized (may be reverted).
    function proveBatches(
        StoredBatchInfo calldata,
        StoredBatchInfo[] calldata,
        ProofInput calldata
    ) external onlyValidator {
        _propagateToZkSync();
    }

    /// @dev Check that batches were committed at least X time ago and
    /// make a call to the zkSync contract with the same calldata.
    function executeBatches(StoredBatchInfo[] calldata _newBatchesData) external onlyValidator {
        uint256 delay = executionDelay; // uint32
        unchecked {
            for (uint256 i = 0; i < _newBatchesData.length; ++i) {
                uint256 commitBatchTimestamp = committedBatchTimestamp.get(_newBatchesData[i].batchNumber);

                // Note: if the `commitBatchTimestamp` is zero, that means either:
                // * The batch was committed, but not through this contract.
                // * The batch wasn't committed at all, so execution will fail in the zkSync contract.
                // We allow executing such batches.
                require(block.timestamp >= commitBatchTimestamp + delay, "5c"); // The delay is not passed
            }
        }

        _propagateToZkSync();
    }

    /// @dev Call the zkSync contract with the same calldata as this contract was called.
    /// Note: it is called the zkSync contract, not delegatecalled!
    function _propagateToZkSync() internal {
        address contractAddress = zkSyncContract;
        assembly {
            // Copy function signature and arguments from calldata at zero position into memory at pointer position
            calldatacopy(0, 0, calldatasize())
            // Call method of the zkSync contract returns 0 on error
            let result := call(gas(), contractAddress, 0, 0, calldatasize(), 0, 0)
            // Get the size of the last return data
            let size := returndatasize()
            // Copy the size length of bytes from return data at zero position to pointer position
            returndatacopy(0, 0, size)
            // Depending on the result value
            switch result
            case 0 {
                // End execution and revert state changes
                revert(0, size)
            }
            default {
                // Return data with length of size at pointers position
                return(0, size)
            }
        }
    }
}

File 3 of 7 : Ownable2Step.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.0;

import "./Ownable.sol";

/**
 * @dev Contract module which provides access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
    address private _pendingOwner;

    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Returns the address of the pending owner.
     */
    function pendingOwner() public view virtual returns (address) {
        return _pendingOwner;
    }

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual override {
        delete _pendingOwner;
        super._transferOwnership(newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() public virtual {
        address sender = _msgSender();
        require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
        _transferOwnership(sender);
    }
}

File 4 of 7 : LibMap.sol
pragma solidity 0.8.20;

// SPDX-License-Identifier: MIT


/// @notice Library for storage of packed unsigned integers.
/// @author Matter Labs
/// @dev This library is an adaptation of the corresponding Solady library (https://github.com/vectorized/solady/blob/main/src/utils/LibMap.sol)
/// @custom:security-contact [email protected]
library LibMap {
    /// @dev A uint32 map in storage.
    struct Uint32Map {
        mapping(uint256 packedIndex => uint256 eightPackedValues) map;
    }

    /// @dev Retrieves the uint32 value at a specific index from the Uint32Map.
    /// @param _map The Uint32Map instance containing the packed uint32 values.
    /// @param _index The index of the uint32 value to retrieve.
    /// @return result The uint32 value at the specified index.
    function get(Uint32Map storage _map, uint256 _index) internal view returns (uint32 result) {
        unchecked {
            // Each storage slot can store 256 bits of data.
            // As uint32 is 32 bits long, 8 uint32s can be packed into one storage slot.
            // Hence, `_index / 8` is done to find the storage slot that contains the required uint32.
            uint256 mapValue = _map.map[_index / 8];

            // First three bits of the original `_index` denotes the position of the uint32 in that slot.
            // So, '(_index & 7) * 32' is done to find the bit position of the uint32 in that storage slot.
            uint256 bitOffset = (_index & 7) * 32;

            // Shift the bits to the right and retrieve the uint32 value.
            result = uint32(mapValue >> bitOffset);
        }
    }

    /// @dev Updates the uint32 value at `_index` in `map`.
    /// @param _map The Uint32Map instance containing the packed uint32 values.
    /// @param _index The index of the uint32 value to set.
    /// @param _value The new value at the specified index.
    function set(Uint32Map storage _map, uint256 _index, uint32 _value) internal {
        unchecked {
            // Each storage slot can store 256 bits of data.
            // As uint32 is 32 bits long, 8 uint32s can be packed into one storage slot.
            // Hence, `_index / 8` is done to find the storage slot that contains the required uint32.
            uint256 mapIndex = _index / 8;
            uint256 mapValue = _map.map[mapIndex];

            // First three bits of the original `_index` denotes the position of the uint32 in that slot.
            // So, '(_index & 7) * 32' is done to find the bit position of the uint32 in that storage slot.
            uint256 bitOffset = (_index & 7) * 32;

            // XORing a value A with B, and then with A again, gives the original value B.
            // We will use this property to update the uint32 value in the slot.

            // Shift the bits to the right and retrieve the uint32 value.
            uint32 oldValue = uint32(mapValue >> bitOffset);

            // Calculate the XOR of the new value and the existing value.
            uint256 newValueXorOldValue = uint256(oldValue ^ _value);

            // Finally, we XOR the slot with the XOR of the new value and the existing value,
            // shifted to its proper position. The XOR operation will effectively replace the old value with the new value.
            _map.map[mapIndex] = (newValueXorOldValue << bitOffset) ^ mapValue;
        }
    }
}

File 5 of 7 : IExecutor.sol
pragma solidity 0.8.20;

// SPDX-License-Identifier: MIT



import {IBase} from "./IBase.sol";

/// @dev Enum used by L2 System Contracts to differentiate logs.
enum SystemLogKey {
    L2_TO_L1_LOGS_TREE_ROOT_KEY,
    TOTAL_L2_TO_L1_PUBDATA_KEY,
    STATE_DIFF_HASH_KEY,
    PACKED_BATCH_AND_L2_BLOCK_TIMESTAMP_KEY,
    PREV_BATCH_HASH_KEY,
    CHAINED_PRIORITY_TXN_HASH_KEY,
    NUMBER_OF_LAYER_1_TXS_KEY,
    BLOB_ONE_HASH_KEY,
    BLOB_TWO_HASH_KEY,
    EXPECTED_SYSTEM_CONTRACT_UPGRADE_TX_HASH_KEY
}

/// @dev Enum used to determine the source of pubdata. At first we will support calldata and blobs but this can be extended.
enum PubdataSource {
    Calldata,
    Blob
}

struct LogProcessingOutput {
    uint256 numberOfLayer1Txs;
    bytes32 chainedPriorityTxsHash;
    bytes32 previousBatchHash;
    bytes32 pubdataHash;
    bytes32 stateDiffHash;
    bytes32 l2LogsTreeRoot;
    uint256 packedBatchAndL2BlockTimestamp;
    bytes32 blob1Hash;
    bytes32 blob2Hash;
}

/// @dev Offset used to pull Address From Log. Equal to 4 (bytes for isService)
uint256 constant L2_LOG_ADDRESS_OFFSET = 4;

/// @dev Offset used to pull Key From Log. Equal to 4 (bytes for isService) + 20 (bytes for address)
uint256 constant L2_LOG_KEY_OFFSET = 24;

/// @dev Offset used to pull Value From Log. Equal to 4 (bytes for isService) + 20 (bytes for address) + 32 (bytes for key)
uint256 constant L2_LOG_VALUE_OFFSET = 56;

/// @dev BLS Modulus value defined in EIP-4844 and the magic value returned from a successful call to the
/// point evaluation precompile
uint256 constant BLS_MODULUS = 52435875175126190479447740508185965837690552500527637822603658699938581184513;

/// @dev Packed pubdata commitments.
/// @dev Format: list of: opening point (16 bytes) || claimed value (32 bytes) || commitment (48 bytes) || proof (48 bytes)) = 144 bytes
uint256 constant PUBDATA_COMMITMENT_SIZE = 144;

/// @dev Offset in pubdata commitment of blobs for claimed value
uint256 constant PUBDATA_COMMITMENT_CLAIMED_VALUE_OFFSET = 16;

/// @dev Offset in pubdata commitment of blobs for kzg commitment
uint256 constant PUBDATA_COMMITMENT_COMMITMENT_OFFSET = 48;

/// @dev Max number of blobs currently supported
uint256 constant MAX_NUMBER_OF_BLOBS = 2;

/// @title The interface of the zkSync Executor contract capable of processing events emitted in the zkSync protocol.
/// @author Matter Labs
/// @custom:security-contact [email protected]
interface IExecutor is IBase {
    /// @notice Rollup batch stored data
    /// @param batchNumber Rollup batch number
    /// @param batchHash Hash of L2 batch
    /// @param indexRepeatedStorageChanges The serial number of the shortcut index that's used as a unique identifier for storage keys that were used twice or more
    /// @param numberOfLayer1Txs Number of priority operations to be processed
    /// @param priorityOperationsHash Hash of all priority operations from this batch
    /// @param l2LogsTreeRoot Root hash of tree that contains L2 -> L1 messages from this batch
    /// @param timestamp Rollup batch timestamp, have the same format as Ethereum batch constant
    /// @param commitment Verified input for the zkSync circuit
    struct StoredBatchInfo {
        uint64 batchNumber;
        bytes32 batchHash;
        uint64 indexRepeatedStorageChanges;
        uint256 numberOfLayer1Txs;
        bytes32 priorityOperationsHash;
        bytes32 l2LogsTreeRoot;
        uint256 timestamp;
        bytes32 commitment;
    }

    /// @notice Data needed to commit new batch
    /// @param batchNumber Number of the committed batch
    /// @param timestamp Unix timestamp denoting the start of the batch execution
    /// @param indexRepeatedStorageChanges The serial number of the shortcut index that's used as a unique identifier for storage keys that were used twice or more
    /// @param newStateRoot The state root of the full state tree
    /// @param numberOfLayer1Txs Number of priority operations to be processed
    /// @param priorityOperationsHash Hash of all priority operations from this batch
    /// @param bootloaderHeapInitialContentsHash Hash of the initial contents of the bootloader heap. In practice it serves as the commitment to the transactions in the batch.
    /// @param eventsQueueStateHash Hash of the events queue state. In practice it serves as the commitment to the events in the batch.
    /// @param systemLogs concatenation of all L2 -> L1 system logs in the batch
    /// @param pubdataCommitments Packed pubdata commitments/data.
    /// @dev pubdataCommitments format: This will always start with a 1 byte pubdataSource flag. Current allowed values are 0 (calldata) or 1 (blobs)
    ///                             kzg: list of: opening point (16 bytes) || claimed value (32 bytes) || commitment (48 bytes) || proof (48 bytes) = 144 bytes
    ///                             calldata: pubdataCommitments.length - 1 - 32 bytes of pubdata
    ///                                       and 32 bytes appended to serve as the blob commitment part for the aux output part of the batch commitment
    /// @dev For 2 blobs we will be sending 288 bytes of calldata instead of the full amount for pubdata.
    /// @dev When using calldata, we only need to send one blob commitment since the max number of bytes in calldata fits in a single blob and we can pull the
    ///     linear hash from the system logs
    struct CommitBatchInfo {
        uint64 batchNumber;
        uint64 timestamp;
        uint64 indexRepeatedStorageChanges;
        bytes32 newStateRoot;
        uint256 numberOfLayer1Txs;
        bytes32 priorityOperationsHash;
        bytes32 bootloaderHeapInitialContentsHash;
        bytes32 eventsQueueStateHash;
        bytes systemLogs;
        bytes pubdataCommitments;
    }

    /// @notice Recursive proof input data (individual commitments are constructed onchain)
    struct ProofInput {
        uint256[] recursiveAggregationInput;
        uint256[] serializedProof;
    }

    /// @notice Function called by the operator to commit new batches. It is responsible for:
    /// - Verifying the correctness of their timestamps.
    /// - Processing their L2->L1 logs.
    /// - Storing batch commitments.
    /// @param _lastCommittedBatchData Stored data of the last committed batch.
    /// @param _newBatchesData Data of the new batches to be committed.
    function commitBatches(
        StoredBatchInfo calldata _lastCommittedBatchData,
        CommitBatchInfo[] calldata _newBatchesData
    ) external;

    /// @notice Batches commitment verification.
    /// @dev Only verifies batch commitments without any other processing.
    /// @param _prevBatch Stored data of the last committed batch.
    /// @param _committedBatches Stored data of the committed batches.
    /// @param _proof The zero knowledge proof.
    function proveBatches(
        StoredBatchInfo calldata _prevBatch,
        StoredBatchInfo[] calldata _committedBatches,
        ProofInput calldata _proof
    ) external;

    /// @notice The function called by the operator to finalize (execute) batches. It is responsible for:
    /// - Processing all pending operations (commpleting priority requests).
    /// - Finalizing this batch (i.e. allowing to withdraw funds from the system)
    /// @param _batchesData Data of the batches to be executed.
    function executeBatches(StoredBatchInfo[] calldata _batchesData) external;

    /// @notice Reverts unexecuted batches
    /// @param _newLastBatch batch number after which batches should be reverted
    /// NOTE: Doesn't delete the stored data about batches, but only decreases
    /// counters that are responsible for the number of batches
    function revertBatches(uint256 _newLastBatch) external;

    /// @notice Event emitted when a batch is committed
    /// @param batchNumber Number of the batch committed
    /// @param batchHash Hash of the L2 batch
    /// @param commitment Calculated input for the zkSync circuit
    /// @dev It has the name "BlockCommit" and not "BatchCommit" due to backward compatibility considerations
    event BlockCommit(uint256 indexed batchNumber, bytes32 indexed batchHash, bytes32 indexed commitment);

    /// @notice Event emitted when batches are verified
    /// @param previousLastVerifiedBatch Batch number of the previous last verified batch
    /// @param currentLastVerifiedBatch Batch number of the current last verified batch
    /// @dev It has the name "BlocksVerification" and not "BatchesVerification" due to backward compatibility considerations
    event BlocksVerification(uint256 indexed previousLastVerifiedBatch, uint256 indexed currentLastVerifiedBatch);

    /// @notice Event emitted when a batch is executed
    /// @param batchNumber Number of the batch executed
    /// @param batchHash Hash of the L2 batch
    /// @param commitment Verified input for the zkSync circuit
    /// @dev It has the name "BlockExecution" and not "BatchExecution" due to backward compatibility considerations
    event BlockExecution(uint256 indexed batchNumber, bytes32 indexed batchHash, bytes32 indexed commitment);

    /// @notice Event emitted when batches are reverted
    /// @param totalBatchesCommitted Total number of committed batches after the revert
    /// @param totalBatchesVerified Total number of verified batches after the revert
    /// @param totalBatchesExecuted Total number of executed batches
    /// @dev It has the name "BlocksRevert" and not "BatchesRevert" due to backward compatibility considerations
    event BlocksRevert(uint256 totalBatchesCommitted, uint256 totalBatchesVerified, uint256 totalBatchesExecuted);
}

File 6 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../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.
 *
 * By default, the owner account will be the one that deploys the contract. 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;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @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 {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @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 {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _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);
    }
}

File 7 of 7 : IBase.sol
pragma solidity 0.8.20;

// SPDX-License-Identifier: UNLICENSED


/// @title The interface of the zkSync contract, responsible for the main zkSync logic.
/// @author Matter Labs
/// @custom:security-contact [email protected]
interface IBase {
    /// @return Returns facet name.
    function getName() external view returns (string memory);
}

File 8 of 7 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @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;
    }
}

Settings
{
  "remappings": [
    "@ensdomains/=node_modules/@ensdomains/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "eth-gas-reporter/=node_modules/eth-gas-reporter/",
    "forge-std/=lib/forge-std/src/",
    "hardhat/=node_modules/hardhat/",
    "solpp/=cache/solpp-generated-contracts/",
    "murky/=lib/murky/src/",
    "openzeppelin-contracts/=lib/murky/lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_initialOwner","type":"address"},{"internalType":"address","name":"_zkSyncContract","type":"address"},{"internalType":"uint32","name":"_executionDelay","type":"uint32"},{"internalType":"address[]","name":"_validators","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressAlreadyValidator","type":"error"},{"inputs":[],"name":"ValidatorDoesNotExist","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"batchNumber","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"batchHash","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"commitment","type":"bytes32"}],"name":"BlockCommit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"batchNumber","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"batchHash","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"commitment","type":"bytes32"}],"name":"BlockExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalBatchesCommitted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBatchesVerified","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalBatchesExecuted","type":"uint256"}],"name":"BlocksRevert","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"previousLastVerifiedBatch","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"currentLastVerifiedBatch","type":"uint256"}],"name":"BlocksVerification","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newExecutionDelay","type":"uint256"}],"name":"NewExecutionDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_addedValidator","type":"address"}],"name":"ValidatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_removedValidator","type":"address"}],"name":"ValidatorRemoved","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newValidator","type":"address"}],"name":"addValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"batchNumber","type":"uint64"},{"internalType":"bytes32","name":"batchHash","type":"bytes32"},{"internalType":"uint64","name":"indexRepeatedStorageChanges","type":"uint64"},{"internalType":"uint256","name":"numberOfLayer1Txs","type":"uint256"},{"internalType":"bytes32","name":"priorityOperationsHash","type":"bytes32"},{"internalType":"bytes32","name":"l2LogsTreeRoot","type":"bytes32"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes32","name":"commitment","type":"bytes32"}],"internalType":"struct IExecutor.StoredBatchInfo","name":"","type":"tuple"},{"components":[{"internalType":"uint64","name":"batchNumber","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint64","name":"indexRepeatedStorageChanges","type":"uint64"},{"internalType":"bytes32","name":"newStateRoot","type":"bytes32"},{"internalType":"uint256","name":"numberOfLayer1Txs","type":"uint256"},{"internalType":"bytes32","name":"priorityOperationsHash","type":"bytes32"},{"internalType":"bytes32","name":"bootloaderHeapInitialContentsHash","type":"bytes32"},{"internalType":"bytes32","name":"eventsQueueStateHash","type":"bytes32"},{"internalType":"bytes","name":"systemLogs","type":"bytes"},{"internalType":"bytes","name":"pubdataCommitments","type":"bytes"}],"internalType":"struct IExecutor.CommitBatchInfo[]","name":"_newBatchesData","type":"tuple[]"}],"name":"commitBatches","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"batchNumber","type":"uint64"},{"internalType":"bytes32","name":"batchHash","type":"bytes32"},{"internalType":"uint64","name":"indexRepeatedStorageChanges","type":"uint64"},{"internalType":"uint256","name":"numberOfLayer1Txs","type":"uint256"},{"internalType":"bytes32","name":"priorityOperationsHash","type":"bytes32"},{"internalType":"bytes32","name":"l2LogsTreeRoot","type":"bytes32"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes32","name":"commitment","type":"bytes32"}],"internalType":"struct IExecutor.StoredBatchInfo[]","name":"_newBatchesData","type":"tuple[]"}],"name":"executeBatches","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executionDelay","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_l2BatchNumber","type":"uint256"}],"name":"getCommittedBatchTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"batchNumber","type":"uint64"},{"internalType":"bytes32","name":"batchHash","type":"bytes32"},{"internalType":"uint64","name":"indexRepeatedStorageChanges","type":"uint64"},{"internalType":"uint256","name":"numberOfLayer1Txs","type":"uint256"},{"internalType":"bytes32","name":"priorityOperationsHash","type":"bytes32"},{"internalType":"bytes32","name":"l2LogsTreeRoot","type":"bytes32"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes32","name":"commitment","type":"bytes32"}],"internalType":"struct IExecutor.StoredBatchInfo","name":"","type":"tuple"},{"components":[{"internalType":"uint64","name":"batchNumber","type":"uint64"},{"internalType":"bytes32","name":"batchHash","type":"bytes32"},{"internalType":"uint64","name":"indexRepeatedStorageChanges","type":"uint64"},{"internalType":"uint256","name":"numberOfLayer1Txs","type":"uint256"},{"internalType":"bytes32","name":"priorityOperationsHash","type":"bytes32"},{"internalType":"bytes32","name":"l2LogsTreeRoot","type":"bytes32"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes32","name":"commitment","type":"bytes32"}],"internalType":"struct IExecutor.StoredBatchInfo[]","name":"","type":"tuple[]"},{"components":[{"internalType":"uint256[]","name":"recursiveAggregationInput","type":"uint256[]"},{"internalType":"uint256[]","name":"serializedProof","type":"uint256[]"}],"internalType":"struct IExecutor.ProofInput","name":"","type":"tuple"}],"name":"proveBatches","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validator","type":"address"}],"name":"removeValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"revertBatches","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_executionDelay","type":"uint32"}],"name":"setExecutionDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"validators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"zkSyncContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b5060405162000ed738038062000ed7833981016040819052620000349162000187565b6200003f33620000e6565b6200004a84620000e6565b6001600160a01b0383166080526003805463ffffffff191663ffffffff841617905560005b8151811015620000db576001600460008484815181106200009457620000946200029c565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580620000d281620002b2565b9150506200006f565b5050505050620002da565b600180546001600160a01b0319169055620001018162000104565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200016c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156200019e57600080fd5b620001a98562000154565b93506020620001ba81870162000154565b9350604086015163ffffffff81168114620001d457600080fd5b60608701519093506001600160401b0380821115620001f257600080fd5b818801915088601f8301126200020757600080fd5b8151818111156200021c576200021c62000171565b8060051b604051601f19603f8301168101818110858211171562000244576200024462000171565b60405291825284820192508381018501918b8311156200026357600080fd5b938501935b828510156200028c576200027c8562000154565b8452938501939285019262000268565b989b979a50959850505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201620002d357634e487b7160e01b600052601160045260246000fd5b5060010190565b608051610bda620002fd60003960008181610267015261080e0152610bda6000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80638b257989116100a2578063cc7086fb11610071578063cc7086fb14610262578063e30c397814610289578063f2fde38b1461029a578063f34d1868146102ad578063fa52c7d8146102c057600080fd5b80638b257989146101f25780638da5cb5b1461021757806397c09d341461023c578063c3d93e7c1461024f57600080fd5b8063701f58c5116100de578063701f58c5146101bc578063715018a6146101cf57806379ba5097146101d75780637f61885c146101df57600080fd5b80630aa567021461011057806317d7de7c1461015757806340a141ff146101945780634d238c8e146101a9575b600080fd5b61014461011e3660046108b7565b600881046000908152600260209081526040909120546007909216021c63ffffffff1690565b6040519081526020015b60405180910390f35b6101876040518060400160405280601181526020017056616c696461746f7254696d656c6f636b60781b81525081565b60405161014e91906108d0565b6101a76101a236600461091e565b6102f3565b005b6101a76101b736600461091e565b61038c565b6101a76101ca366004610967565b610422565b6101a76104f4565b6101a7610508565b6101a76101ed366004610a3c565b610582565b6003546102029063ffffffff1681565b60405163ffffffff909116815260200161014e565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161014e565b6101a761024a3660046108b7565b6105c4565b6101a761025d366004610abf565b610600565b6102247f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b0316610224565b6101a76102a836600461091e565b6106f1565b6101a76102bb366004610b01565b610762565b6102e36102ce36600461091e565b60046020526000908152604090205460ff1681565b604051901515815260200161014e565b6102fb6107b2565b6001600160a01b03811660009081526004602052604090205460ff16610334576040516372898ae960e11b815260040160405180910390fd5b6001600160a01b038116600081815260046020908152604091829020805460ff1916905590519182527fe1434e25d6611e0db941968fdc97811c982ac1602e951637d206f5fdda9dd8f191015b60405180910390a150565b6103946107b2565b6001600160a01b03811660009081526004602052604090205460ff16156103ce5760405163158d048360e01b815260040160405180910390fd5b6001600160a01b038116600081815260046020908152604091829020805460ff1916600117905590519182527fe366c1c0452ed8eec96861e9e54141ebff23c9ec89fe27b996b45f5ec38849879101610381565b3360009081526004602052604090205460ff16151560011461045f5760405162461bcd60e51b815260040161045690610b27565b60405180910390fd5b4260005b828110156104e5576104dd84848381811061048057610480610b43565b90506020028101906104929190610b59565b6104a0906020810190610b7a565b600867ffffffffffffffff82160460009081526002602090815260409091208054600790931690910282811c861863ffffffff16901b9091189055565b600101610463565b50506104ef61080c565b505050565b6104fc6107b2565b6105066000610853565b565b60015433906001600160a01b031681146105765760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610456565b61057f81610853565b50565b3360009081526004602052604090205460ff1615156001146105b65760405162461bcd60e51b815260040161045690610b27565b6105be61080c565b50505050565b3360009081526004602052604090205460ff1615156001146105f85760405162461bcd60e51b815260040161045690610b27565b61057f61080c565b3360009081526004602052604090205460ff1615156001146106345760405162461bcd60e51b815260040161045690610b27565b60035463ffffffff1660005b828110156106e85760006106a085858481811061065f5761065f610b43565b610676926020610100909202019081019150610b7a565b600867ffffffffffffffff8216046000908152600260209081526040909120546007909216021c90565b63ffffffff1690508281014210156106df5760405162461bcd60e51b8152602060048201526002602482015261356360f01b6044820152606401610456565b50600101610640565b506104ef61080c565b6106f96107b2565b600180546001600160a01b0383166001600160a01b0319909116811790915561072a6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61076a6107b2565b6003805463ffffffff191663ffffffff83169081179091556040519081527fd32d6d626bb9c7077c559fc3b4e5ce71ef14609d7d216d030ee63dcf2422c2c490602001610381565b6000546001600160a01b031633146105065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610456565b7f0000000000000000000000000000000000000000000000000000000000000000366000803760008036600080855af13d806000803e81801561084e57816000f35b816000fd5b600180546001600160a01b031916905561057f81600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156108c957600080fd5b5035919050565b600060208083528351808285015260005b818110156108fd578581018301518582016040015282016108e1565b506000604082860101526040601f19601f8301168501019250505092915050565b60006020828403121561093057600080fd5b81356001600160a01b038116811461094757600080fd5b9392505050565b6000610100828403121561096157600080fd5b50919050565b6000806000610120848603121561097d57600080fd5b610987858561094e565b925061010084013567ffffffffffffffff808211156109a557600080fd5b818601915086601f8301126109b957600080fd5b8135818111156109c857600080fd5b8760208260051b85010111156109dd57600080fd5b6020830194508093505050509250925092565b60008083601f840112610a0257600080fd5b50813567ffffffffffffffff811115610a1a57600080fd5b6020830191508360208260081b8501011115610a3557600080fd5b9250929050565b6000806000806101408587031215610a5357600080fd5b610a5d868661094e565b935061010085013567ffffffffffffffff80821115610a7b57600080fd5b610a87888389016109f0565b9095509350610120870135915080821115610aa157600080fd5b50850160408188031215610ab457600080fd5b939692955090935050565b60008060208385031215610ad257600080fd5b823567ffffffffffffffff811115610ae957600080fd5b610af5858286016109f0565b90969095509350505050565b600060208284031215610b1357600080fd5b813563ffffffff8116811461094757600080fd5b602080825260029082015261070d60f31b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000823561013e19833603018112610b7057600080fd5b9190910192915050565b600060208284031215610b8c57600080fd5b813567ffffffffffffffff8116811461094757600080fdfea26469706673582212200be64dccc285958acf2ccdf1a79e98b4dc71e3650beabccf9a79c9036179587564736f6c634300081400330000000000000000000000000b622a2061eaccae1c664ebc3e868b8438e03f6100000000000000000000000032400084c286cf3e17e7b677ea9583e60a0003240000000000000000000000000000000000000000000000000000000000012750000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000020000000000000000000000003527439923a63f8c13cf72b8fe80a77f6e5720920000000000000000000000000d3250c3d5facb74ac15834096397a3ef790ec99

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80638b257989116100a2578063cc7086fb11610071578063cc7086fb14610262578063e30c397814610289578063f2fde38b1461029a578063f34d1868146102ad578063fa52c7d8146102c057600080fd5b80638b257989146101f25780638da5cb5b1461021757806397c09d341461023c578063c3d93e7c1461024f57600080fd5b8063701f58c5116100de578063701f58c5146101bc578063715018a6146101cf57806379ba5097146101d75780637f61885c146101df57600080fd5b80630aa567021461011057806317d7de7c1461015757806340a141ff146101945780634d238c8e146101a9575b600080fd5b61014461011e3660046108b7565b600881046000908152600260209081526040909120546007909216021c63ffffffff1690565b6040519081526020015b60405180910390f35b6101876040518060400160405280601181526020017056616c696461746f7254696d656c6f636b60781b81525081565b60405161014e91906108d0565b6101a76101a236600461091e565b6102f3565b005b6101a76101b736600461091e565b61038c565b6101a76101ca366004610967565b610422565b6101a76104f4565b6101a7610508565b6101a76101ed366004610a3c565b610582565b6003546102029063ffffffff1681565b60405163ffffffff909116815260200161014e565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161014e565b6101a761024a3660046108b7565b6105c4565b6101a761025d366004610abf565b610600565b6102247f00000000000000000000000032400084c286cf3e17e7b677ea9583e60a00032481565b6001546001600160a01b0316610224565b6101a76102a836600461091e565b6106f1565b6101a76102bb366004610b01565b610762565b6102e36102ce36600461091e565b60046020526000908152604090205460ff1681565b604051901515815260200161014e565b6102fb6107b2565b6001600160a01b03811660009081526004602052604090205460ff16610334576040516372898ae960e11b815260040160405180910390fd5b6001600160a01b038116600081815260046020908152604091829020805460ff1916905590519182527fe1434e25d6611e0db941968fdc97811c982ac1602e951637d206f5fdda9dd8f191015b60405180910390a150565b6103946107b2565b6001600160a01b03811660009081526004602052604090205460ff16156103ce5760405163158d048360e01b815260040160405180910390fd5b6001600160a01b038116600081815260046020908152604091829020805460ff1916600117905590519182527fe366c1c0452ed8eec96861e9e54141ebff23c9ec89fe27b996b45f5ec38849879101610381565b3360009081526004602052604090205460ff16151560011461045f5760405162461bcd60e51b815260040161045690610b27565b60405180910390fd5b4260005b828110156104e5576104dd84848381811061048057610480610b43565b90506020028101906104929190610b59565b6104a0906020810190610b7a565b600867ffffffffffffffff82160460009081526002602090815260409091208054600790931690910282811c861863ffffffff16901b9091189055565b600101610463565b50506104ef61080c565b505050565b6104fc6107b2565b6105066000610853565b565b60015433906001600160a01b031681146105765760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610456565b61057f81610853565b50565b3360009081526004602052604090205460ff1615156001146105b65760405162461bcd60e51b815260040161045690610b27565b6105be61080c565b50505050565b3360009081526004602052604090205460ff1615156001146105f85760405162461bcd60e51b815260040161045690610b27565b61057f61080c565b3360009081526004602052604090205460ff1615156001146106345760405162461bcd60e51b815260040161045690610b27565b60035463ffffffff1660005b828110156106e85760006106a085858481811061065f5761065f610b43565b610676926020610100909202019081019150610b7a565b600867ffffffffffffffff8216046000908152600260209081526040909120546007909216021c90565b63ffffffff1690508281014210156106df5760405162461bcd60e51b8152602060048201526002602482015261356360f01b6044820152606401610456565b50600101610640565b506104ef61080c565b6106f96107b2565b600180546001600160a01b0383166001600160a01b0319909116811790915561072a6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61076a6107b2565b6003805463ffffffff191663ffffffff83169081179091556040519081527fd32d6d626bb9c7077c559fc3b4e5ce71ef14609d7d216d030ee63dcf2422c2c490602001610381565b6000546001600160a01b031633146105065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610456565b7f00000000000000000000000032400084c286cf3e17e7b677ea9583e60a000324366000803760008036600080855af13d806000803e81801561084e57816000f35b816000fd5b600180546001600160a01b031916905561057f81600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156108c957600080fd5b5035919050565b600060208083528351808285015260005b818110156108fd578581018301518582016040015282016108e1565b506000604082860101526040601f19601f8301168501019250505092915050565b60006020828403121561093057600080fd5b81356001600160a01b038116811461094757600080fd5b9392505050565b6000610100828403121561096157600080fd5b50919050565b6000806000610120848603121561097d57600080fd5b610987858561094e565b925061010084013567ffffffffffffffff808211156109a557600080fd5b818601915086601f8301126109b957600080fd5b8135818111156109c857600080fd5b8760208260051b85010111156109dd57600080fd5b6020830194508093505050509250925092565b60008083601f840112610a0257600080fd5b50813567ffffffffffffffff811115610a1a57600080fd5b6020830191508360208260081b8501011115610a3557600080fd5b9250929050565b6000806000806101408587031215610a5357600080fd5b610a5d868661094e565b935061010085013567ffffffffffffffff80821115610a7b57600080fd5b610a87888389016109f0565b9095509350610120870135915080821115610aa157600080fd5b50850160408188031215610ab457600080fd5b939692955090935050565b60008060208385031215610ad257600080fd5b823567ffffffffffffffff811115610ae957600080fd5b610af5858286016109f0565b90969095509350505050565b600060208284031215610b1357600080fd5b813563ffffffff8116811461094757600080fd5b602080825260029082015261070d60f31b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000823561013e19833603018112610b7057600080fd5b9190910192915050565b600060208284031215610b8c57600080fd5b813567ffffffffffffffff8116811461094757600080fdfea26469706673582212200be64dccc285958acf2ccdf1a79e98b4dc71e3650beabccf9a79c9036179587564736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000b622a2061eaccae1c664ebc3e868b8438e03f6100000000000000000000000032400084c286cf3e17e7b677ea9583e60a0003240000000000000000000000000000000000000000000000000000000000012750000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000020000000000000000000000003527439923a63f8c13cf72b8fe80a77f6e5720920000000000000000000000000d3250c3d5facb74ac15834096397a3ef790ec99

-----Decoded View---------------
Arg [0] : _initialOwner (address): 0x0b622A2061EaccAE1c664eBC3E868b8438e03F61
Arg [1] : _zkSyncContract (address): 0x32400084C286CF3E17e7B677ea9583e60a000324
Arg [2] : _executionDelay (uint32): 75600
Arg [3] : _validators (address[]): 0x3527439923a63F8C13CF72b8Fe80a77f6e572092,0x0D3250c3D5FAcb74Ac15834096397a3Ef790ec99

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000b622a2061eaccae1c664ebc3e868b8438e03f61
Arg [1] : 00000000000000000000000032400084c286cf3e17e7b677ea9583e60a000324
Arg [2] : 0000000000000000000000000000000000000000000000000000000000012750
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [5] : 0000000000000000000000003527439923a63f8c13cf72b8fe80a77f6e572092
Arg [6] : 0000000000000000000000000d3250c3d5facb74ac15834096397a3ef790ec99


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.