{
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_domain",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_router",
          "type": "bytes32"
        }
      ],
      "name": "enrollRemoteRouter",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_origin",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "_nonce",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_sender",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        }
      ],
      "name": "handle",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "name": "remotes",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_xAppConnectionManager",
          "type": "address"
        }
      ],
      "name": "setXAppConnectionManager",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "xAppConnectionManager",
      "outputs": [
        {
          "internalType": "contract XAppConnectionManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": {
    "object": "0x",
    "sourceMap": "",
    "linkReferences": {}
  },
  "deployedBytecode": {
    "object": "0x",
    "sourceMap": "",
    "linkReferences": {}
  },
  "methodIdentifiers": {
    "enrollRemoteRouter(uint32,bytes32)": "b49c53a7",
    "handle(uint32,uint32,bytes32,bytes)": "ab2dc3f5",
    "owner()": "8da5cb5b",
    "remotes(uint32)": "83bbb806",
    "renounceOwnership()": "715018a6",
    "setXAppConnectionManager(address)": "41bdc8b5",
    "transferOwnership(address)": "f2fde38b",
    "xAppConnectionManager()": "3339df96"
  },
  "ast": {
    "absolutePath": "packages/contracts-router/contracts/Router.sol",
    "id": 28856,
    "exportedSymbols": {
      "IMessageRecipient": [
        27418
      ],
      "Router": [
        28855
      ],
      "XAppConnectionClient": [
        28953
      ]
    },
    "nodeType": "SourceUnit",
    "src": "46:2593:30",
    "nodes": [
      {
        "id": 28731,
        "nodeType": "PragmaDirective",
        "src": "46:22:30",
        "literals": [
          "solidity",
          "0.7",
          ".6"
        ]
      },
      {
        "id": 28733,
        "nodeType": "ImportDirective",
        "src": "116:64:30",
        "absolutePath": "packages/contracts-router/contracts/XAppConnectionClient.sol",
        "file": "./XAppConnectionClient.sol",
        "scope": 28856,
        "sourceUnit": 28954,
        "symbolAliases": [
          {
            "foreign": {
              "id": 28732,
              "name": "XAppConnectionClient",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "124:20:30",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 28735,
        "nodeType": "ImportDirective",
        "src": "227:103:30",
        "absolutePath": "packages/contracts-core/contracts/interfaces/IMessageRecipient.sol",
        "file": "@nomad-xyz/contracts-core/contracts/interfaces/IMessageRecipient.sol",
        "scope": 28856,
        "sourceUnit": 27419,
        "symbolAliases": [
          {
            "foreign": {
              "id": 28734,
              "name": "IMessageRecipient",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "235:17:30",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 28855,
        "nodeType": "ContractDefinition",
        "src": "332:2306:30",
        "nodes": [
          {
            "id": 28743,
            "nodeType": "VariableDeclaration",
            "src": "456:41:30",
            "constant": false,
            "functionSelector": "83bbb806",
            "mutability": "mutable",
            "name": "remotes",
            "scope": 28855,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint32_$_t_bytes32_$",
              "typeString": "mapping(uint32 => bytes32)"
            },
            "typeName": {
              "id": 28742,
              "keyType": {
                "id": 28740,
                "name": "uint32",
                "nodeType": "ElementaryTypeName",
                "src": "464:6:30",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint32",
                  "typeString": "uint32"
                }
              },
              "nodeType": "Mapping",
              "src": "456:26:30",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint32_$_t_bytes32_$",
                "typeString": "mapping(uint32 => bytes32)"
              },
              "valueType": {
                "id": 28741,
                "name": "bytes32",
                "nodeType": "ElementaryTypeName",
                "src": "474:7:30",
                "typeDescriptions": {
                  "typeIdentifier": "t_bytes32",
                  "typeString": "bytes32"
                }
              }
            },
            "visibility": "public"
          },
          {
            "id": 28747,
            "nodeType": "VariableDeclaration",
            "src": "503:25:30",
            "constant": false,
            "mutability": "mutable",
            "name": "__GAP",
            "scope": 28855,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_uint256_$49_storage",
              "typeString": "uint256[49]"
            },
            "typeName": {
              "baseType": {
                "id": 28744,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "503:7:30",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "id": 28746,
              "length": {
                "hexValue": "3439",
                "id": 28745,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "511:2:30",
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_49_by_1",
                  "typeString": "int_const 49"
                },
                "value": "49"
              },
              "nodeType": "ArrayTypeName",
              "src": "503:11:30",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_uint256_$49_storage_ptr",
                "typeString": "uint256[49]"
              }
            },
            "visibility": "private"
          },
          {
            "id": 28764,
            "nodeType": "ModifierDefinition",
            "src": "808:147:30",
            "body": {
              "id": 28763,
              "nodeType": "Block",
              "src": "867:88:30",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 28756,
                            "name": "_origin",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 28750,
                            "src": "901:7:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          {
                            "id": 28757,
                            "name": "_router",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 28752,
                            "src": "910:7:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            },
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          ],
                          "id": 28755,
                          "name": "_isRemoteRouter",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 28829,
                          "src": "885:15:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_uint32_$_t_bytes32_$returns$_t_bool_$",
                            "typeString": "function (uint32,bytes32) view returns (bool)"
                          }
                        },
                        "id": 28758,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "885:33:30",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "2172656d6f746520726f75746572",
                        "id": 28759,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "920:16:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_9bc322113f88fac029da5e70dda1b6c2bb6b8524881c67828a5ec49d7ca13c13",
                          "typeString": "literal_string \"!remote router\""
                        },
                        "value": "!remote router"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_9bc322113f88fac029da5e70dda1b6c2bb6b8524881c67828a5ec49d7ca13c13",
                          "typeString": "literal_string \"!remote router\""
                        }
                      ],
                      "id": 28754,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "877:7:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 28760,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "877:60:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 28761,
                  "nodeType": "ExpressionStatement",
                  "src": "877:60:30"
                },
                {
                  "id": 28762,
                  "nodeType": "PlaceholderStatement",
                  "src": "947:1:30"
                }
              ]
            },
            "documentation": {
              "id": 28748,
              "nodeType": "StructuredDocumentation",
              "src": "605:198:30",
              "text": " @notice Only accept messages from a remote Router contract\n @param _origin The domain the message is coming from\n @param _router The address the message is coming from"
            },
            "name": "onlyRemoteRouter",
            "parameters": {
              "id": 28753,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 28750,
                  "mutability": "mutable",
                  "name": "_origin",
                  "nodeType": "VariableDeclaration",
                  "scope": 28764,
                  "src": "834:14:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 28749,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "834:6:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 28752,
                  "mutability": "mutable",
                  "name": "_router",
                  "nodeType": "VariableDeclaration",
                  "scope": 28764,
                  "src": "850:15:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 28751,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "850:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "833:33:30"
            },
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 28793,
            "nodeType": "FunctionDefinition",
            "src": "1242:214:30",
            "body": {
              "id": 28792,
              "nodeType": "Block",
              "src": "1342:114:30",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 28782,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "commonType": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          },
                          "id": 28778,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 28775,
                            "name": "_domain",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 28767,
                            "src": "1360:7:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 28776,
                              "name": "_localDomain",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 28952,
                              "src": "1371:12:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                                "typeString": "function () view returns (uint32)"
                              }
                            },
                            "id": 28777,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1371:14:30",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "1360:25:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "&&",
                        "rightExpression": {
                          "commonType": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          },
                          "id": 28781,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 28779,
                            "name": "_domain",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 28767,
                            "src": "1389:7:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "hexValue": "30",
                            "id": 28780,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1400:1:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "1389:12:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "1360:41:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "21646f6d61696e",
                        "id": 28783,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1403:9:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_713a62ac7d6699d26c5564c3c29686998f05bfd595516cfcf220240bfe0fc1a7",
                          "typeString": "literal_string \"!domain\""
                        },
                        "value": "!domain"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_713a62ac7d6699d26c5564c3c29686998f05bfd595516cfcf220240bfe0fc1a7",
                          "typeString": "literal_string \"!domain\""
                        }
                      ],
                      "id": 28774,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1352:7:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 28784,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1352:61:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 28785,
                  "nodeType": "ExpressionStatement",
                  "src": "1352:61:30"
                },
                {
                  "expression": {
                    "id": 28790,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 28786,
                        "name": "remotes",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 28743,
                        "src": "1423:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint32_$_t_bytes32_$",
                          "typeString": "mapping(uint32 => bytes32)"
                        }
                      },
                      "id": 28788,
                      "indexExpression": {
                        "id": 28787,
                        "name": "_domain",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 28767,
                        "src": "1431:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1423:16:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 28789,
                      "name": "_router",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 28769,
                      "src": "1442:7:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "src": "1423:26:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "id": 28791,
                  "nodeType": "ExpressionStatement",
                  "src": "1423:26:30"
                }
              ]
            },
            "documentation": {
              "id": 28765,
              "nodeType": "StructuredDocumentation",
              "src": "1014:223:30",
              "text": " @notice Register the address of a Router contract for the same xApp on a remote chain\n @param _domain The domain of the remote xApp Router\n @param _router The address of the remote xApp Router"
            },
            "functionSelector": "b49c53a7",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 28772,
                "modifierName": {
                  "id": 28771,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 23113,
                  "src": "1328:9:30",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1328:9:30"
              }
            ],
            "name": "enrollRemoteRouter",
            "parameters": {
              "id": 28770,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 28767,
                  "mutability": "mutable",
                  "name": "_domain",
                  "nodeType": "VariableDeclaration",
                  "scope": 28793,
                  "src": "1270:14:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 28766,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1270:6:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 28769,
                  "mutability": "mutable",
                  "name": "_router",
                  "nodeType": "VariableDeclaration",
                  "scope": 28793,
                  "src": "1286:15:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 28768,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1286:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1269:33:30"
            },
            "returnParameters": {
              "id": 28773,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1342:0:30"
            },
            "scope": 28855,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 28805,
            "nodeType": "FunctionDefinition",
            "src": "1514:151:30",
            "baseFunctions": [
              27417
            ],
            "functionSelector": "ab2dc3f5",
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "handle",
            "overrides": {
              "id": 28803,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1656:8:30"
            },
            "parameters": {
              "id": 28802,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 28795,
                  "mutability": "mutable",
                  "name": "_origin",
                  "nodeType": "VariableDeclaration",
                  "scope": 28805,
                  "src": "1539:14:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 28794,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1539:6:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 28797,
                  "mutability": "mutable",
                  "name": "_nonce",
                  "nodeType": "VariableDeclaration",
                  "scope": 28805,
                  "src": "1563:13:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 28796,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1563:6:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 28799,
                  "mutability": "mutable",
                  "name": "_sender",
                  "nodeType": "VariableDeclaration",
                  "scope": 28805,
                  "src": "1586:15:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 28798,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1586:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 28801,
                  "mutability": "mutable",
                  "name": "_message",
                  "nodeType": "VariableDeclaration",
                  "scope": 28805,
                  "src": "1611:21:30",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 28800,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1611:5:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1529:109:30"
            },
            "returnParameters": {
              "id": 28804,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1664:0:30"
            },
            "scope": 28855,
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "external"
          },
          {
            "id": 28829,
            "nodeType": "FunctionDefinition",
            "src": "1973:191:30",
            "body": {
              "id": 28828,
              "nodeType": "Block",
              "src": "2088:76:30",
              "statements": [
                {
                  "expression": {
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 28826,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "id": 28819,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "baseExpression": {
                          "id": 28815,
                          "name": "remotes",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 28743,
                          "src": "2105:7:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_uint32_$_t_bytes32_$",
                            "typeString": "mapping(uint32 => bytes32)"
                          }
                        },
                        "id": 28817,
                        "indexExpression": {
                          "id": 28816,
                          "name": "_domain",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 28808,
                          "src": "2113:7:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "2105:16:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "id": 28818,
                        "name": "_router",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 28810,
                        "src": "2125:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "src": "2105:27:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&&",
                    "rightExpression": {
                      "commonType": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "id": 28825,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 28820,
                        "name": "_router",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 28810,
                        "src": "2136:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "!=",
                      "rightExpression": {
                        "arguments": [
                          {
                            "hexValue": "30",
                            "id": 28823,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2155:1:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            }
                          ],
                          "id": 28822,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "2147:7:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_bytes32_$",
                            "typeString": "type(bytes32)"
                          },
                          "typeName": {
                            "id": 28821,
                            "name": "bytes32",
                            "nodeType": "ElementaryTypeName",
                            "src": "2147:7:30",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 28824,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2147:10:30",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "src": "2136:21:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "2105:52:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 28814,
                  "id": 28827,
                  "nodeType": "Return",
                  "src": "2098:59:30"
                }
              ]
            },
            "documentation": {
              "id": 28806,
              "nodeType": "StructuredDocumentation",
              "src": "1723:245:30",
              "text": " @notice Return true if the given domain / router is the address of a remote xApp Router\n @param _domain The domain of the potential remote xApp Router\n @param _router The address of the potential remote xApp Router"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_isRemoteRouter",
            "parameters": {
              "id": 28811,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 28808,
                  "mutability": "mutable",
                  "name": "_domain",
                  "nodeType": "VariableDeclaration",
                  "scope": 28829,
                  "src": "1998:14:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 28807,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1998:6:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 28810,
                  "mutability": "mutable",
                  "name": "_router",
                  "nodeType": "VariableDeclaration",
                  "scope": 28829,
                  "src": "2014:15:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 28809,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2014:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1997:33:30"
            },
            "returnParameters": {
              "id": 28814,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 28813,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 28829,
                  "src": "2078:4:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 28812,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2078:4:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2077:6:30"
            },
            "scope": 28855,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 28854,
            "nodeType": "FunctionDefinition",
            "src": "2433:203:30",
            "body": {
              "id": 28853,
              "nodeType": "Block",
              "src": "2542:94:30",
              "statements": [
                {
                  "expression": {
                    "id": 28841,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 28837,
                      "name": "_remote",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 28835,
                      "src": "2552:7:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "baseExpression": {
                        "id": 28838,
                        "name": "remotes",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 28743,
                        "src": "2562:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint32_$_t_bytes32_$",
                          "typeString": "mapping(uint32 => bytes32)"
                        }
                      },
                      "id": 28840,
                      "indexExpression": {
                        "id": 28839,
                        "name": "_domain",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 28832,
                        "src": "2570:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "2562:16:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "src": "2552:26:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "id": 28842,
                  "nodeType": "ExpressionStatement",
                  "src": "2552:26:30"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "id": 28849,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 28844,
                          "name": "_remote",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 28835,
                          "src": "2596:7:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "arguments": [
                            {
                              "hexValue": "30",
                              "id": 28847,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2615:1:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 28846,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2607:7:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_bytes32_$",
                              "typeString": "type(bytes32)"
                            },
                            "typeName": {
                              "id": 28845,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "2607:7:30",
                              "typeDescriptions": {}
                            }
                          },
                          "id": 28848,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2607:10:30",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "src": "2596:21:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "2172656d6f7465",
                        "id": 28850,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2619:9:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_b4cb45e2eca7e91596896d9d6d0088e023ee382fb860b627f6924eb294dd23de",
                          "typeString": "literal_string \"!remote\""
                        },
                        "value": "!remote"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_b4cb45e2eca7e91596896d9d6d0088e023ee382fb860b627f6924eb294dd23de",
                          "typeString": "literal_string \"!remote\""
                        }
                      ],
                      "id": 28843,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2588:7:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 28851,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2588:41:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 28852,
                  "nodeType": "ExpressionStatement",
                  "src": "2588:41:30"
                }
              ]
            },
            "documentation": {
              "id": 28830,
              "nodeType": "StructuredDocumentation",
              "src": "2170:258:30",
              "text": " @notice Assert that the given domain has a xApp Router registered and return its address\n @param _domain The domain of the chain for which to get the xApp Router\n @return _remote The address of the remote xApp Router on _domain"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_mustHaveRemote",
            "parameters": {
              "id": 28833,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 28832,
                  "mutability": "mutable",
                  "name": "_domain",
                  "nodeType": "VariableDeclaration",
                  "scope": 28854,
                  "src": "2458:14:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 28831,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2458:6:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2457:16:30"
            },
            "returnParameters": {
              "id": 28836,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 28835,
                  "mutability": "mutable",
                  "name": "_remote",
                  "nodeType": "VariableDeclaration",
                  "scope": 28854,
                  "src": "2521:15:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 28834,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2521:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2520:17:30"
            },
            "scope": 28855,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 28736,
              "name": "XAppConnectionClient",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 28953,
              "src": "360:20:30",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_XAppConnectionClient_$28953",
                "typeString": "contract XAppConnectionClient"
              }
            },
            "id": 28737,
            "nodeType": "InheritanceSpecifier",
            "src": "360:20:30"
          },
          {
            "baseName": {
              "id": 28738,
              "name": "IMessageRecipient",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 27418,
              "src": "382:17:30",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IMessageRecipient_$27418",
                "typeString": "contract IMessageRecipient"
              }
            },
            "id": 28739,
            "nodeType": "InheritanceSpecifier",
            "src": "382:17:30"
          }
        ],
        "contractDependencies": [
          23168,
          23234,
          23523,
          27418,
          28953
        ],
        "contractKind": "contract",
        "fullyImplemented": false,
        "linearizedBaseContracts": [
          28855,
          27418,
          28953,
          23168,
          23523,
          23234
        ],
        "name": "Router",
        "scope": 28856
      }
    ],
    "license": "MIT OR Apache-2.0"
  },
  "id": 30
}