[
  {
    "type": "constructor",
    "inputs": [
      {
        "name": "_validatorManager",
        "type": "address",
        "internalType": "address"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "dispatch",
    "inputs": [
      {
        "name": "sourceChainId",
        "type": "uint256",
        "internalType": "uint256"
      },
      { "name": "target", "type": "address", "internalType": "address" },
      { "name": "call", "type": "bytes", "internalType": "bytes" },
      { "name": "gasLimit", "type": "uint256", "internalType": "uint256" },
      { "name": "nonce", "type": "uint256", "internalType": "uint256" },
      { "name": "signatures", "type": "bytes[]", "internalType": "bytes[]" }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "dispatched",
    "inputs": [
      { "name": "", "type": "uint256", "internalType": "uint256" },
      { "name": "", "type": "uint256", "internalType": "uint256" }
    ],
    "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "nonce",
    "inputs": [],
    "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "owner",
    "inputs": [],
    "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "register",
    "inputs": [
      { "name": "newTarget", "type": "address", "internalType": "address" }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "registered",
    "inputs": [{ "name": "", "type": "address", "internalType": "address" }],
    "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "relay",
    "inputs": [
      {
        "name": "targetChainId",
        "type": "uint256",
        "internalType": "uint256"
      },
      { "name": "target", "type": "address", "internalType": "address" },
      { "name": "call", "type": "bytes", "internalType": "bytes" },
      { "name": "gasLimit", "type": "uint256", "internalType": "uint256" }
    ],
    "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "relayWithMetadata",
    "inputs": [
      {
        "name": "targetChainId",
        "type": "uint256",
        "internalType": "uint256"
      },
      { "name": "target", "type": "address", "internalType": "address" },
      { "name": "callSelector", "type": "bytes4", "internalType": "bytes4" },
      { "name": "callData", "type": "bytes", "internalType": "bytes" },
      { "name": "gasLimit", "type": "uint256", "internalType": "uint256" }
    ],
    "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "renounceOwnership",
    "inputs": [],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "transferOwnership",
    "inputs": [
      { "name": "newOwner", "type": "address", "internalType": "address" }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "unregister",
    "inputs": [
      { "name": "removeTarget", "type": "address", "internalType": "address" }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "validatorManager",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "address",
        "internalType": "contract ValidatorManager"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "event",
    "name": "Dispatched",
    "inputs": [
      {
        "name": "sourceChainId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      },
      {
        "name": "target",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "success",
        "type": "bool",
        "indexed": false,
        "internalType": "bool"
      },
      {
        "name": "response",
        "type": "bytes",
        "indexed": false,
        "internalType": "bytes"
      },
      {
        "name": "nonce",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "OwnershipTransferred",
    "inputs": [
      {
        "name": "previousOwner",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "newOwner",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "Relayed",
    "inputs": [
      {
        "name": "targetChainId",
        "type": "uint256",
        "indexed": true,
        "internalType": "uint256"
      },
      {
        "name": "target",
        "type": "address",
        "indexed": false,
        "internalType": "address"
      },
      {
        "name": "call",
        "type": "bytes",
        "indexed": false,
        "internalType": "bytes"
      },
      {
        "name": "gasLimit",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "nonce",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      }
    ],
    "anonymous": false
  },
  { "type": "error", "name": "AlreadyDispatched", "inputs": [] },
  { "type": "error", "name": "NonContractCaller", "inputs": [] },
  {
    "type": "error",
    "name": "NotRegistered",
    "inputs": [
      {
        "name": "targetAddress",
        "type": "address",
        "internalType": "address"
      }
    ]
  },
  { "type": "error", "name": "NotValidator", "inputs": [] },
  {
    "type": "error",
    "name": "OwnableInvalidOwner",
    "inputs": [
      { "name": "owner", "type": "address", "internalType": "address" }
    ]
  },
  {
    "type": "error",
    "name": "OwnableUnauthorizedAccount",
    "inputs": [
      { "name": "account", "type": "address", "internalType": "address" }
    ]
  }
]
