Skip to main content

Release Notes

Find out all you need to know about the latest Linea versions.

Alpha v2 Release Notesโ€‹

NetworkTarget Release Date
MainnetFebruary 8th, 2024
TestnetJanuary 24, 2024

Summaryโ€‹

This release focuses on reducing L1 costs, enabling lower prices for end users.

Primarily, the L1 costs are driven by the following:

  • Proof verification, which is essentially a fixed cost for every batch submission.

  • Hashing the batch submission data to produce the public input of the Plonk verifier.

  • Calldata costs, driven by the size of the batch submission data. This includes all the transaction data from L2, as well as messaging data (one hash per L2 to L1 message).

Featuresโ€‹

To decrease L1 costs, we implemented the following features:

  • Proof aggregation:
    • This allows us to create a set of proofs for conflated batches and generates an aggregated proof that verifies that all the proofs are correct. Since it takes the same amount of gas to verify an aggregated proof vs. a proof for a single batch of conflated blocks, the average cost of verifying a proof aggregating N proofs is N times cheaper.
  • Data compression:
    • This reduces the call data cost on L1 by compressing L2 block data. (Post EIP-4844 this will be stored in blobs)
  • Switched L2 to L1 messaging anchoring from individual hashes to Merkle trees:
    • Due to the size of the Merkle trees (32 messages) requiring only one Merkle root to be anchored, there is a 32x calldata size reduction for message hashes

Breaking changesโ€‹

Message claiming

  • Parties claiming messages on Layer 1 will need to adjust claiming behavior to account for Merkle Proof generation requests and their submission when claiming a message. This applies to messages sent post upgrading. Pre-existing messages must be claimed with the current approach.
Note

If you are using the Linea Bridge UI, then this is already done for you. If you are a partner/user who manages their claiming outside of the Bridge UI, then we recommend looking at the updated SDK.

Finalization events

  • After migration to the new finalization mechanism, the rollup contract will no longer emit finalization events per block, but will instead emit events for data submission as well as an event indicating the current point of finalization.
    • The calldata will contain only the final block state root hash and final block number.
Note

This is a breaking change for consumers listening to the existing events. The BlockFinalized event will be replaced by the DataFinalized event.

EventDescriptionStatus
DataFinalized

Emitted at the end of finalization - used to indicate range of finalization

New

BlockFinalized

Deprecated finalization event - indicator that each block has been finalized.

Old

Summary Release Notes (June - October)โ€‹

Performance Improvementsโ€‹

  • Changes to the Genesis File: We made changes to the genesis file to enable block times to be reduced. This enhancement improves the overall performance and throughput of Linea.

  • Improved Gas Limit Estimation for Finalization on L1: We improved the gas limit estimation for finalization on L1.

Cost Efficiencyโ€‹

  • We updated the L1 message service contract to work with the Merkle tree, reducing gas costs and further enhancing the cost-effectiveness of Linea.

  • We added a fixed cost to the gas price to cover infrastructure costs for system economic sustainability. This change ensures the long-term financial viability of Linea.

User Experienceโ€‹

  • We smoothed the L2 gas price estimation by using an L1 moving average. This update makes our gas price estimation more accurate and reliable.

Linea Alpha v0.2.3 (June 22, 2023)โ€‹

Summaryโ€‹

This release focuses on optimizing the prover's hashing strategy to increase its computational efficiency.

Linea Alpha v0.2.2 (June 20, 2023)โ€‹

Summaryโ€‹

This release focuses on updating the Postman SDK configuration values and revising gas fee calculations.

Featuresโ€‹

  • Updated the Postman SDK configuration files to handle messages that are contract calls with zero ETH value being transferred and revised gas fee calculations.

Linea Alpha v0.2.1 (June 15, 2023)โ€‹

Summaryโ€‹

This release reduces the gas cost of submitting a batch of transactions on L1 by optimizing L2 logs in the calldata that is sent to L1.

Featuresโ€‹

  • Instead of sending the entire event MessageSent, we only send the _messageHash field of the event.

  • Old calldata for L2 originated event:

    //		event MessageSent(
    // address indexed _from,
    // address indexed _to,
    // uint256 _fee,
    // uint256 _value,
    // uint256 _salt,
    // bytes _calldata,
    // bytes32 _messageHash
    // );
  • New calldata for L2 originated event:

      //			bytes32 _messageHash

Linea Alpha v0.2.0 (June 13, 2023)โ€‹

Summaryโ€‹

This release focuses on testing a substantial architecture upgrade in preparation for Mainnet launch. It contains multiple improvements and breaking changes, specifically around the messaging layer which is changed to a push model. It also improves EVM prover coverage, and provides batch conflation.

Featuresโ€‹

  • Add Batch Conflation feature to the sequencer to minimize L1 transactions cost.
    • With Batch Conflation, L2 blocks' proofs that should have been independent are instead merged together. Therefore, L1 costs for these blocksโ€™ proofs are divided by the number of merged blocks.
  • Improve the following smart contracts:
    • Rollup zkEVM: Upgrade the rollup main contract with support for
      • Conflation
      • Security Council management
      • Verifier
      • Messaging Service
        • Changed the message service model by splitting the delivery into anchoring and claiming of messages to allow more flexible workflows, remove the mandatory fee for L1โ†’L2, reduce the mandatory fee for L2โ†’L1
    • Canonical Token Bridge: Upgrade from 1-1 ERC-20 basic token bridge to N-N ERC-20 canonical token bridge with reservation and token registry
  • Add Postman Service for message execution
    • The Postman Service is Lineaโ€™s off-chain message delivery service. Itโ€™s decentralized, permissionless, and used to claim messages once the protocol has anchored the message hashes. The first release will only contain the following scenarios:
      • DApps/protocols operating the SDK (to be released) claiming messages and paying for gas
        • The protocol can filter messages based on origin or destination smart-contracts
      • Linea operating the SDK for dApps/Protocols that arenโ€™t yet integrated
    • If messages donโ€™t get delivered by the postman, the message can be manually claimed by calling claimMessage with the MessageSent event parameters or by using the SDK.
  • Update prover to integrate with the new architecture and support Batch Conflation

Breaking changesโ€‹

Message bridge

  • Bridging partners will need to listen to different events. Modifications to the events are seen below:

    EventDescription
    L1MessageClaimedWhen a message is claimed
    L1L1L2MessagesReceivedOnL2

    Message hashes have been anchored on L2 and the zkRollup updates the L1 statuses - Includes multiple message hashes

    L1L2L1MessageHashAddedToInbox

    The L2 message hash has been anchored on L1 and can be claimed on block finalization.

    L2MessageSentEmitted when a message is sent
    L2MessageClaimedEmitted when a message is claimed
    L2L1L2MessageHashesAddedToInbox

    L1โ†’L2 message hash has been anchored on L2 and can be claimed on block finalization.

  • The anchoring and execution (claim) process has been separated into 2 steps. The deadline concept has been completely removed.

note

Contracts audit is in progress. This does not reflect final versions.

  • L1 (Goerli):

    • Bridging partners, to send messages, will need to call the new contract address with a different ABI.

      zkEVM2.abi
      [
      {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
      },
      {
      "inputs": [],
      "name": "BlockTimestampError",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "EmptyBlock",
      "type": "error"
      },
      {
      "inputs": [
      {
      "internalType": "address",
      "name": "recipient",
      "type": "address"
      }
      ],
      "name": "FeePaymentFailed",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "FeeTooLow",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "InvalidProof",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "InvalidProofType",
      "type": "error"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "pauseType",
      "type": "bytes32"
      }
      ],
      "name": "IsPaused",
      "type": "error"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "messageHash",
      "type": "bytes32"
      }
      ],
      "name": "L1L2MessageNotSent",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "LimitIsZero",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "MessageAlreadyClaimed",
      "type": "error"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "messageHash",
      "type": "bytes32"
      }
      ],
      "name": "MessageAlreadyReceived",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "MessageAlreadySent",
      "type": "error"
      },
      {
      "inputs": [
      {
      "internalType": "address",
      "name": "destination",
      "type": "address"
      }
      ],
      "name": "MessageSendingFailed",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "PeriodIsZero",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "ProofIsEmpty",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "RateLimitExceeded",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "StartingRootHashDoesNotMatch",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "ValueSentTooLow",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "ValueShouldBeGreaterThanFee",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "ZeroAddressNotAllowed",
      "type": "error"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "address",
      "name": "resettingAddress",
      "type": "address"
      }
      ],
      "name": "AmountUsedInPeriodReset",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "uint256",
      "name": "blockNumber",
      "type": "uint256"
      },
      {
      "indexed": false,
      "internalType": "bytes32",
      "name": "stateRootHash",
      "type": "bytes32"
      }
      ],
      "name": "BlockFinalized",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "uint256",
      "name": "lastBlockFinalized",
      "type": "uint256"
      },
      {
      "indexed": false,
      "internalType": "bytes32",
      "name": "startingRootHash",
      "type": "bytes32"
      },
      {
      "indexed": false,
      "internalType": "bytes32",
      "name": "finalRootHash",
      "type": "bytes32"
      }
      ],
      "name": "BlocksVerificationDone",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": false,
      "internalType": "uint8",
      "name": "version",
      "type": "uint8"
      }
      ],
      "name": "Initialized",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "messageHash",
      "type": "bytes32"
      }
      ],
      "name": "L1L2MessageHashAddedToOutbox",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": false,
      "internalType": "bytes32[]",
      "name": "messageHashes",
      "type": "bytes32[]"
      }
      ],
      "name": "L1L2MessagesReceivedOnL2",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "messageHash",
      "type": "bytes32"
      }
      ],
      "name": "L2L1MessageClaimed",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "messageHash",
      "type": "bytes32"
      }
      ],
      "name": "L2L1MessageHashAddedToInbox",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "address",
      "name": "amountChangeBy",
      "type": "address"
      },
      {
      "indexed": false,
      "internalType": "uint256",
      "name": "amount",
      "type": "uint256"
      },
      {
      "indexed": false,
      "internalType": "bool",
      "name": "amountUsedLoweredToLimit",
      "type": "bool"
      }
      ],
      "name": "LimitAmountChange",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "_messageHash",
      "type": "bytes32"
      }
      ],
      "name": "MessageClaimed",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "address",
      "name": "_from",
      "type": "address"
      },
      {
      "indexed": true,
      "internalType": "address",
      "name": "_to",
      "type": "address"
      },
      {
      "indexed": false,
      "internalType": "uint256",
      "name": "_fee",
      "type": "uint256"
      },
      {
      "indexed": false,
      "internalType": "uint256",
      "name": "_value",
      "type": "uint256"
      },
      {
      "indexed": false,
      "internalType": "uint256",
      "name": "_nonce",
      "type": "uint256"
      },
      {
      "indexed": false,
      "internalType": "bytes",
      "name": "_calldata",
      "type": "bytes"
      },
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "_messageHash",
      "type": "bytes32"
      }
      ],
      "name": "MessageSent",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": false,
      "internalType": "address",
      "name": "messageSender",
      "type": "address"
      },
      {
      "indexed": false,
      "internalType": "bytes32",
      "name": "pauseType",
      "type": "bytes32"
      }
      ],
      "name": "Paused",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "previousAdminRole",
      "type": "bytes32"
      },
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "newAdminRole",
      "type": "bytes32"
      }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "indexed": true,
      "internalType": "address",
      "name": "account",
      "type": "address"
      },
      {
      "indexed": true,
      "internalType": "address",
      "name": "sender",
      "type": "address"
      }
      ],
      "name": "RoleGranted",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "indexed": true,
      "internalType": "address",
      "name": "account",
      "type": "address"
      },
      {
      "indexed": true,
      "internalType": "address",
      "name": "sender",
      "type": "address"
      }
      ],
      "name": "RoleRevoked",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": false,
      "internalType": "address",
      "name": "messageSender",
      "type": "address"
      },
      {
      "indexed": false,
      "internalType": "bytes32",
      "name": "pauseType",
      "type": "bytes32"
      }
      ],
      "name": "UnPaused",
      "type": "event"
      },
      {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "GENERAL_PAUSE_TYPE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "INBOX_STATUS_RECEIVED",
      "outputs": [
      {
      "internalType": "uint8",
      "name": "",
      "type": "uint8"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "INBOX_STATUS_UNKNOWN",
      "outputs": [
      {
      "internalType": "uint8",
      "name": "",
      "type": "uint8"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "L1_L2_PAUSE_TYPE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "L2_L1_PAUSE_TYPE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "OUTBOX_STATUS_RECEIVED",
      "outputs": [
      {
      "internalType": "uint8",
      "name": "",
      "type": "uint8"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "OUTBOX_STATUS_SENT",
      "outputs": [
      {
      "internalType": "uint8",
      "name": "",
      "type": "uint8"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "OUTBOX_STATUS_UNKNOWN",
      "outputs": [
      {
      "internalType": "uint8",
      "name": "",
      "type": "uint8"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "PAUSE_MANAGER_ROLE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "PROVING_SYSTEM_PAUSE_TYPE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "RATE_LIMIT_SETTER_ROLE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "address",
      "name": "_limitManagerAddress",
      "type": "address"
      },
      {
      "internalType": "address",
      "name": "_pauseManagerAddress",
      "type": "address"
      },
      {
      "internalType": "uint256",
      "name": "_rateLimitPeriod",
      "type": "uint256"
      },
      {
      "internalType": "uint256",
      "name": "_rateLimitAmount",
      "type": "uint256"
      }
      ],
      "name": "__MessageService_init",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "address",
      "name": "_from",
      "type": "address"
      },
      {
      "internalType": "address",
      "name": "_to",
      "type": "address"
      },
      {
      "internalType": "uint256",
      "name": "_fee",
      "type": "uint256"
      },
      {
      "internalType": "uint256",
      "name": "_value",
      "type": "uint256"
      },
      {
      "internalType": "address payable",
      "name": "_feeRecipient",
      "type": "address"
      },
      {
      "internalType": "bytes",
      "name": "_calldata",
      "type": "bytes"
      },
      {
      "internalType": "uint256",
      "name": "_nonce",
      "type": "uint256"
      }
      ],
      "name": "claimMessage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "currentL2BlockNumber",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "currentPeriodAmountInWei",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "currentPeriodEnd",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "currentTimestamp",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "components": [
      {
      "internalType": "bytes32",
      "name": "blockRootHash",
      "type": "bytes32"
      },
      {
      "internalType": "uint32",
      "name": "l2BlockTimestamp",
      "type": "uint32"
      },
      {
      "internalType": "bytes[]",
      "name": "transactions",
      "type": "bytes[]"
      },
      {
      "internalType": "bytes[]",
      "name": "l2l1logs",
      "type": "bytes[]"
      },
      {
      "internalType": "uint16[]",
      "name": "batchReceptionIndices",
      "type": "uint16[]"
      }
      ],
      "internalType": "struct IZkEvmV2.BlockData[]",
      "name": "_blocksData",
      "type": "tuple[]"
      },
      {
      "internalType": "bytes",
      "name": "_proof",
      "type": "bytes"
      },
      {
      "internalType": "uint256",
      "name": "_proofType",
      "type": "uint256"
      },
      {
      "internalType": "bytes32",
      "name": "_parentStateRootHash",
      "type": "bytes32"
      }
      ],
      "name": "finalizeBlocks",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "components": [
      {
      "internalType": "bytes32",
      "name": "blockRootHash",
      "type": "bytes32"
      },
      {
      "internalType": "uint32",
      "name": "l2BlockTimestamp",
      "type": "uint32"
      },
      {
      "internalType": "bytes[]",
      "name": "transactions",
      "type": "bytes[]"
      },
      {
      "internalType": "bytes[]",
      "name": "l2l1logs",
      "type": "bytes[]"
      },
      {
      "internalType": "uint16[]",
      "name": "batchReceptionIndices",
      "type": "uint16[]"
      }
      ],
      "internalType": "struct IZkEvmV2.BlockData[]",
      "name": "_blocksData",
      "type": "tuple[]"
      }
      ],
      "name": "finalizeBlocksWithoutProof",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      }
      ],
      "name": "getRoleAdmin",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "internalType": "address",
      "name": "account",
      "type": "address"
      }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "internalType": "address",
      "name": "account",
      "type": "address"
      }
      ],
      "name": "hasRole",
      "outputs": [
      {
      "internalType": "bool",
      "name": "",
      "type": "bool"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "name": "inboxL2L1MessageStatus",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "_initialStateRootHash",
      "type": "bytes32"
      },
      {
      "internalType": "uint256",
      "name": "_initialL2BlockNumber",
      "type": "uint256"
      },
      {
      "internalType": "address",
      "name": "_defaultVerifier",
      "type": "address"
      },
      {
      "internalType": "address",
      "name": "_securityCouncil",
      "type": "address"
      },
      {
      "internalType": "address[]",
      "name": "_operators",
      "type": "address[]"
      },
      {
      "internalType": "uint256",
      "name": "_rateLimitPeriodInSeconds",
      "type": "uint256"
      },
      {
      "internalType": "uint256",
      "name": "_rateLimitAmountInWei",
      "type": "uint256"
      }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "limitInWei",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "nextMessageNumber",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "name": "outboxL1L2MessageStatus",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "_pauseType",
      "type": "bytes32"
      }
      ],
      "name": "pauseByType",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "name": "pauseTypeStatuses",
      "outputs": [
      {
      "internalType": "bool",
      "name": "",
      "type": "bool"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "periodInSeconds",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "internalType": "address",
      "name": "account",
      "type": "address"
      }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "resetAmountUsedInPeriod",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "uint256",
      "name": "_amount",
      "type": "uint256"
      }
      ],
      "name": "resetRateLimitAmount",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "internalType": "address",
      "name": "account",
      "type": "address"
      }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "address",
      "name": "_to",
      "type": "address"
      },
      {
      "internalType": "uint256",
      "name": "_fee",
      "type": "uint256"
      },
      {
      "internalType": "bytes",
      "name": "_calldata",
      "type": "bytes"
      }
      ],
      "name": "sendMessage",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "sender",
      "outputs": [
      {
      "internalType": "address",
      "name": "",
      "type": "address"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "address",
      "name": "_newVerifierAddress",
      "type": "address"
      },
      {
      "internalType": "uint256",
      "name": "_proofType",
      "type": "uint256"
      }
      ],
      "name": "setVerifierAddress",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "name": "stateRootHashes",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes4",
      "name": "interfaceId",
      "type": "bytes4"
      }
      ],
      "name": "supportsInterface",
      "outputs": [
      {
      "internalType": "bool",
      "name": "",
      "type": "bool"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "_pauseType",
      "type": "bytes32"
      }
      ],
      "name": "unPauseByType",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "name": "verifiers",
      "outputs": [
      {
      "internalType": "address",
      "name": "",
      "type": "address"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "stateMutability": "payable",
      "type": "receive"
      }
      ]
    • Contracts:

  • L2 (Linea):

    • Bridging partners, to send messages, will need to call the new contract address with a different ABI.

      L2MessageService.abi
      [
      {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
      },
      {
      "inputs": [],
      "name": "EmptyMessageHashesArray",
      "type": "error"
      },
      {
      "inputs": [
      {
      "internalType": "address",
      "name": "recipient",
      "type": "address"
      }
      ],
      "name": "FeePaymentFailed",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "FeeTooLow",
      "type": "error"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "pauseType",
      "type": "bytes32"
      }
      ],
      "name": "IsPaused",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "LimitIsZero",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "MessageAlreadyClaimed",
      "type": "error"
      },
      {
      "inputs": [
      {
      "internalType": "uint256",
      "name": "length",
      "type": "uint256"
      }
      ],
      "name": "MessageHashesListLengthHigherThanOneHundred",
      "type": "error"
      },
      {
      "inputs": [
      {
      "internalType": "address",
      "name": "destination",
      "type": "address"
      }
      ],
      "name": "MessageSendingFailed",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "PeriodIsZero",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "RateLimitExceeded",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "ValueSentTooLow",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "ValueShouldBeGreaterThanFee",
      "type": "error"
      },
      {
      "inputs": [],
      "name": "ZeroAddressNotAllowed",
      "type": "error"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "address",
      "name": "resettingAddress",
      "type": "address"
      }
      ],
      "name": "AmountUsedInPeriodReset",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": false,
      "internalType": "uint8",
      "name": "version",
      "type": "uint8"
      }
      ],
      "name": "Initialized",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "messageHash",
      "type": "bytes32"
      }
      ],
      "name": "L1L2MessageClaimed",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": false,
      "internalType": "bytes32[]",
      "name": "messageHashes",
      "type": "bytes32[]"
      }
      ],
      "name": "L1L2MessageHashesAddedToInbox",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "address",
      "name": "amountChangeBy",
      "type": "address"
      },
      {
      "indexed": false,
      "internalType": "uint256",
      "name": "amount",
      "type": "uint256"
      },
      {
      "indexed": false,
      "internalType": "bool",
      "name": "amountUsedLoweredToLimit",
      "type": "bool"
      }
      ],
      "name": "LimitAmountChange",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "_messageHash",
      "type": "bytes32"
      }
      ],
      "name": "MessageClaimed",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "address",
      "name": "_from",
      "type": "address"
      },
      {
      "indexed": true,
      "internalType": "address",
      "name": "_to",
      "type": "address"
      },
      {
      "indexed": false,
      "internalType": "uint256",
      "name": "_fee",
      "type": "uint256"
      },
      {
      "indexed": false,
      "internalType": "uint256",
      "name": "_value",
      "type": "uint256"
      },
      {
      "indexed": false,
      "internalType": "uint256",
      "name": "_nonce",
      "type": "uint256"
      },
      {
      "indexed": false,
      "internalType": "bytes",
      "name": "_calldata",
      "type": "bytes"
      },
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "_messageHash",
      "type": "bytes32"
      }
      ],
      "name": "MessageSent",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": false,
      "internalType": "address",
      "name": "messageSender",
      "type": "address"
      },
      {
      "indexed": false,
      "internalType": "bytes32",
      "name": "pauseType",
      "type": "bytes32"
      }
      ],
      "name": "Paused",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "previousAdminRole",
      "type": "bytes32"
      },
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "newAdminRole",
      "type": "bytes32"
      }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "indexed": true,
      "internalType": "address",
      "name": "account",
      "type": "address"
      },
      {
      "indexed": true,
      "internalType": "address",
      "name": "sender",
      "type": "address"
      }
      ],
      "name": "RoleGranted",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": true,
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "indexed": true,
      "internalType": "address",
      "name": "account",
      "type": "address"
      },
      {
      "indexed": true,
      "internalType": "address",
      "name": "sender",
      "type": "address"
      }
      ],
      "name": "RoleRevoked",
      "type": "event"
      },
      {
      "anonymous": false,
      "inputs": [
      {
      "indexed": false,
      "internalType": "address",
      "name": "messageSender",
      "type": "address"
      },
      {
      "indexed": false,
      "internalType": "bytes32",
      "name": "pauseType",
      "type": "bytes32"
      }
      ],
      "name": "UnPaused",
      "type": "event"
      },
      {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "GENERAL_PAUSE_TYPE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "INBOX_STATUS_CLAIMED",
      "outputs": [
      {
      "internalType": "uint8",
      "name": "",
      "type": "uint8"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "INBOX_STATUS_RECEIVED",
      "outputs": [
      {
      "internalType": "uint8",
      "name": "",
      "type": "uint8"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "INBOX_STATUS_UNKNOWN",
      "outputs": [
      {
      "internalType": "uint8",
      "name": "",
      "type": "uint8"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "L1_L2_MESSAGE_SETTER_ROLE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "L1_L2_PAUSE_TYPE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "L2_L1_PAUSE_TYPE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "MINIMUM_FEE_SETTER_ROLE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "PAUSE_MANAGER_ROLE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "PROVING_SYSTEM_PAUSE_TYPE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "RATE_LIMIT_SETTER_ROLE",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "address",
      "name": "_l1l2MessageSetter",
      "type": "address"
      }
      ],
      "name": "__L2MessageManager_init",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32[]",
      "name": "_messageHashes",
      "type": "bytes32[]"
      }
      ],
      "name": "addL1L2MessageHashes",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "address",
      "name": "_from",
      "type": "address"
      },
      {
      "internalType": "address",
      "name": "_to",
      "type": "address"
      },
      {
      "internalType": "uint256",
      "name": "_fee",
      "type": "uint256"
      },
      {
      "internalType": "uint256",
      "name": "_value",
      "type": "uint256"
      },
      {
      "internalType": "address payable",
      "name": "_feeRecipient",
      "type": "address"
      },
      {
      "internalType": "bytes",
      "name": "_calldata",
      "type": "bytes"
      },
      {
      "internalType": "uint256",
      "name": "_nonce",
      "type": "uint256"
      }
      ],
      "name": "claimMessage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "currentPeriodAmountInWei",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "currentPeriodEnd",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      }
      ],
      "name": "getRoleAdmin",
      "outputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "internalType": "address",
      "name": "account",
      "type": "address"
      }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "internalType": "address",
      "name": "account",
      "type": "address"
      }
      ],
      "name": "hasRole",
      "outputs": [
      {
      "internalType": "bool",
      "name": "",
      "type": "bool"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "name": "inboxL1L2MessageStatus",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "address",
      "name": "_securityCouncil",
      "type": "address"
      },
      {
      "internalType": "address",
      "name": "_l1l2MessageSetter",
      "type": "address"
      },
      {
      "internalType": "uint256",
      "name": "_rateLimitPeriod",
      "type": "uint256"
      },
      {
      "internalType": "uint256",
      "name": "_rateLimitAmount",
      "type": "uint256"
      }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "limitInWei",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "minimumFee",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "nextMessageNumber",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "_pauseType",
      "type": "bytes32"
      }
      ],
      "name": "pauseByType",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "",
      "type": "bytes32"
      }
      ],
      "name": "pauseTypeStatuses",
      "outputs": [
      {
      "internalType": "bool",
      "name": "",
      "type": "bool"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "periodInSeconds",
      "outputs": [
      {
      "internalType": "uint256",
      "name": "",
      "type": "uint256"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "internalType": "address",
      "name": "account",
      "type": "address"
      }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "resetAmountUsedInPeriod",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "uint256",
      "name": "_amount",
      "type": "uint256"
      }
      ],
      "name": "resetRateLimitAmount",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "role",
      "type": "bytes32"
      },
      {
      "internalType": "address",
      "name": "account",
      "type": "address"
      }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "address",
      "name": "_to",
      "type": "address"
      },
      {
      "internalType": "uint256",
      "name": "_fee",
      "type": "uint256"
      },
      {
      "internalType": "bytes",
      "name": "_calldata",
      "type": "bytes"
      }
      ],
      "name": "sendMessage",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
      },
      {
      "inputs": [],
      "name": "sender",
      "outputs": [
      {
      "internalType": "address",
      "name": "",
      "type": "address"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "uint256",
      "name": "_fee",
      "type": "uint256"
      }
      ],
      "name": "setMinimumFee",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes4",
      "name": "interfaceId",
      "type": "bytes4"
      }
      ],
      "name": "supportsInterface",
      "outputs": [
      {
      "internalType": "bool",
      "name": "",
      "type": "bool"
      }
      ],
      "stateMutability": "view",
      "type": "function"
      },
      {
      "inputs": [
      {
      "internalType": "bytes32",
      "name": "_pauseType",
      "type": "bytes32"
      }
      ],
      "name": "unPauseByType",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
      },
      {
      "stateMutability": "payable",
      "type": "receive"
      }
      ]
    • Contracts

  • Bridging partners, before sending messages on L2, need to retrieve the service protection fee before sending messages and include it in the value sent.

Canonical Token Bridge

Major changes are applied to the Canonical Token Bridge as described in our documentation.

  • L1 (Goerli)

    TokenBridge.abi
    [
    {
    "inputs": [],
    "stateMutability": "nonpayable",
    "type": "constructor"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "AlreadyBridgedToken",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "bytes4",
    "name": "permitData",
    "type": "bytes4"
    },
    {
    "internalType": "bytes32",
    "name": "permitSelector",
    "type": "bytes32"
    }
    ],
    "name": "InvalidPermitData",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "sender",
    "type": "address"
    },
    {
    "internalType": "address",
    "name": "tokenBridge",
    "type": "address"
    }
    ],
    "name": "NotFromRemoteTokenBridge",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "sender",
    "type": "address"
    },
    {
    "internalType": "address",
    "name": "messageService",
    "type": "address"
    }
    ],
    "name": "NotMessagingService",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "NotReserved",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "spender",
    "type": "address"
    }
    ],
    "name": "PermitNotAllowingBridge",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "owner",
    "type": "address"
    }
    ],
    "name": "PermitNotFromSender",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "remoteTokenBridge",
    "type": "address"
    }
    ],
    "name": "RemoteTokenBridgeAlreadySet",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "ReservedToken",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "TokenNotDeployed",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "addr",
    "type": "address"
    }
    ],
    "name": "ZeroAddressNotAllowed",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "uint256",
    "name": "amount",
    "type": "uint256"
    }
    ],
    "name": "ZeroAmountNotAllowed",
    "type": "error"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "nativeToken",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "bridgedToken",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "uint256",
    "name": "amount",
    "type": "uint256"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "recipient",
    "type": "address"
    }
    ],
    "name": "BridgingFinalized",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "sender",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "recipient",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "token",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "uint256",
    "name": "amount",
    "type": "uint256"
    }
    ],
    "name": "BridgingInitiated",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "nativeToken",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "customContract",
    "type": "address"
    }
    ],
    "name": "CustomContractSet",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address[]",
    "name": "tokens",
    "type": "address[]"
    }
    ],
    "name": "DeploymentConfirmed",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "uint8",
    "name": "version",
    "type": "uint8"
    }
    ],
    "name": "Initialized",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "NewToken",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "bridgedToken",
    "type": "address"
    }
    ],
    "name": "NewTokenDeployed",
    "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": "account",
    "type": "address"
    }
    ],
    "name": "Paused",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "remoteTokenBridge",
    "type": "address"
    }
    ],
    "name": "RemoteTokenBridgeSet",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "TokenDeployed",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "TokenReserved",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "account",
    "type": "address"
    }
    ],
    "name": "Unpaused",
    "type": "event"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_token",
    "type": "address"
    },
    {
    "internalType": "uint256",
    "name": "_amount",
    "type": "uint256"
    },
    {
    "internalType": "address",
    "name": "_recipient",
    "type": "address"
    }
    ],
    "name": "bridgeToken",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_token",
    "type": "address"
    },
    {
    "internalType": "uint256",
    "name": "_amount",
    "type": "uint256"
    },
    {
    "internalType": "address",
    "name": "_recipient",
    "type": "address"
    },
    {
    "internalType": "bytes",
    "name": "_permitData",
    "type": "bytes"
    }
    ],
    "name": "bridgeTokenWithPermit",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "name": "bridgedToNativeToken",
    "outputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_nativeToken",
    "type": "address"
    },
    {
    "internalType": "uint256",
    "name": "_amount",
    "type": "uint256"
    },
    {
    "internalType": "address",
    "name": "_recipient",
    "type": "address"
    },
    {
    "internalType": "bytes",
    "name": "_tokenMetadata",
    "type": "bytes"
    }
    ],
    "name": "completeBridging",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address[]",
    "name": "_tokens",
    "type": "address[]"
    }
    ],
    "name": "confirmDeployment",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_securityCouncil",
    "type": "address"
    },
    {
    "internalType": "address",
    "name": "_messageService",
    "type": "address"
    },
    {
    "internalType": "address",
    "name": "_tokenBeacon",
    "type": "address"
    },
    {
    "internalType": "address[]",
    "name": "_reservedTokens",
    "type": "address[]"
    }
    ],
    "name": "initialize",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "messageService",
    "outputs": [
    {
    "internalType": "contract IMessageService",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "name": "nativeToBridgedToken",
    "outputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "owner",
    "outputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "pause",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "paused",
    "outputs": [
    {
    "internalType": "bool",
    "name": "",
    "type": "bool"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "remoteTokenBridge",
    "outputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_token",
    "type": "address"
    }
    ],
    "name": "removeReserved",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "renounceOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_nativeToken",
    "type": "address"
    },
    {
    "internalType": "address",
    "name": "_targetContract",
    "type": "address"
    }
    ],
    "name": "setCustomContract",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address[]",
    "name": "_nativeTokens",
    "type": "address[]"
    }
    ],
    "name": "setDeployed",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_messageService",
    "type": "address"
    }
    ],
    "name": "setMessageService",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_remoteTokenBridge",
    "type": "address"
    }
    ],
    "name": "setRemoteTokenBridge",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_token",
    "type": "address"
    }
    ],
    "name": "setReserved",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "tokenBeacon",
    "outputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "newOwner",
    "type": "address"
    }
    ],
    "name": "transferOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "unpause",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    }
    ]
  • L2 (Linea)

    TokenBridge.abi
    [
    {
    "inputs": [],
    "stateMutability": "nonpayable",
    "type": "constructor"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "AlreadyBridgedToken",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "bytes4",
    "name": "permitData",
    "type": "bytes4"
    },
    {
    "internalType": "bytes32",
    "name": "permitSelector",
    "type": "bytes32"
    }
    ],
    "name": "InvalidPermitData",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "sender",
    "type": "address"
    },
    {
    "internalType": "address",
    "name": "tokenBridge",
    "type": "address"
    }
    ],
    "name": "NotFromRemoteTokenBridge",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "sender",
    "type": "address"
    },
    {
    "internalType": "address",
    "name": "messageService",
    "type": "address"
    }
    ],
    "name": "NotMessagingService",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "NotReserved",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "spender",
    "type": "address"
    }
    ],
    "name": "PermitNotAllowingBridge",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "owner",
    "type": "address"
    }
    ],
    "name": "PermitNotFromSender",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "remoteTokenBridge",
    "type": "address"
    }
    ],
    "name": "RemoteTokenBridgeAlreadySet",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "ReservedToken",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "TokenNotDeployed",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "addr",
    "type": "address"
    }
    ],
    "name": "ZeroAddressNotAllowed",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "uint256",
    "name": "amount",
    "type": "uint256"
    }
    ],
    "name": "ZeroAmountNotAllowed",
    "type": "error"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "nativeToken",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "bridgedToken",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "uint256",
    "name": "amount",
    "type": "uint256"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "recipient",
    "type": "address"
    }
    ],
    "name": "BridgingFinalized",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "sender",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "recipient",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "token",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "uint256",
    "name": "amount",
    "type": "uint256"
    }
    ],
    "name": "BridgingInitiated",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "nativeToken",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "customContract",
    "type": "address"
    }
    ],
    "name": "CustomContractSet",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address[]",
    "name": "tokens",
    "type": "address[]"
    }
    ],
    "name": "DeploymentConfirmed",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "uint8",
    "name": "version",
    "type": "uint8"
    }
    ],
    "name": "Initialized",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "NewToken",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "bridgedToken",
    "type": "address"
    }
    ],
    "name": "NewTokenDeployed",
    "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": "account",
    "type": "address"
    }
    ],
    "name": "Paused",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "remoteTokenBridge",
    "type": "address"
    }
    ],
    "name": "RemoteTokenBridgeSet",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "TokenDeployed",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "TokenReserved",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "account",
    "type": "address"
    }
    ],
    "name": "Unpaused",
    "type": "event"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_token",
    "type": "address"
    },
    {
    "internalType": "uint256",
    "name": "_amount",
    "type": "uint256"
    },
    {
    "internalType": "address",
    "name": "_recipient",
    "type": "address"
    }
    ],
    "name": "bridgeToken",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_token",
    "type": "address"
    },
    {
    "internalType": "uint256",
    "name": "_amount",
    "type": "uint256"
    },
    {
    "internalType": "address",
    "name": "_recipient",
    "type": "address"
    },
    {
    "internalType": "bytes",
    "name": "_permitData",
    "type": "bytes"
    }
    ],
    "name": "bridgeTokenWithPermit",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "name": "bridgedToNativeToken",
    "outputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_nativeToken",
    "type": "address"
    },
    {
    "internalType": "uint256",
    "name": "_amount",
    "type": "uint256"
    },
    {
    "internalType": "address",
    "name": "_recipient",
    "type": "address"
    },
    {
    "internalType": "bytes",
    "name": "_tokenMetadata",
    "type": "bytes"
    }
    ],
    "name": "completeBridging",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address[]",
    "name": "_tokens",
    "type": "address[]"
    }
    ],
    "name": "confirmDeployment",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_securityCouncil",
    "type": "address"
    },
    {
    "internalType": "address",
    "name": "_messageService",
    "type": "address"
    },
    {
    "internalType": "address",
    "name": "_tokenBeacon",
    "type": "address"
    },
    {
    "internalType": "address[]",
    "name": "_reservedTokens",
    "type": "address[]"
    }
    ],
    "name": "initialize",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "messageService",
    "outputs": [
    {
    "internalType": "contract IMessageService",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "name": "nativeToBridgedToken",
    "outputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "owner",
    "outputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "pause",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "paused",
    "outputs": [
    {
    "internalType": "bool",
    "name": "",
    "type": "bool"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "remoteTokenBridge",
    "outputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_token",
    "type": "address"
    }
    ],
    "name": "removeReserved",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "renounceOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_nativeToken",
    "type": "address"
    },
    {
    "internalType": "address",
    "name": "_targetContract",
    "type": "address"
    }
    ],
    "name": "setCustomContract",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address[]",
    "name": "_nativeTokens",
    "type": "address[]"
    }
    ],
    "name": "setDeployed",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_messageService",
    "type": "address"
    }
    ],
    "name": "setMessageService",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_remoteTokenBridge",
    "type": "address"
    }
    ],
    "name": "setRemoteTokenBridge",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "_token",
    "type": "address"
    }
    ],
    "name": "setReserved",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "tokenBeacon",
    "outputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "newOwner",
    "type": "address"
    }
    ],
    "name": "transferOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "inputs": [],
    "name": "unpause",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
    }
    ]

If you have any questions, please reach out in the Developer Support channel in our community forum!