Skip to main content

Release notes

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

Current network versions​

NetworkVersionDeployment Date
Linea GoerliAlpha v0.2.0June 13, 2020

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 ERC20 basic token bridge to N-N ERC20 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
    L1L1L2MessagesReceivedOnL2Message hashes have been anchored on L2 and the zkRollup updates the L1 statuses - Includes multiple message hashes
    L1L2L1MessageHashAddedToInboxThe 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
    L2L1L2MessageHashesAddedToInboxL1→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!