Skip to main content

Canonical token bridge

The canonical token bridge is the pair of “lock & mint” contracts that allow bridging of any ERC-20 token. The bridge relies on the message service for cross-chain interactions.

The Linea team operates a UI for the official Linea bridge.

The canonical token bridge is optimized for technical partners who are deploying on Linea. We recommend that everyday users of Linea seeking to bridge their personal tokens between networks leverage one of the many bridges deployed to the network.

Linea seeks to foster a permissionless, resilient, decentralized environment — not to have our bridge be a centralized arbiter and point of failure.

To find out which bridges are currently operating on Linea, head to the ecosystem portal and click on the Bridge button to show all that are available.

Contracts

  • Ethereum Mainnet

    TokenBridge.abi
    [
    {
    "inputs": [

    ],
    "stateMutability": "nonpayable",
    "type": "constructor"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "AlreadyBridgedToken",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "AlreadyBrigedToNativeTokenSet",
    "type": "error"
    },
    {
    "inputs": [

    ],
    "name": "CallerIsNotMessageService",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "bytes4",
    "name": "permitData",
    "type": "bytes4"
    },
    {
    "internalType": "bytes4",
    "name": "permitSelector",
    "type": "bytes4"
    }
    ],
    "name": "InvalidPermitData",
    "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": [

    ],
    "name": "SenderNotAuthorized",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "StatusAddressNotAllowed",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "TokenNativeOnOtherLayer",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "TokenNotDeployed",
    "type": "error"
    },
    {
    "inputs": [

    ],
    "name": "ZeroAddressNotAllowed",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "uint256",
    "name": "amount",
    "type": "uint256"
    }
    ],
    "name": "ZeroAmountNotAllowed",
    "type": "error"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "nativeToken",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "bridgedToken",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "uint256",
    "name": "amount",
    "type": "uint256"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "recipient",
    "type": "address"
    }
    ],
    "name": "BridgingFinalized",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "sender",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "recipient",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "token",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "uint256",
    "name": "amount",
    "type": "uint256"
    }
    ],
    "name": "BridgingInitiated",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "nativeToken",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "customContract",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "setBy",
    "type": "address"
    }
    ],
    "name": "CustomContractSet",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address[]",
    "name": "tokens",
    "type": "address[]"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "confirmedBy",
    "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": true,
    "internalType": "address",
    "name": "newMessageService",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "oldMessageService",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "setBy",
    "type": "address"
    }
    ],
    "name": "MessageServiceUpdated",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "NewToken",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "bridgedToken",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "nativeToken",
    "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": "OwnershipTransferStarted",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "previousOwner",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "newOwner",
    "type": "address"
    }
    ],
    "name": "OwnershipTransferred",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "account",
    "type": "address"
    }
    ],
    "name": "Paused",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "remoteTokenBridge",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "setBy",
    "type": "address"
    }
    ],
    "name": "RemoteTokenBridgeSet",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "TokenDeployed",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "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": [

    ],
    "name": "acceptOwnership",
    "outputs": [

    ],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "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": "uint256",
    "name": "_chainId",
    "type": "uint256"
    },
    {
    "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": "uint256",
    "name": "_sourceChainId",
    "type": "uint256"
    },
    {
    "internalType": "uint256",
    "name": "_targetChainId",
    "type": "uint256"
    },
    {
    "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": "uint256",
    "name": "",
    "type": "uint256"
    },
    {
    "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": "pendingOwner",
    "outputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [

    ],
    "name": "remoteSender",
    "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": "sourceChainId",
    "outputs": [
    {
    "internalType": "uint256",
    "name": "",
    "type": "uint256"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [

    ],
    "name": "targetChainId",
    "outputs": [
    {
    "internalType": "uint256",
    "name": "",
    "type": "uint256"
    }
    ],
    "stateMutability": "view",
    "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"
    }
    ]
  • Linea Mainnet

    TokenBridge.abi
    [
    {
    "inputs": [

    ],
    "stateMutability": "nonpayable",
    "type": "constructor"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "AlreadyBridgedToken",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "AlreadyBrigedToNativeTokenSet",
    "type": "error"
    },
    {
    "inputs": [

    ],
    "name": "CallerIsNotMessageService",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "bytes4",
    "name": "permitData",
    "type": "bytes4"
    },
    {
    "internalType": "bytes4",
    "name": "permitSelector",
    "type": "bytes4"
    }
    ],
    "name": "InvalidPermitData",
    "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": [

    ],
    "name": "SenderNotAuthorized",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "StatusAddressNotAllowed",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "TokenNativeOnOtherLayer",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "TokenNotDeployed",
    "type": "error"
    },
    {
    "inputs": [

    ],
    "name": "ZeroAddressNotAllowed",
    "type": "error"
    },
    {
    "inputs": [
    {
    "internalType": "uint256",
    "name": "amount",
    "type": "uint256"
    }
    ],
    "name": "ZeroAmountNotAllowed",
    "type": "error"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "nativeToken",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "bridgedToken",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "uint256",
    "name": "amount",
    "type": "uint256"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "recipient",
    "type": "address"
    }
    ],
    "name": "BridgingFinalized",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "sender",
    "type": "address"
    },
    {
    "indexed": false,
    "internalType": "address",
    "name": "recipient",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "token",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "uint256",
    "name": "amount",
    "type": "uint256"
    }
    ],
    "name": "BridgingInitiated",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "nativeToken",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "customContract",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "setBy",
    "type": "address"
    }
    ],
    "name": "CustomContractSet",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address[]",
    "name": "tokens",
    "type": "address[]"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "confirmedBy",
    "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": true,
    "internalType": "address",
    "name": "newMessageService",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "oldMessageService",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "setBy",
    "type": "address"
    }
    ],
    "name": "MessageServiceUpdated",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "NewToken",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "bridgedToken",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "nativeToken",
    "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": "OwnershipTransferStarted",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "previousOwner",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "newOwner",
    "type": "address"
    }
    ],
    "name": "OwnershipTransferred",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": false,
    "internalType": "address",
    "name": "account",
    "type": "address"
    }
    ],
    "name": "Paused",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "remoteTokenBridge",
    "type": "address"
    },
    {
    "indexed": true,
    "internalType": "address",
    "name": "setBy",
    "type": "address"
    }
    ],
    "name": "RemoteTokenBridgeSet",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "internalType": "address",
    "name": "token",
    "type": "address"
    }
    ],
    "name": "TokenDeployed",
    "type": "event"
    },
    {
    "anonymous": false,
    "inputs": [
    {
    "indexed": true,
    "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": [

    ],
    "name": "acceptOwnership",
    "outputs": [

    ],
    "stateMutability": "nonpayable",
    "type": "function"
    },
    {
    "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": "uint256",
    "name": "_chainId",
    "type": "uint256"
    },
    {
    "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": "uint256",
    "name": "_sourceChainId",
    "type": "uint256"
    },
    {
    "internalType": "uint256",
    "name": "_targetChainId",
    "type": "uint256"
    },
    {
    "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": "uint256",
    "name": "",
    "type": "uint256"
    },
    {
    "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": "pendingOwner",
    "outputs": [
    {
    "internalType": "address",
    "name": "",
    "type": "address"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [

    ],
    "name": "remoteSender",
    "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": "sourceChainId",
    "outputs": [
    {
    "internalType": "uint256",
    "name": "",
    "type": "uint256"
    }
    ],
    "stateMutability": "view",
    "type": "function"
    },
    {
    "inputs": [

    ],
    "name": "targetChainId",
    "outputs": [
    {
    "internalType": "uint256",
    "name": "",
    "type": "uint256"
    }
    ],
    "stateMutability": "view",
    "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"
    }
    ]