Release notes
Find out all you need to know about the latest Linea versions.
Current network versions​
Network Version Deployment Date Linea Goerli Alpha v0.2.3 June 22, 2023 
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 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- Outer proof system moved from Groth16 to Plonk + custom gates to support efficient Fiat Shamir, c.f.: https://eprint.iacr.org/2022/1072.pdf section 6.2
 
- 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
 
- Rollup zkEVM: Upgrade the rollup main contract with support for
- 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
 
- DApps/protocols operating the SDK (to be released) claiming messages and paying for gas
- If messages don’t get delivered by the postman, the message can be manually claimed by calling claimMessagewith theMessageSentevent parameters or by using the SDK.
 
- 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:
- 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: - Event - Description - L1 - MessageClaimed- When a message is claimed - L1 - L1L2MessagesReceivedOnL2- Message hashes have been anchored on L2 and the zkRollup updates the L1 statuses - Includes multiple message hashes - L1 - L2L1MessageHashAddedToInbox- The L2 message hash has been anchored on L1 and can be claimed on block finalization. - L2 - MessageSent- Emitted when a message is sent - L2 - MessageClaimed- Emitted when a message is claimed - L2 - L1L2MessageHashesAddedToInbox- 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. 
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"
 }
 ]- Contracts
 
- 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"
 }
 ]- Contracts
 
If you have any questions, please reach out in the Developer Support channel in our community forum!