{
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "getCurrentMsg",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "encodedMsg",
          "type": "bytes"
        }
      ],
      "name": "receiveEncodedMsg",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "chainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes32",
          "name": "applicationAddr",
          "type": "bytes32"
        }
      ],
      "name": "registerApplicationContracts",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "str",
          "type": "bytes"
        }
      ],
      "name": "sendMsg",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "sequence",
          "type": "uint64"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": {
    "object": "[encoded data, 5640 characters]",
    "sourceMap": "98:1885:0:-:0;;;155:98;;;-1:-1:-1;;;;;;155:98:0;210:42;155:98;;;;;;259:63;;;-1:-1:-1;;;;;;328:16:0;;;;;;473:48;;;;;;;;;-1:-1:-1;496:5:0;:18;;-1:-1:-1;;;;;;496:18:0;504:10;496:18;;;98:1885;;;;;;",
    "linkReferences": {}
  },
  "deployedBytecode": {
    "object": "[encoded data, 5420 characters]",
    "sourceMap": "98:1885:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;695:822;;;;;;:::i;:::-;;:::i;:::-;;1753:228;;;;;;:::i;:::-;;:::i;527:162::-;;;;;;:::i;:::-;;:::i;:::-;;;2425:18:3;2413:31;;;2395:50;;2383:2;2368:18;527:162:0;;;;;;;;1523:95;;;:::i;:::-;;;;;;;:::i;695:822::-;825:11;;:40;;-1:-1:-1;;;825:40:0;;765:22;;;;;;-1:-1:-1;;;;;825:11:0;;:28;;:40;;854:10;;825:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;825:40:0;;;;;;;;;;;;:::i;:::-;764:101;;;;;;1067:5;1074:6;1059:22;;;;;-1:-1:-1;;;1059:22:0;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;1207:17:0;;;;1185;;;;1163:40;;;;;;:21;:40;;;;;;:61;1155:98;;;;-1:-1:-1;;;1155:98:0;;7862:2:3;1155:98:0;;;7844:21:3;7901:2;7881:18;;;7874:30;7940:26;7920:18;;;7913:54;7984:18;;1155:98:0;7660:348:3;1155:98:0;1362:7;;;;1343:27;;;;:18;:27;;;;;;;;1342:28;1334:66;;;;-1:-1:-1;;;1334:66:0;;8215:2:3;1334:66:0;;;8197:21:3;8254:2;8234:18;;;8227:30;8293:27;8273:18;;;8266:55;8338:18;;1334:66:0;8013:349:3;1334:66:0;1429:7;;;;1410:27;;;;:18;:27;;;;;;;:34;;-1:-1:-1;;1410:34:0;1440:4;1410:34;;;1499:10;;;;1478:32;;;;1410:27;1478:32;;;;;;:::i;:::-;;754:763;;;695:822;:::o;1753:228::-;1871:5;;-1:-1:-1;;;;;1871:5:0;1857:10;:19;1849:67;;;;-1:-1:-1;;;1849:67:0;;8569:2:3;1849:67:0;;;8551:21:3;8608:2;8588:18;;;8581:30;8647:34;8627:18;;;8620:62;-1:-1:-1;;;8698:18:3;;;8691:33;8741:19;;1849:67:0;8367:399:3;1849:67:0;1926:30;;;;;;;;:21;:30;;;;;:48;1753:228::o;527:162::-;616:11;;:41;;-1:-1:-1;;;616:41:0;;578:15;;-1:-1:-1;;;;;616:11:0;;;:26;;:41;;-1:-1:-1;;;643:5:0;;;;;;650:3;;616:11;;:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;675:5;;605:52;;-1:-1:-1;675:7:0;;-1:-1:-1;;;675:5:0;;;;681:1;675:7;:::i;:::-;667:5;;:15;;;;;;;;;;;;;;;;;;527:162;;;:::o;1523:95::-;1569:13;1600:11;1593:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1523:95;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:127:3;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:253;218:2;212:9;260:4;248:17;;295:18;280:34;;316:22;;;277:62;274:88;;;342:18;;:::i;:::-;378:2;371:22;146:253;:::o;404:255::-;476:2;470:9;518:6;506:19;;555:18;540:34;;576:22;;;537:62;534:88;;;602:18;;:::i;664:275::-;735:2;729:9;800:2;781:13;;-1:-1:-1;;777:27:3;765:40;;835:18;820:34;;856:22;;;817:62;814:88;;;882:18;;:::i;:::-;918:2;911:22;664:275;;-1:-1:-1;664:275:3:o;944:186::-;992:4;1025:18;1017:6;1014:30;1011:56;;;1047:18;;:::i;:::-;-1:-1:-1;1113:2:3;1092:15;-1:-1:-1;;1088:29:3;1119:4;1084:40;;944:186::o;1135:671::-;1203:6;1256:2;1244:9;1235:7;1231:23;1227:32;1224:52;;;1272:1;1269;1262:12;1224:52;1312:9;1299:23;1345:18;1337:6;1334:30;1331:50;;;1377:1;1374;1367:12;1331:50;1400:22;;1453:4;1445:13;;1441:27;-1:-1:-1;1431:55:3;;1482:1;1479;1472:12;1431:55;1518:2;1505:16;1543:48;1559:31;1587:2;1559:31;:::i;:::-;1543:48;:::i;:::-;1614:2;1607:5;1600:17;1654:7;1649:2;1644;1640;1636:11;1632:20;1629:33;1626:53;;;1675:1;1672;1665:12;1626:53;1730:2;1725;1721;1717:11;1712:2;1705:5;1701:14;1688:45;1774:1;1753:14;;;1769:2;1749:23;1742:34;;;;1757:5;1135:671;-1:-1:-1;;;;1135:671:3:o;1811:117::-;1896:6;1889:5;1885:18;1878:5;1875:29;1865:57;;1918:1;1915;1908:12;1865:57;1811:117;:::o;1933:313::-;2000:6;2008;2061:2;2049:9;2040:7;2036:23;2032:32;2029:52;;;2077:1;2074;2067:12;2029:52;2116:9;2103:23;2135:30;2159:5;2135:30;:::i;:::-;2184:5;2236:2;2221:18;;;;2208:32;;-1:-1:-1;;;1933:313:3:o;2456:258::-;2528:1;2538:113;2552:6;2549:1;2546:13;2538:113;;;2628:11;;;2622:18;2609:11;;;2602:39;2574:2;2567:10;2538:113;;;2669:6;2666:1;2663:13;2660:48;;;2704:1;2695:6;2690:3;2686:16;2679:27;2660:48;;2456:258;;;:::o;2719:::-;2761:3;2799:5;2793:12;2826:6;2821:3;2814:19;2842:63;2898:6;2891:4;2886:3;2882:14;2875:4;2868:5;2864:16;2842:63;:::i;:::-;2959:2;2938:15;-1:-1:-1;;2934:29:3;2925:39;;;;2966:4;2921:50;;2719:258;-1:-1:-1;;2719:258:3:o;2982:220::-;3131:2;3120:9;3113:21;3094:4;3151:45;3192:2;3181:9;3177:18;3169:6;3151:45;:::i;:::-;3143:53;2982:220;-1:-1:-1;;;2982:220:3:o;3430:160::-;3507:13;;3560:4;3549:16;;3539:27;;3529:55;;3580:1;3577;3570:12;3529:55;3430:160;;;:::o;3595:167::-;3673:13;;3726:10;3715:22;;3705:33;;3695:61;;3752:1;3749;3742:12;3767:136;3845:13;;3867:30;3845:13;3867:30;:::i;3908:175::-;3986:13;;4039:18;4028:30;;4018:41;;4008:69;;4073:1;4070;4063:12;4088:428;4141:5;4194:3;4187:4;4179:6;4175:17;4171:27;4161:55;;4212:1;4209;4202:12;4161:55;4241:6;4235:13;4272:48;4288:31;4316:2;4288:31;:::i;4272:48::-;4345:2;4336:7;4329:19;4391:3;4384:4;4379:2;4371:6;4367:15;4363:26;4360:35;4357:55;;;4408:1;4405;4398:12;4357:55;4421:64;4482:2;4475:4;4466:7;4462:18;4455:4;4447:6;4443:17;4421:64;:::i;:::-;4503:7;4088:428;-1:-1:-1;;;;4088:428:3:o;4521:1177::-;4595:5;4648:3;4641:4;4633:6;4629:17;4625:27;4615:55;;4666:1;4663;4656:12;4615:55;4695:6;4689:13;4721:4;4744:18;4740:2;4737:26;4734:52;;;4766:18;;:::i;:::-;4806:36;4838:2;4833;4830:1;4826:10;4822:19;4806:36;:::i;:::-;4876:15;;;4962:1;4958:10;;;;4946:23;;4942:32;;;4907:12;;;;4986:15;;;4983:35;;;5014:1;5011;5004:12;4983:35;5050:2;5042:6;5038:15;5062:607;5078:6;5073:3;5070:15;5062:607;;;5156:4;5150:3;5145;5141:13;5137:24;5134:114;;;5202:1;5231:2;5227;5220:14;5134:114;5274:22;;:::i;:::-;5329:3;5323:10;5316:5;5309:25;5385:2;5380:3;5376:12;5370:19;5365:2;5358:5;5354:14;5347:43;5413:2;5451:41;5488:2;5483:3;5479:12;5451:41;:::i;:::-;5435:14;;;5428:65;5516:2;5554:41;5582:12;;;5554:41;:::i;:::-;5538:14;;;5531:65;5609:18;;5647:12;;;;5104:4;5095:14;5062:607;;;-1:-1:-1;5687:5:3;4521:1177;-1:-1:-1;;;;;;4521:1177:3:o;5703:164::-;5779:13;;5828;;5821:21;5811:32;;5801:60;;5857:1;5854;5847:12;5872:1783;5986:6;5994;6002;6055:2;6043:9;6034:7;6030:23;6026:32;6023:52;;;6071:1;6068;6061:12;6023:52;6104:9;6098:16;6133:18;6174:2;6166:6;6163:14;6160:34;;;6190:1;6187;6180:12;6160:34;6213:22;;;;6269:6;6251:16;;;6247:29;6244:49;;;6289:1;6286;6279:12;6244:49;6315:22;;:::i;:::-;6360:31;6388:2;6360:31;:::i;:::-;6353:5;6346:46;6424:41;6461:2;6457;6453:11;6424:41;:::i;:::-;6419:2;6412:5;6408:14;6401:65;6498:41;6535:2;6531;6527:11;6498:41;:::i;:::-;6493:2;6486:5;6482:14;6475:65;6572:41;6609:2;6605;6601:11;6572:41;:::i;:::-;6567:2;6560:5;6556:14;6549:65;6661:3;6657:2;6653:12;6647:19;6641:3;6634:5;6630:15;6623:44;6700:42;6737:3;6733:2;6729:12;6700:42;:::i;:::-;6694:3;6687:5;6683:15;6676:67;6776:41;6812:3;6808:2;6804:12;6776:41;:::i;:::-;6770:3;6763:5;6759:15;6752:66;6857:3;6853:2;6849:12;6843:19;6887:2;6877:8;6874:16;6871:36;;;6903:1;6900;6893:12;6871:36;6940:55;6987:7;6976:8;6972:2;6968:17;6940:55;:::i;:::-;6934:3;6927:5;6923:15;6916:80;;7015:3;7050:41;7087:2;7083;7079:11;7050:41;:::i;:::-;7034:14;;;7027:65;7111:3;7145:11;;;7139:18;7169:16;;;7166:36;;;7198:1;7195;7188:12;7166:36;7234:76;7302:7;7291:8;7287:2;7283:17;7234:76;:::i;:::-;7218:14;;;7211:100;;;;-1:-1:-1;7330:3:3;7371:11;;;7365:18;7349:14;;;7342:42;7222:5;-1:-1:-1;7427:46:3;7469:2;7454:18;;7427:46;:::i;:::-;7417:56;;7519:2;7508:9;7504:18;7498:25;7482:41;;7548:2;7538:8;7535:16;7532:36;;;7564:1;7561;7554:12;7532:36;;7587:62;7641:7;7630:8;7619:9;7615:24;7587:62;:::i;:::-;7577:72;;;5872:1783;;;;;:::o;8771:392::-;8990:10;8982:6;8978:23;8967:9;8960:42;9038:2;9033;9022:9;9018:18;9011:30;8941:4;9058:45;9099:2;9088:9;9084:18;9076:6;9058:45;:::i;:::-;9050:53;;9151:4;9143:6;9139:17;9134:2;9123:9;9119:18;9112:45;8771:392;;;;;;:::o;9168:206::-;9237:6;9290:2;9278:9;9269:7;9265:23;9261:32;9258:52;;;9306:1;9303;9296:12;9258:52;9329:39;9358:9;9329:39;:::i;9379:325::-;9418:3;9446:10;9483:2;9480:1;9476:10;9513:2;9510:1;9506:10;9544:3;9540:2;9536:12;9531:3;9528:21;9525:144;;;9591:10;9586:3;9582:20;9579:1;9572:31;9626:4;9623:1;9616:15;9654:4;9651:1;9644:15;9525:144;9685:13;;9379:325;-1:-1:-1;;;;9379:325:3:o;9709:380::-;9788:1;9784:12;;;;9831;;;9852:61;;9906:4;9898:6;9894:17;9884:27;;9852:61;9959:2;9951:6;9948:14;9928:18;9925:38;9922:161;;;10005:10;10000:3;9996:20;9993:1;9986:31;10040:4;10037:1;10030:15;10068:4;10065:1;10058:15;9922:161;;9709:380;;;:::o",
    "linkReferences": {}
  },
  "methodIdentifiers": {
    "getCurrentMsg()": "ff206cf8",
    "receiveEncodedMsg(bytes)": "496d76ff",
    "registerApplicationContracts(uint16,bytes32)": "5f327e1c",
    "sendMsg(bytes)": "737a3ca4"
  },
  "ast": {
    "absolutePath": "src/Messenger.sol",
    "id": 154,
    "exportedSymbols": {
      "IWormhole": [
        280
      ],
      "Messenger": [
        153
      ],
      "Structs": [
        330
      ]
    },
    "nodeType": "SourceUnit",
    "src": "37:1947:0",
    "nodes": [
      {
        "id": 1,
        "nodeType": "PragmaDirective",
        "src": "37:23:0",
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ]
      },
      {
        "id": 2,
        "nodeType": "ImportDirective",
        "src": "62:34:0",
        "absolutePath": "src/Wormhole/IWormhole.sol",
        "file": "./Wormhole/IWormhole.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 154,
        "sourceUnit": 281,
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "id": 153,
        "nodeType": "ContractDefinition",
        "src": "98:1885:0",
        "nodes": [
          {
            "id": 4,
            "nodeType": "VariableDeclaration",
            "src": "123:26:0",
            "constant": false,
            "mutability": "mutable",
            "name": "current_msg",
            "nameLocation": "138:11:0",
            "scope": 153,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_storage",
              "typeString": "string"
            },
            "typeName": {
              "id": 3,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "123:6:0",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "visibility": "private"
          },
          {
            "id": 10,
            "nodeType": "VariableDeclaration",
            "src": "155:98:0",
            "constant": false,
            "mutability": "mutable",
            "name": "wormhole_core_bridge_address",
            "nameLocation": "171:28:0",
            "scope": 153,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 5,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "155:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": {
              "arguments": [
                {
                  "hexValue": "307843383943653437333538383243394630663046453236363836633533303734453039423044353530",
                  "id": 8,
                  "isConstant": false,
                  "isLValue": false,
                  "isPure": true,
                  "kind": "number",
                  "lValueRequested": false,
                  "nodeType": "Literal",
                  "src": "210:42:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "value": "0xC89Ce4735882C9F0f0FE26686c53074E09B0D550"
                }
              ],
              "expression": {
                "argumentTypes": [
                  {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                ],
                "id": 7,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "lValueRequested": false,
                "nodeType": "ElementaryTypeNameExpression",
                "src": "202:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_type$_t_address_$",
                  "typeString": "type(address)"
                },
                "typeName": {
                  "id": 6,
                  "name": "address",
                  "nodeType": "ElementaryTypeName",
                  "src": "202:7:0",
                  "typeDescriptions": {}
                }
              },
              "id": 9,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "typeConversion",
              "lValueRequested": false,
              "names": [],
              "nodeType": "FunctionCall",
              "src": "202:51:0",
              "tryCall": false,
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "private"
          },
          {
            "id": 16,
            "nodeType": "VariableDeclaration",
            "src": "259:63:0",
            "constant": false,
            "mutability": "mutable",
            "name": "core_bridge",
            "nameLocation": "269:11:0",
            "scope": 153,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IWormhole_$280",
              "typeString": "contract IWormhole"
            },
            "typeName": {
              "id": 12,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 11,
                "name": "IWormhole",
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 280,
                "src": "259:9:0"
              },
              "referencedDeclaration": 280,
              "src": "259:9:0",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IWormhole_$280",
                "typeString": "contract IWormhole"
              }
            },
            "value": {
              "arguments": [
                {
                  "id": 14,
                  "name": "wormhole_core_bridge_address",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 10,
                  "src": "293:28:0",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                }
              ],
              "expression": {
                "argumentTypes": [
                  {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                ],
                "id": 13,
                "name": "IWormhole",
                "nodeType": "Identifier",
                "overloadedDeclarations": [],
                "referencedDeclaration": 280,
                "src": "283:9:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_type$_t_contract$_IWormhole_$280_$",
                  "typeString": "type(contract IWormhole)"
                }
              },
              "id": 15,
              "isConstant": false,
              "isLValue": false,
              "isPure": false,
              "kind": "typeConversion",
              "lValueRequested": false,
              "names": [],
              "nodeType": "FunctionCall",
              "src": "283:39:0",
              "tryCall": false,
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IWormhole_$280",
                "typeString": "contract IWormhole"
              }
            },
            "visibility": "internal"
          },
          {
            "id": 19,
            "nodeType": "VariableDeclaration",
            "src": "328:16:0",
            "constant": false,
            "mutability": "mutable",
            "name": "nonce",
            "nameLocation": "335:5:0",
            "scope": 153,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint32",
              "typeString": "uint32"
            },
            "typeName": {
              "id": 17,
              "name": "uint32",
              "nodeType": "ElementaryTypeName",
              "src": "328:6:0",
              "typeDescriptions": {
                "typeIdentifier": "t_uint32",
                "typeString": "uint32"
              }
            },
            "value": {
              "hexValue": "30",
              "id": 18,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "343:1:0",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "internal"
          },
          {
            "id": 23,
            "nodeType": "VariableDeclaration",
            "src": "350:48:0",
            "constant": false,
            "mutability": "mutable",
            "name": "_applicationContracts",
            "nameLocation": "377:21:0",
            "scope": 153,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint16_$_t_bytes32_$",
              "typeString": "mapping(uint16 => bytes32)"
            },
            "typeName": {
              "id": 22,
              "keyType": {
                "id": 20,
                "name": "uint16",
                "nodeType": "ElementaryTypeName",
                "src": "358:6:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint16",
                  "typeString": "uint16"
                }
              },
              "nodeType": "Mapping",
              "src": "350:26:0",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint16_$_t_bytes32_$",
                "typeString": "mapping(uint16 => bytes32)"
              },
              "valueType": {
                "id": 21,
                "name": "bytes32",
                "nodeType": "ElementaryTypeName",
                "src": "368:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_bytes32",
                  "typeString": "bytes32"
                }
              }
            },
            "visibility": "internal"
          },
          {
            "id": 25,
            "nodeType": "VariableDeclaration",
            "src": "404:13:0",
            "constant": false,
            "mutability": "mutable",
            "name": "owner",
            "nameLocation": "412:5:0",
            "scope": 153,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 24,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "404:7:0",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "internal"
          },
          {
            "id": 29,
            "nodeType": "VariableDeclaration",
            "src": "423:43:0",
            "constant": false,
            "mutability": "mutable",
            "name": "_completedMessages",
            "nameLocation": "448:18:0",
            "scope": 153,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_bytes32_$_t_bool_$",
              "typeString": "mapping(bytes32 => bool)"
            },
            "typeName": {
              "id": 28,
              "keyType": {
                "id": 26,
                "name": "bytes32",
                "nodeType": "ElementaryTypeName",
                "src": "431:7:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_bytes32",
                  "typeString": "bytes32"
                }
              },
              "nodeType": "Mapping",
              "src": "423:24:0",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_bytes32_$_t_bool_$",
                "typeString": "mapping(bytes32 => bool)"
              },
              "valueType": {
                "id": 27,
                "name": "bool",
                "nodeType": "ElementaryTypeName",
                "src": "442:4:0",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                }
              }
            },
            "visibility": "internal"
          },
          {
            "id": 38,
            "nodeType": "FunctionDefinition",
            "src": "473:48:0",
            "body": {
              "id": 37,
              "nodeType": "Block",
              "src": "486:35:0",
              "statements": [
                {
                  "expression": {
                    "id": 35,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 32,
                      "name": "owner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 25,
                      "src": "496:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "expression": {
                        "id": 33,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "504:3:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 34,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "src": "504:10:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "496:18:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 36,
                  "nodeType": "ExpressionStatement",
                  "src": "496:18:0"
                }
              ]
            },
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "parameters": {
              "id": 30,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "484:2:0"
            },
            "returnParameters": {
              "id": 31,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "486:0:0"
            },
            "scope": 153,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 61,
            "nodeType": "FunctionDefinition",
            "src": "527:162:0",
            "body": {
              "id": 60,
              "nodeType": "Block",
              "src": "595:94:0",
              "statements": [
                {
                  "expression": {
                    "id": 52,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 45,
                      "name": "sequence",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 43,
                      "src": "605:8:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 48,
                          "name": "nonce",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19,
                          "src": "643:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        {
                          "id": 49,
                          "name": "str",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 40,
                          "src": "650:3:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        {
                          "hexValue": "31",
                          "id": 50,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "655:1:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_1_by_1",
                            "typeString": "int_const 1"
                          },
                          "value": "1"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          },
                          {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          },
                          {
                            "typeIdentifier": "t_rational_1_by_1",
                            "typeString": "int_const 1"
                          }
                        ],
                        "expression": {
                          "id": 46,
                          "name": "core_bridge",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 16,
                          "src": "616:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IWormhole_$280",
                            "typeString": "contract IWormhole"
                          }
                        },
                        "id": 47,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "publishMessage",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 181,
                        "src": "616:26:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_payable$_t_uint32_$_t_bytes_memory_ptr_$_t_uint8_$returns$_t_uint64_$",
                          "typeString": "function (uint32,bytes memory,uint8) payable external returns (uint64)"
                        }
                      },
                      "id": 51,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "616:41:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "src": "605:52:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "id": 53,
                  "nodeType": "ExpressionStatement",
                  "src": "605:52:0"
                },
                {
                  "expression": {
                    "id": 58,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 54,
                      "name": "nonce",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19,
                      "src": "667:5:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "commonType": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      },
                      "id": 57,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 55,
                        "name": "nonce",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19,
                        "src": "675:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "+",
                      "rightExpression": {
                        "hexValue": "31",
                        "id": 56,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "681:1:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_1_by_1",
                          "typeString": "int_const 1"
                        },
                        "value": "1"
                      },
                      "src": "675:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "667:15:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "id": 59,
                  "nodeType": "ExpressionStatement",
                  "src": "667:15:0"
                }
              ]
            },
            "functionSelector": "737a3ca4",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "sendMsg",
            "nameLocation": "536:7:0",
            "parameters": {
              "id": 41,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 40,
                  "mutability": "mutable",
                  "name": "str",
                  "nameLocation": "557:3:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 61,
                  "src": "544:16:0",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 39,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "544:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "543:18:0"
            },
            "returnParameters": {
              "id": 44,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 43,
                  "mutability": "mutable",
                  "name": "sequence",
                  "nameLocation": "585:8:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 61,
                  "src": "578:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 42,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "578:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "577:17:0"
            },
            "scope": 153,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 121,
            "nodeType": "FunctionDefinition",
            "src": "695:822:0",
            "body": {
              "id": 120,
              "nodeType": "Block",
              "src": "754:763:0",
              "statements": [
                {
                  "assignments": [
                    70,
                    72,
                    74
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 70,
                      "mutability": "mutable",
                      "name": "vm",
                      "nameLocation": "785:2:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 120,
                      "src": "765:22:0",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_VM_$329_memory_ptr",
                        "typeString": "struct Structs.VM"
                      },
                      "typeName": {
                        "id": 69,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 68,
                          "name": "IWormhole.VM",
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 329,
                          "src": "765:12:0"
                        },
                        "referencedDeclaration": 329,
                        "src": "765:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VM_$329_storage_ptr",
                          "typeString": "struct Structs.VM"
                        }
                      },
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 72,
                      "mutability": "mutable",
                      "name": "valid",
                      "nameLocation": "794:5:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 120,
                      "src": "789:10:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 71,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "789:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 74,
                      "mutability": "mutable",
                      "name": "reason",
                      "nameLocation": "815:6:0",
                      "nodeType": "VariableDeclaration",
                      "scope": 120,
                      "src": "801:20:0",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string"
                      },
                      "typeName": {
                        "id": 73,
                        "name": "string",
                        "nodeType": "ElementaryTypeName",
                        "src": "801:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_storage_ptr",
                          "typeString": "string"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 79,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 77,
                        "name": "encodedMsg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 63,
                        "src": "854:10:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "expression": {
                        "id": 75,
                        "name": "core_bridge",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 16,
                        "src": "825:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IWormhole_$280",
                          "typeString": "contract IWormhole"
                        }
                      },
                      "id": 76,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "parseAndVerifyVM",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 193,
                      "src": "825:28:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_bytes_memory_ptr_$returns$_t_struct$_VM_$329_memory_ptr_$_t_bool_$_t_string_memory_ptr_$",
                        "typeString": "function (bytes memory) view external returns (struct Structs.VM memory,bool,string memory)"
                      }
                    },
                    "id": 78,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "825:40:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_struct$_VM_$329_memory_ptr_$_t_bool_$_t_string_memory_ptr_$",
                      "typeString": "tuple(struct Structs.VM memory,bool,string memory)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "764:101:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 81,
                        "name": "valid",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 72,
                        "src": "1067:5:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "id": 82,
                        "name": "reason",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 74,
                        "src": "1074:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 80,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1059:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 83,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1059:22:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 84,
                  "nodeType": "ExpressionStatement",
                  "src": "1059:22:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "id": 92,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "baseExpression": {
                            "id": 86,
                            "name": "_applicationContracts",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 23,
                            "src": "1163:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_uint16_$_t_bytes32_$",
                              "typeString": "mapping(uint16 => bytes32)"
                            }
                          },
                          "id": 89,
                          "indexExpression": {
                            "expression": {
                              "id": 87,
                              "name": "vm",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 70,
                              "src": "1185:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_VM_$329_memory_ptr",
                                "typeString": "struct Structs.VM memory"
                              }
                            },
                            "id": 88,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "emitterChainId",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 312,
                            "src": "1185:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint16",
                              "typeString": "uint16"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "1163:40:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "expression": {
                            "id": 90,
                            "name": "vm",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 70,
                            "src": "1207:2:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_VM_$329_memory_ptr",
                              "typeString": "struct Structs.VM memory"
                            }
                          },
                          "id": 91,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "emitterAddress",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 314,
                          "src": "1207:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "src": "1163:61:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "496e76616c696420456d6974746572204164647265737321",
                        "id": 93,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1226:26:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f496f877e2734cc33859d6eebf6eb783eb0c07a93151b05d0dc70cb8571cfab1",
                          "typeString": "literal_string \"Invalid Emitter Address!\""
                        },
                        "value": "Invalid Emitter Address!"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f496f877e2734cc33859d6eebf6eb783eb0c07a93151b05d0dc70cb8571cfab1",
                          "typeString": "literal_string \"Invalid Emitter Address!\""
                        }
                      ],
                      "id": 85,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1155:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 94,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1155:98:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 95,
                  "nodeType": "ExpressionStatement",
                  "src": "1155:98:0"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 101,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "UnaryOperation",
                        "operator": "!",
                        "prefix": true,
                        "src": "1342:28:0",
                        "subExpression": {
                          "baseExpression": {
                            "id": 97,
                            "name": "_completedMessages",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 29,
                            "src": "1343:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_bool_$",
                              "typeString": "mapping(bytes32 => bool)"
                            }
                          },
                          "id": 100,
                          "indexExpression": {
                            "expression": {
                              "id": 98,
                              "name": "vm",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 70,
                              "src": "1362:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_VM_$329_memory_ptr",
                                "typeString": "struct Structs.VM memory"
                              }
                            },
                            "id": 99,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "hash",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 328,
                            "src": "1362:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "1343:27:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "4d65737361676520616c72656164792070726f636573736564",
                        "id": 102,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1372:27:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_ce52e83d839057c6eded6c3ade48bb15cfa535fddf47c137ba979ab4aea203cc",
                          "typeString": "literal_string \"Message already processed\""
                        },
                        "value": "Message already processed"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_ce52e83d839057c6eded6c3ade48bb15cfa535fddf47c137ba979ab4aea203cc",
                          "typeString": "literal_string \"Message already processed\""
                        }
                      ],
                      "id": 96,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1334:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 103,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1334:66:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 104,
                  "nodeType": "ExpressionStatement",
                  "src": "1334:66:0"
                },
                {
                  "expression": {
                    "id": 110,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 105,
                        "name": "_completedMessages",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 29,
                        "src": "1410:18:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_bytes32_$_t_bool_$",
                          "typeString": "mapping(bytes32 => bool)"
                        }
                      },
                      "id": 108,
                      "indexExpression": {
                        "expression": {
                          "id": 106,
                          "name": "vm",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 70,
                          "src": "1429:2:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_VM_$329_memory_ptr",
                            "typeString": "struct Structs.VM memory"
                          }
                        },
                        "id": 107,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "hash",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 328,
                        "src": "1429:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1410:27:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "74727565",
                      "id": 109,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1440:4:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "1410:34:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 111,
                  "nodeType": "ExpressionStatement",
                  "src": "1410:34:0"
                },
                {
                  "expression": {
                    "id": 118,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 112,
                      "name": "current_msg",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4,
                      "src": "1478:11:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage",
                        "typeString": "string storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "expression": {
                            "id": 115,
                            "name": "vm",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 70,
                            "src": "1499:2:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_VM_$329_memory_ptr",
                              "typeString": "struct Structs.VM memory"
                            }
                          },
                          "id": 116,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "payload",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 320,
                          "src": "1499:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        ],
                        "id": 114,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1492:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                          "typeString": "type(string storage pointer)"
                        },
                        "typeName": {
                          "id": 113,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "1492:6:0",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 117,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1492:18:0",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "src": "1478:32:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "id": 119,
                  "nodeType": "ExpressionStatement",
                  "src": "1478:32:0"
                }
              ]
            },
            "functionSelector": "496d76ff",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "receiveEncodedMsg",
            "nameLocation": "704:17:0",
            "parameters": {
              "id": 64,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 63,
                  "mutability": "mutable",
                  "name": "encodedMsg",
                  "nameLocation": "735:10:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 121,
                  "src": "722:23:0",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 62,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "722:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "721:25:0"
            },
            "returnParameters": {
              "id": 65,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "754:0:0"
            },
            "scope": 153,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 129,
            "nodeType": "FunctionDefinition",
            "src": "1523:95:0",
            "body": {
              "id": 128,
              "nodeType": "Block",
              "src": "1583:35:0",
              "statements": [
                {
                  "expression": {
                    "id": 126,
                    "name": "current_msg",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4,
                    "src": "1600:11:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "functionReturnParameters": 125,
                  "id": 127,
                  "nodeType": "Return",
                  "src": "1593:18:0"
                }
              ]
            },
            "functionSelector": "ff206cf8",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getCurrentMsg",
            "nameLocation": "1532:13:0",
            "parameters": {
              "id": 122,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1545:2:0"
            },
            "returnParameters": {
              "id": 125,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 124,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 129,
                  "src": "1569:13:0",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 123,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1569:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1568:15:0"
            },
            "scope": 153,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 152,
            "nodeType": "FunctionDefinition",
            "src": "1753:228:0",
            "body": {
              "id": 151,
              "nodeType": "Block",
              "src": "1839:142:0",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 141,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "expression": {
                            "id": 138,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "1857:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 139,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "1857:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "id": 140,
                          "name": "owner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 25,
                          "src": "1871:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "1857:19:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "4f6e6c79206f776e65722063616e207265676973746572206e657720636861696e7321",
                        "id": 142,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1878:37:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_698f093739048e0d0d04d257a772e914828254033190db3d927fdda8176c85a9",
                          "typeString": "literal_string \"Only owner can register new chains!\""
                        },
                        "value": "Only owner can register new chains!"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_698f093739048e0d0d04d257a772e914828254033190db3d927fdda8176c85a9",
                          "typeString": "literal_string \"Only owner can register new chains!\""
                        }
                      ],
                      "id": 137,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1849:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 143,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1849:67:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 144,
                  "nodeType": "ExpressionStatement",
                  "src": "1849:67:0"
                },
                {
                  "expression": {
                    "id": 149,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 145,
                        "name": "_applicationContracts",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 23,
                        "src": "1926:21:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint16_$_t_bytes32_$",
                          "typeString": "mapping(uint16 => bytes32)"
                        }
                      },
                      "id": 147,
                      "indexExpression": {
                        "id": 146,
                        "name": "chainId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 132,
                        "src": "1948:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1926:30:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 148,
                      "name": "applicationAddr",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 134,
                      "src": "1959:15:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "src": "1926:48:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "id": 150,
                  "nodeType": "ExpressionStatement",
                  "src": "1926:48:0"
                }
              ]
            },
            "documentation": {
              "id": 130,
              "nodeType": "StructuredDocumentation",
              "src": "1623:125:0",
              "text": "Registers it's sibling applications on other chains as the only ones that can send this instance messages"
            },
            "functionSelector": "5f327e1c",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "registerApplicationContracts",
            "nameLocation": "1762:28:0",
            "parameters": {
              "id": 135,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 132,
                  "mutability": "mutable",
                  "name": "chainId",
                  "nameLocation": "1798:7:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 152,
                  "src": "1791:14:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint16",
                    "typeString": "uint16"
                  },
                  "typeName": {
                    "id": 131,
                    "name": "uint16",
                    "nodeType": "ElementaryTypeName",
                    "src": "1791:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint16",
                      "typeString": "uint16"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 134,
                  "mutability": "mutable",
                  "name": "applicationAddr",
                  "nameLocation": "1815:15:0",
                  "nodeType": "VariableDeclaration",
                  "scope": 152,
                  "src": "1807:23:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 133,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1807:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1790:41:0"
            },
            "returnParameters": {
              "id": 136,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1839:0:0"
            },
            "scope": 153,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "abstract": false,
        "baseContracts": [],
        "canonicalName": "Messenger",
        "contractDependencies": [],
        "contractKind": "contract",
        "fullyImplemented": true,
        "linearizedBaseContracts": [
          153
        ],
        "name": "Messenger",
        "nameLocation": "107:9:0",
        "scope": 154,
        "usedErrors": []
      }
    ],
    "license": "Unlicense"
  },
  "id": 0
}