{
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "originAndNonce",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "liquidityProvider",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Receive",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "toDomain",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "toId",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "toHook",
          "type": "bool"
        }
      ],
      "name": "Send",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DUST_AMOUNT",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "VERSION",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_domain",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_id",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "_custom",
          "type": "address"
        }
      ],
      "name": "enrollCustom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "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": [
        {
          "internalType": "address",
          "name": "_tokenRegistry",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_xAppConnectionManager",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "liquidityProvider",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_oldRepr",
          "type": "address"
        }
      ],
      "name": "migrate",
      "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": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "_destination",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_recipient",
          "type": "bytes32"
        },
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "name": "send",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "_destination",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_remoteHook",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_extraData",
          "type": "bytes"
        }
      ],
      "name": "sendToHook",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_xAppConnectionManager",
          "type": "address"
        }
      ],
      "name": "setXAppConnectionManager",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "tokenRegistry",
      "outputs": [
        {
          "internalType": "contract ITokenRegistry",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "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"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "bytecode": {
    "object": "0x",
    "sourceMap": "",
    "linkReferences": {}
  },
  "deployedBytecode": {
    "object": "0x",
    "sourceMap": "",
    "linkReferences": {}
  },
  "methodIdentifiers": {
    "DUST_AMOUNT()": "97f641ab",
    "VERSION()": "ffa1ad74",
    "enrollCustom(uint32,bytes32,address)": "28b1aea0",
    "enrollRemoteRouter(uint32,bytes32)": "b49c53a7",
    "handle(uint32,uint32,bytes32,bytes)": "ab2dc3f5",
    "initialize(address,address)": "485cc955",
    "liquidityProvider(bytes32)": "546d573d",
    "migrate(address)": "ce5494bb",
    "owner()": "8da5cb5b",
    "remotes(uint32)": "83bbb806",
    "renounceOwnership()": "715018a6",
    "send(address,uint256,uint32,bytes32,bool)": "a9bd1226",
    "sendToHook(address,uint256,uint32,bytes32,bytes)": "bc7dbab3",
    "setXAppConnectionManager(address)": "41bdc8b5",
    "tokenRegistry()": "9d23c4c7",
    "transferOwnership(address)": "f2fde38b",
    "xAppConnectionManager()": "3339df96"
  },
  "ast": {
    "absolutePath": "packages/contracts-bridge/contracts/BridgeRouter.sol",
    "id": 31251,
    "exportedSymbols": {
      "BaseBridgeRouter": [
        31120
      ],
      "BridgeMessage": [
        30301
      ],
      "BridgeRouter": [
        31124
      ],
      "EthereumBridgeRouter": [
        31250
      ],
      "Home": [
        43790
      ],
      "IBridgeHook": [
        33543
      ],
      "IBridgeToken": [
        33609
      ],
      "IERC20": [
        27517
      ],
      "IEventAccountant": [
        33635
      ],
      "ITokenRegistry": [
        33703
      ],
      "Router": [
        46768
      ],
      "SafeERC20": [
        27730
      ],
      "TypeCasts": [
        46345
      ],
      "TypedMemView": [
        29602
      ],
      "Version0": [
        44622
      ],
      "XAppConnectionClient": [
        46866
      ]
    },
    "nodeType": "SourceUnit",
    "src": "46:21672:34",
    "nodes": [
      {
        "id": 30303,
        "nodeType": "PragmaDirective",
        "src": "46:22:34",
        "literals": [
          "solidity",
          "0.7",
          ".6"
        ]
      },
      {
        "id": 30305,
        "nodeType": "ImportDirective",
        "src": "116:50:34",
        "absolutePath": "packages/contracts-bridge/contracts/BridgeMessage.sol",
        "file": "./BridgeMessage.sol",
        "scope": 31251,
        "sourceUnit": 30302,
        "symbolAliases": [
          {
            "foreign": {
              "id": 30304,
              "name": "BridgeMessage",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "124:13:34",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 30307,
        "nodeType": "ImportDirective",
        "src": "167:59:34",
        "absolutePath": "packages/contracts-bridge/contracts/interfaces/IBridgeToken.sol",
        "file": "./interfaces/IBridgeToken.sol",
        "scope": 31251,
        "sourceUnit": 33610,
        "symbolAliases": [
          {
            "foreign": {
              "id": 30306,
              "name": "IBridgeToken",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "175:12:34",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 30309,
        "nodeType": "ImportDirective",
        "src": "227:63:34",
        "absolutePath": "packages/contracts-bridge/contracts/interfaces/ITokenRegistry.sol",
        "file": "./interfaces/ITokenRegistry.sol",
        "scope": 31251,
        "sourceUnit": 33704,
        "symbolAliases": [
          {
            "foreign": {
              "id": 30308,
              "name": "ITokenRegistry",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "235:14:34",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 30311,
        "nodeType": "ImportDirective",
        "src": "291:57:34",
        "absolutePath": "packages/contracts-bridge/contracts/interfaces/IBridgeHook.sol",
        "file": "./interfaces/IBridgeHook.sol",
        "scope": 31251,
        "sourceUnit": 33544,
        "symbolAliases": [
          {
            "foreign": {
              "id": 30310,
              "name": "IBridgeHook",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "299:11:34",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 30313,
        "nodeType": "ImportDirective",
        "src": "349:67:34",
        "absolutePath": "packages/contracts-bridge/contracts/interfaces/IEventAccountant.sol",
        "file": "./interfaces/IEventAccountant.sol",
        "scope": 31251,
        "sourceUnit": 33636,
        "symbolAliases": [
          {
            "foreign": {
              "id": 30312,
              "name": "IEventAccountant",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "357:16:34",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 30315,
        "nodeType": "ImportDirective",
        "src": "463:100:34",
        "absolutePath": "packages/contracts-router/contracts/XAppConnectionClient.sol",
        "file": "@nomad-xyz/contracts-router/contracts/XAppConnectionClient.sol",
        "scope": 31251,
        "sourceUnit": 46867,
        "symbolAliases": [
          {
            "foreign": {
              "id": 30314,
              "name": "XAppConnectionClient",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "471:20:34",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 30317,
        "nodeType": "ImportDirective",
        "src": "564:72:34",
        "absolutePath": "packages/contracts-router/contracts/Router.sol",
        "file": "@nomad-xyz/contracts-router/contracts/Router.sol",
        "scope": 31251,
        "sourceUnit": 46769,
        "symbolAliases": [
          {
            "foreign": {
              "id": 30316,
              "name": "Router",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "572:6:34",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 30319,
        "nodeType": "ImportDirective",
        "src": "637:66:34",
        "absolutePath": "packages/contracts-core/contracts/Home.sol",
        "file": "@nomad-xyz/contracts-core/contracts/Home.sol",
        "scope": 31251,
        "sourceUnit": 43791,
        "symbolAliases": [
          {
            "foreign": {
              "id": 30318,
              "name": "Home",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "645:4:34",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 30321,
        "nodeType": "ImportDirective",
        "src": "704:81:34",
        "absolutePath": "packages/contracts-core/contracts/libs/TypeCasts.sol",
        "file": "@nomad-xyz/contracts-core/contracts/libs/TypeCasts.sol",
        "scope": 31251,
        "sourceUnit": 46346,
        "symbolAliases": [
          {
            "foreign": {
              "id": 30320,
              "name": "TypeCasts",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "712:9:34",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 30323,
        "nodeType": "ImportDirective",
        "src": "786:74:34",
        "absolutePath": "packages/contracts-core/contracts/Version0.sol",
        "file": "@nomad-xyz/contracts-core/contracts/Version0.sol",
        "scope": 31251,
        "sourceUnit": 44623,
        "symbolAliases": [
          {
            "foreign": {
              "id": 30322,
              "name": "Version0",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "794:8:34",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 30325,
        "nodeType": "ImportDirective",
        "src": "861:78:34",
        "absolutePath": "node_modules/@summa-tx/memview-sol/contracts/TypedMemView.sol",
        "file": "@summa-tx/memview-sol/contracts/TypedMemView.sol",
        "scope": 31251,
        "sourceUnit": 29603,
        "symbolAliases": [
          {
            "foreign": {
              "id": 30324,
              "name": "TypedMemView",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "869:12:34",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 30327,
        "nodeType": "ImportDirective",
        "src": "940:70:34",
        "absolutePath": "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol",
        "file": "@openzeppelin/contracts/token/ERC20/IERC20.sol",
        "scope": 31251,
        "sourceUnit": 27518,
        "symbolAliases": [
          {
            "foreign": {
              "id": 30326,
              "name": "IERC20",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "948:6:34",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 30329,
        "nodeType": "ImportDirective",
        "src": "1011:76:34",
        "absolutePath": "node_modules/@openzeppelin/contracts/token/ERC20/SafeERC20.sol",
        "file": "@openzeppelin/contracts/token/ERC20/SafeERC20.sol",
        "scope": 31251,
        "sourceUnit": 27731,
        "symbolAliases": [
          {
            "foreign": {
              "id": 30328,
              "name": "SafeERC20",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "1019:9:34",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 31120,
        "nodeType": "ContractDefinition",
        "src": "1124:18431:34",
        "nodes": [
          {
            "id": 30337,
            "nodeType": "UsingForDirective",
            "src": "1229:29:34",
            "libraryName": {
              "id": 30335,
              "name": "TypedMemView",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 29602,
              "src": "1235:12:34",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_TypedMemView_$29602",
                "typeString": "library TypedMemView"
              }
            },
            "typeName": {
              "id": 30336,
              "name": "bytes",
              "nodeType": "ElementaryTypeName",
              "src": "1252:5:34",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes_storage_ptr",
                "typeString": "bytes"
              }
            }
          },
          {
            "id": 30340,
            "nodeType": "UsingForDirective",
            "src": "1263:31:34",
            "libraryName": {
              "id": 30338,
              "name": "TypedMemView",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 29602,
              "src": "1269:12:34",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_TypedMemView_$29602",
                "typeString": "library TypedMemView"
              }
            },
            "typeName": {
              "id": 30339,
              "name": "bytes29",
              "nodeType": "ElementaryTypeName",
              "src": "1286:7:34",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes29",
                "typeString": "bytes29"
              }
            }
          },
          {
            "id": 30343,
            "nodeType": "UsingForDirective",
            "src": "1299:32:34",
            "libraryName": {
              "id": 30341,
              "name": "BridgeMessage",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 30301,
              "src": "1305:13:34",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_BridgeMessage_$30301",
                "typeString": "library BridgeMessage"
              }
            },
            "typeName": {
              "id": 30342,
              "name": "bytes29",
              "nodeType": "ElementaryTypeName",
              "src": "1323:7:34",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes29",
                "typeString": "bytes29"
              }
            }
          },
          {
            "id": 30346,
            "nodeType": "UsingForDirective",
            "src": "1336:27:34",
            "libraryName": {
              "id": 30344,
              "name": "SafeERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 27730,
              "src": "1342:9:34",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeERC20_$27730",
                "typeString": "library SafeERC20"
              }
            },
            "typeName": {
              "id": 30345,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 27517,
              "src": "1356:6:34",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$27517",
                "typeString": "contract IERC20"
              }
            }
          },
          {
            "id": 30349,
            "nodeType": "VariableDeclaration",
            "src": "1474:48:34",
            "constant": true,
            "functionSelector": "97f641ab",
            "mutability": "constant",
            "name": "DUST_AMOUNT",
            "scope": 31120,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 30347,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "1474:7:34",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "hexValue": "302e3036",
              "id": 30348,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "1512:10:34",
              "subdenomination": "ether",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_60000000000000000_by_1",
                "typeString": "int_const 60000000000000000"
              },
              "value": "0.06"
            },
            "visibility": "public"
          },
          {
            "id": 30351,
            "nodeType": "VariableDeclaration",
            "src": "1638:35:34",
            "constant": false,
            "functionSelector": "9d23c4c7",
            "mutability": "mutable",
            "name": "tokenRegistry",
            "scope": 31120,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_ITokenRegistry_$33703",
              "typeString": "contract ITokenRegistry"
            },
            "typeName": {
              "id": 30350,
              "name": "ITokenRegistry",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 33703,
              "src": "1638:14:34",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ITokenRegistry_$33703",
                "typeString": "contract ITokenRegistry"
              }
            },
            "visibility": "public"
          },
          {
            "id": 30355,
            "nodeType": "VariableDeclaration",
            "src": "1838:52:34",
            "constant": false,
            "functionSelector": "546d573d",
            "mutability": "mutable",
            "name": "liquidityProvider",
            "scope": 31120,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_bytes32_$_t_address_$",
              "typeString": "mapping(bytes32 => address)"
            },
            "typeName": {
              "id": 30354,
              "keyType": {
                "id": 30352,
                "name": "bytes32",
                "nodeType": "ElementaryTypeName",
                "src": "1846:7:34",
                "typeDescriptions": {
                  "typeIdentifier": "t_bytes32",
                  "typeString": "bytes32"
                }
              },
              "nodeType": "Mapping",
              "src": "1838:27:34",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_bytes32_$_t_address_$",
                "typeString": "mapping(bytes32 => address)"
              },
              "valueType": {
                "id": 30353,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "1857:7:34",
                "stateMutability": "nonpayable",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              }
            },
            "visibility": "public"
          },
          {
            "id": 30359,
            "nodeType": "VariableDeclaration",
            "src": "1973:25:34",
            "constant": false,
            "mutability": "mutable",
            "name": "__GAP",
            "scope": 31120,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_uint256_$49_storage",
              "typeString": "uint256[49]"
            },
            "typeName": {
              "baseType": {
                "id": 30356,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "1973:7:34",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "id": 30358,
              "length": {
                "hexValue": "3439",
                "id": 30357,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "1981:2:34",
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_49_by_1",
                  "typeString": "int_const 49"
                },
                "value": "49"
              },
              "nodeType": "ArrayTypeName",
              "src": "1973:11:34",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_uint256_$49_storage_ptr",
                "typeString": "uint256[49]"
              }
            },
            "visibility": "private"
          },
          {
            "id": 30374,
            "nodeType": "EventDefinition",
            "src": "2523:178:34",
            "anonymous": false,
            "documentation": {
              "id": 30360,
              "nodeType": "StructuredDocumentation",
              "src": "2039:479:34",
              "text": " @notice emitted when tokens are sent from this domain to another domain\n @param token the address of the token contract\n @param from the address sending tokens\n @param toDomain the domain of the chain the tokens are being sent to\n @param toId the bytes32 address of the recipient of the tokens\n @param amount the amount of tokens sent\n @param toHook True if sent to a hook, on the remote chain, false\n        otherwise"
            },
            "name": "Send",
            "parameters": {
              "id": 30373,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30362,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 30374,
                  "src": "2543:21:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30361,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2543:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30364,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "scope": 30374,
                  "src": "2574:20:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30363,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2574:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30366,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "toDomain",
                  "nodeType": "VariableDeclaration",
                  "scope": 30374,
                  "src": "2604:23:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 30365,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2604:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30368,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "toId",
                  "nodeType": "VariableDeclaration",
                  "scope": 30374,
                  "src": "2637:12:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 30367,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2637:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30370,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 30374,
                  "src": "2659:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 30369,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2659:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30372,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "toHook",
                  "nodeType": "VariableDeclaration",
                  "scope": 30374,
                  "src": "2683:11:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 30371,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2683:4:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2533:167:34"
            }
          },
          {
            "id": 30387,
            "nodeType": "EventDefinition",
            "src": "3336:184:34",
            "anonymous": false,
            "documentation": {
              "id": 30375,
              "nodeType": "StructuredDocumentation",
              "src": "2707:624:34",
              "text": " @notice emitted when tokens are dispensed to an account on this domain\n @param originAndNonce Domain where the transfer originated and the\n        unique identifier for the message from origin to destination,\n        combined in a single field ((origin << 32) & nonce)\n @param token The address of the local token contract being received\n @param recipient The address receiving the tokens; the original\n        recipient of the transfer\n @param liquidityProvider DEPRECATED; The account providing liquidity\n @param amount The amount of tokens being received"
            },
            "name": "Receive",
            "parameters": {
              "id": 30386,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30377,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "originAndNonce",
                  "nodeType": "VariableDeclaration",
                  "scope": 30387,
                  "src": "3359:29:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 30376,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "3359:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30379,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 30387,
                  "src": "3398:21:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30378,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3398:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30381,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "recipient",
                  "nodeType": "VariableDeclaration",
                  "scope": 30387,
                  "src": "3429:25:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30380,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3429:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30383,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "liquidityProvider",
                  "nodeType": "VariableDeclaration",
                  "scope": 30387,
                  "src": "3464:25:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30382,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3464:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30385,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 30387,
                  "src": "3499:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 30384,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3499:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3349:170:34"
            }
          },
          {
            "id": 30391,
            "nodeType": "FunctionDefinition",
            "src": "3558:29:34",
            "body": {
              "id": 30390,
              "nodeType": "Block",
              "src": "3585:2:34",
              "statements": []
            },
            "implemented": true,
            "kind": "receive",
            "modifiers": [],
            "name": "",
            "parameters": {
              "id": 30388,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3565:2:34"
            },
            "returnParameters": {
              "id": 30389,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3585:0:34"
            },
            "scope": 31120,
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 30411,
            "nodeType": "FunctionDefinition",
            "src": "3631:245:34",
            "body": {
              "id": 30410,
              "nodeType": "Block",
              "src": "3746:130:34",
              "statements": [
                {
                  "expression": {
                    "id": 30404,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 30400,
                      "name": "tokenRegistry",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 30351,
                      "src": "3756:13:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ITokenRegistry_$33703",
                        "typeString": "contract ITokenRegistry"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 30402,
                          "name": "_tokenRegistry",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30393,
                          "src": "3787:14:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 30401,
                        "name": "ITokenRegistry",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 33703,
                        "src": "3772:14:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_ITokenRegistry_$33703_$",
                          "typeString": "type(contract ITokenRegistry)"
                        }
                      },
                      "id": 30403,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3772:30:34",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ITokenRegistry_$33703",
                        "typeString": "contract ITokenRegistry"
                      }
                    },
                    "src": "3756:46:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ITokenRegistry_$33703",
                      "typeString": "contract ITokenRegistry"
                    }
                  },
                  "id": 30405,
                  "nodeType": "ExpressionStatement",
                  "src": "3756:46:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 30407,
                        "name": "_xAppConnectionManager",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30395,
                        "src": "3846:22:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 30406,
                      "name": "__XAppConnectionClient_initialize",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46814,
                      "src": "3812:33:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 30408,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3812:57:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30409,
                  "nodeType": "ExpressionStatement",
                  "src": "3812:57:34"
                }
              ]
            },
            "functionSelector": "485cc955",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 30398,
                "modifierName": {
                  "id": 30397,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 23659,
                  "src": "3730:11:34",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "3730:11:34"
              }
            ],
            "name": "initialize",
            "parameters": {
              "id": 30396,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30393,
                  "mutability": "mutable",
                  "name": "_tokenRegistry",
                  "nodeType": "VariableDeclaration",
                  "scope": 30411,
                  "src": "3651:22:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30392,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3651:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30395,
                  "mutability": "mutable",
                  "name": "_xAppConnectionManager",
                  "nodeType": "VariableDeclaration",
                  "scope": 30411,
                  "src": "3675:30:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30394,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3675:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3650:56:34"
            },
            "returnParameters": {
              "id": 30399,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3746:0:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 30482,
            "nodeType": "FunctionDefinition",
            "src": "4201:734:34",
            "body": {
              "id": 30481,
              "nodeType": "Block",
              "src": "4391:544:34",
              "statements": [
                {
                  "assignments": [
                    30431
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30431,
                      "mutability": "mutable",
                      "name": "_msg",
                      "nodeType": "VariableDeclaration",
                      "scope": 30481,
                      "src": "4450:12:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes29",
                        "typeString": "bytes29"
                      },
                      "typeName": {
                        "id": 30430,
                        "name": "bytes29",
                        "nodeType": "ElementaryTypeName",
                        "src": "4450:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30438,
                  "initialValue": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "arguments": [
                          {
                            "hexValue": "30",
                            "id": 30434,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4478:1:34",
                            "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"
                            }
                          ],
                          "expression": {
                            "id": 30432,
                            "name": "_message",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30420,
                            "src": "4465:8:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          },
                          "id": 30433,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "ref",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 28766,
                          "src": "4465:12:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint40_$returns$_t_bytes29_$bound_to$_t_bytes_memory_ptr_$",
                            "typeString": "function (bytes memory,uint40) pure returns (bytes29)"
                          }
                        },
                        "id": 30435,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4465:15:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "id": 30436,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "mustBeMessage",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 30300,
                      "src": "4465:29:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_bytes29_$bound_to$_t_bytes29_$",
                        "typeString": "function (bytes29) pure returns (bytes29)"
                      }
                    },
                    "id": 30437,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4465:31:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4450:46:34"
                },
                {
                  "assignments": [
                    30440
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30440,
                      "mutability": "mutable",
                      "name": "_tokenId",
                      "nodeType": "VariableDeclaration",
                      "scope": 30481,
                      "src": "4506:16:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes29",
                        "typeString": "bytes29"
                      },
                      "typeName": {
                        "id": 30439,
                        "name": "bytes29",
                        "nodeType": "ElementaryTypeName",
                        "src": "4506:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30444,
                  "initialValue": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "id": 30441,
                        "name": "_msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30431,
                        "src": "4525:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "id": 30442,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "tokenId",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 30152,
                      "src": "4525:12:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_bytes29_$bound_to$_t_bytes29_$",
                        "typeString": "function (bytes29) pure returns (bytes29)"
                      }
                    },
                    "id": 30443,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4525:14:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4506:33:34"
                },
                {
                  "assignments": [
                    30446
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30446,
                      "mutability": "mutable",
                      "name": "_action",
                      "nodeType": "VariableDeclaration",
                      "scope": 30481,
                      "src": "4549:15:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes29",
                        "typeString": "bytes29"
                      },
                      "typeName": {
                        "id": 30445,
                        "name": "bytes29",
                        "nodeType": "ElementaryTypeName",
                        "src": "4549:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30450,
                  "initialValue": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "id": 30447,
                        "name": "_msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30431,
                        "src": "4567:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "id": 30448,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "action",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 30258,
                      "src": "4567:11:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_bytes29_$bound_to$_t_bytes29_$",
                        "typeString": "function (bytes29) pure returns (bytes29)"
                      }
                    },
                    "id": 30449,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4567:13:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4549:31:34"
                },
                {
                  "condition": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "id": 30451,
                        "name": "_action",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30446,
                        "src": "4649:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "id": 30452,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "isTransfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 29809,
                      "src": "4649:18:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_bool_$bound_to$_t_bytes29_$",
                        "typeString": "function (bytes29) pure returns (bool)"
                      }
                    },
                    "id": 30453,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4649:20:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "condition": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "expression": {
                          "id": 30462,
                          "name": "_action",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30446,
                          "src": "4757:7:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes29",
                            "typeString": "bytes29"
                          }
                        },
                        "id": 30463,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "isTransferToHook",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 29824,
                        "src": "4757:24:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_bool_$bound_to$_t_bytes29_$",
                          "typeString": "function (bytes29) pure returns (bool)"
                        }
                      },
                      "id": 30464,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4757:26:34",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseBody": {
                      "id": 30478,
                      "nodeType": "Block",
                      "src": "4873:56:34",
                      "statements": [
                        {
                          "expression": {
                            "arguments": [
                              {
                                "hexValue": "66616c7365",
                                "id": 30474,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "4895:5:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              {
                                "hexValue": "2176616c696420616374696f6e",
                                "id": 30475,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "4902:15:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_ea7f0865b907d858ed23abe8efcde730894a1561e37eb14d73dffa15b8573a4d",
                                  "typeString": "literal_string \"!valid action\""
                                },
                                "value": "!valid action"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_ea7f0865b907d858ed23abe8efcde730894a1561e37eb14d73dffa15b8573a4d",
                                  "typeString": "literal_string \"!valid action\""
                                }
                              ],
                              "id": 30473,
                              "name": "require",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [
                                -18,
                                -18
                              ],
                              "referencedDeclaration": -18,
                              "src": "4887:7:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                "typeString": "function (bool,string memory) pure"
                              }
                            },
                            "id": 30476,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "4887:31:34",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$__$",
                              "typeString": "tuple()"
                            }
                          },
                          "id": 30477,
                          "nodeType": "ExpressionStatement",
                          "src": "4887:31:34"
                        }
                      ]
                    },
                    "id": 30479,
                    "nodeType": "IfStatement",
                    "src": "4753:176:34",
                    "trueBody": {
                      "id": 30472,
                      "nodeType": "Block",
                      "src": "4785:82:34",
                      "statements": [
                        {
                          "expression": {
                            "arguments": [
                              {
                                "id": 30466,
                                "name": "_origin",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 30414,
                                "src": "4821:7:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              {
                                "id": 30467,
                                "name": "_nonce",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 30416,
                                "src": "4830:6:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              {
                                "id": 30468,
                                "name": "_tokenId",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 30440,
                                "src": "4838:8:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes29",
                                  "typeString": "bytes29"
                                }
                              },
                              {
                                "id": 30469,
                                "name": "_action",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 30446,
                                "src": "4848:7:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes29",
                                  "typeString": "bytes29"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                },
                                {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                },
                                {
                                  "typeIdentifier": "t_bytes29",
                                  "typeString": "bytes29"
                                },
                                {
                                  "typeIdentifier": "t_bytes29",
                                  "typeString": "bytes29"
                                }
                              ],
                              "id": 30465,
                              "name": "_handleTransferToHook",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30943,
                              "src": "4799:21:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$_t_uint32_$_t_bytes29_$_t_bytes29_$returns$__$",
                                "typeString": "function (uint32,uint32,bytes29,bytes29)"
                              }
                            },
                            "id": 30470,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "4799:57:34",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$__$",
                              "typeString": "tuple()"
                            }
                          },
                          "id": 30471,
                          "nodeType": "ExpressionStatement",
                          "src": "4799:57:34"
                        }
                      ]
                    }
                  },
                  "id": 30480,
                  "nodeType": "IfStatement",
                  "src": "4645:284:34",
                  "trueBody": {
                    "id": 30461,
                    "nodeType": "Block",
                    "src": "4671:76:34",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 30455,
                              "name": "_origin",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30414,
                              "src": "4701:7:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            },
                            {
                              "id": 30456,
                              "name": "_nonce",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30416,
                              "src": "4710:6:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            },
                            {
                              "id": 30457,
                              "name": "_tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30440,
                              "src": "4718:8:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes29",
                                "typeString": "bytes29"
                              }
                            },
                            {
                              "id": 30458,
                              "name": "_action",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30446,
                              "src": "4728:7:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes29",
                                "typeString": "bytes29"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              },
                              {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              },
                              {
                                "typeIdentifier": "t_bytes29",
                                "typeString": "bytes29"
                              },
                              {
                                "typeIdentifier": "t_bytes29",
                                "typeString": "bytes29"
                              }
                            ],
                            "id": 30454,
                            "name": "_handleTransfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30874,
                            "src": "4685:15:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$_t_uint32_$_t_bytes29_$_t_bytes29_$returns$__$",
                              "typeString": "function (uint32,uint32,bytes29,bytes29)"
                            }
                          },
                          "id": 30459,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4685:51:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 30460,
                        "nodeType": "ExpressionStatement",
                        "src": "4685:51:34"
                      }
                    ]
                  }
                }
              ]
            },
            "baseFunctions": [
              46718
            ],
            "documentation": {
              "id": 30412,
              "nodeType": "StructuredDocumentation",
              "src": "3926:270:34",
              "text": " @notice Handles an incoming message\n @param _origin The origin domain\n @param _nonce The unique identifier for the message from origin to\n        destination\n @param _sender The sender address\n @param _message The message"
            },
            "functionSelector": "ab2dc3f5",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 30424,
                "modifierName": {
                  "id": 30423,
                  "name": "onlyReplica",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 46797,
                  "src": "4344:11:34",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "4344:11:34"
              },
              {
                "arguments": [
                  {
                    "id": 30426,
                    "name": "_origin",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 30414,
                    "src": "4373:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  {
                    "id": 30427,
                    "name": "_sender",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 30418,
                    "src": "4382:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  }
                ],
                "id": 30428,
                "modifierName": {
                  "id": 30425,
                  "name": "onlyRemoteRouter",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 46677,
                  "src": "4356:16:34",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_uint32_$_t_bytes32_$",
                    "typeString": "modifier (uint32,bytes32)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "4356:34:34"
              }
            ],
            "name": "handle",
            "overrides": {
              "id": 30422,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "4335:8:34"
            },
            "parameters": {
              "id": 30421,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30414,
                  "mutability": "mutable",
                  "name": "_origin",
                  "nodeType": "VariableDeclaration",
                  "scope": 30482,
                  "src": "4226:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 30413,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4226:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30416,
                  "mutability": "mutable",
                  "name": "_nonce",
                  "nodeType": "VariableDeclaration",
                  "scope": 30482,
                  "src": "4250:13:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 30415,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4250:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30418,
                  "mutability": "mutable",
                  "name": "_sender",
                  "nodeType": "VariableDeclaration",
                  "scope": 30482,
                  "src": "4273:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 30417,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4273:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30420,
                  "mutability": "mutable",
                  "name": "_message",
                  "nodeType": "VariableDeclaration",
                  "scope": 30482,
                  "src": "4298:21:34",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 30419,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4298:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4216:109:34"
            },
            "returnParameters": {
              "id": 30429,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4391:0:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 30550,
            "nodeType": "FunctionDefinition",
            "src": "5240:977:34",
            "body": {
              "id": 30549,
              "nodeType": "Block",
              "src": "5468:749:34",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "id": 30502,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 30497,
                          "name": "_recipient",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30491,
                          "src": "5513:10:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "arguments": [
                            {
                              "hexValue": "30",
                              "id": 30500,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5535:1:34",
                              "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": 30499,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "5527:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_bytes32_$",
                              "typeString": "type(bytes32)"
                            },
                            "typeName": {
                              "id": 30498,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "5527:7:34",
                              "typeDescriptions": {}
                            }
                          },
                          "id": 30501,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5527:10:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "src": "5513:24:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "217265636970",
                        "id": 30503,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5539:8:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_a2e0c3249efa7ab9076bbebcf16dbdd7f0a3f271725c707b05bd754b2ca237ca",
                          "typeString": "literal_string \"!recip\""
                        },
                        "value": "!recip"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_a2e0c3249efa7ab9076bbebcf16dbdd7f0a3f271725c707b05bd754b2ca237ca",
                          "typeString": "literal_string \"!recip\""
                        }
                      ],
                      "id": 30496,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "5505:7:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 30504,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5505:43:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30505,
                  "nodeType": "ExpressionStatement",
                  "src": "5505:43:34"
                },
                {
                  "assignments": [
                    30507,
                    30509
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30507,
                      "mutability": "mutable",
                      "name": "_tokenId",
                      "nodeType": "VariableDeclaration",
                      "scope": 30549,
                      "src": "5599:16:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes29",
                        "typeString": "bytes29"
                      },
                      "typeName": {
                        "id": 30506,
                        "name": "bytes29",
                        "nodeType": "ElementaryTypeName",
                        "src": "5599:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 30509,
                      "mutability": "mutable",
                      "name": "_detailsHash",
                      "nodeType": "VariableDeclaration",
                      "scope": 30549,
                      "src": "5617:20:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "typeName": {
                        "id": 30508,
                        "name": "bytes32",
                        "nodeType": "ElementaryTypeName",
                        "src": "5617:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30514,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 30511,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30485,
                        "src": "5653:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 30512,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30487,
                        "src": "5661:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 30510,
                      "name": "_takeTokens",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 30811,
                      "src": "5641:11:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bytes29_$_t_bytes32_$",
                        "typeString": "function (address,uint256) returns (bytes29,bytes32)"
                      }
                    },
                    "id": 30513,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5641:28:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bytes29_$_t_bytes32_$",
                      "typeString": "tuple(bytes29,bytes32)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5598:71:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "id": 30520,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 30516,
                          "name": "_destination",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30489,
                          "src": "5700:12:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "id": 30517,
                              "name": "_tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30507,
                              "src": "5716:8:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes29",
                                "typeString": "bytes29"
                              }
                            },
                            "id": 30518,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "domain",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 29983,
                            "src": "5716:15:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_uint32_$bound_to$_t_bytes29_$",
                              "typeString": "function (bytes29) pure returns (uint32)"
                            }
                          },
                          "id": 30519,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5716:17:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "src": "5700:33:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "73656e64732074656d706f726172696c792064697361626c6564",
                        "id": 30521,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5747:28:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_a9cdb9b4b51f8d476cf90b8e6bb2de4c011f73f712f409a6e78be9a6627e511b",
                          "typeString": "literal_string \"sends temporarily disabled\""
                        },
                        "value": "sends temporarily disabled"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_a9cdb9b4b51f8d476cf90b8e6bb2de4c011f73f712f409a6e78be9a6627e511b",
                          "typeString": "literal_string \"sends temporarily disabled\""
                        }
                      ],
                      "id": 30515,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "5679:7:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 30522,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5679:106:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30523,
                  "nodeType": "ExpressionStatement",
                  "src": "5679:106:34"
                },
                {
                  "assignments": [
                    30525
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30525,
                      "mutability": "mutable",
                      "name": "_action",
                      "nodeType": "VariableDeclaration",
                      "scope": 30549,
                      "src": "5830:15:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes29",
                        "typeString": "bytes29"
                      },
                      "typeName": {
                        "id": 30524,
                        "name": "bytes29",
                        "nodeType": "ElementaryTypeName",
                        "src": "5830:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30532,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 30528,
                        "name": "_recipient",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30491,
                        "src": "5890:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 30529,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30487,
                        "src": "5914:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 30530,
                        "name": "_detailsHash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30509,
                        "src": "5935:12:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "expression": {
                        "id": 30526,
                        "name": "BridgeMessage",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30301,
                        "src": "5848:13:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_BridgeMessage_$30301_$",
                          "typeString": "type(library BridgeMessage)"
                        }
                      },
                      "id": 30527,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "formatTransfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 29853,
                      "src": "5848:28:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint256_$_t_bytes32_$returns$_t_bytes29_$",
                        "typeString": "function (bytes32,uint256,bytes32) pure returns (bytes29)"
                      }
                    },
                    "id": 30531,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5848:109:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5830:127:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 30534,
                        "name": "_destination",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30489,
                        "src": "6047:12:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      {
                        "id": 30535,
                        "name": "_tokenId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30507,
                        "src": "6061:8:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      {
                        "id": 30536,
                        "name": "_action",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30525,
                        "src": "6071:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        },
                        {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      ],
                      "id": 30533,
                      "name": "_sendTransferMessage",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 30843,
                      "src": "6026:20:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$_t_bytes29_$_t_bytes29_$returns$__$",
                        "typeString": "function (uint32,bytes29,bytes29)"
                      }
                    },
                    "id": 30537,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6026:53:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30538,
                  "nodeType": "ExpressionStatement",
                  "src": "6026:53:34"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 30540,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30485,
                        "src": "6149:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 30541,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "6157:3:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 30542,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "6157:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "id": 30543,
                        "name": "_destination",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30489,
                        "src": "6169:12:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      {
                        "id": 30544,
                        "name": "_recipient",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30491,
                        "src": "6183:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 30545,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30487,
                        "src": "6195:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "hexValue": "66616c7365",
                        "id": 30546,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "bool",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6204:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "value": "false"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 30539,
                      "name": "Send",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 30374,
                      "src": "6144:4:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint32_$_t_bytes32_$_t_uint256_$_t_bool_$returns$__$",
                        "typeString": "function (address,address,uint32,bytes32,uint256,bool)"
                      }
                    },
                    "id": 30547,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6144:66:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30548,
                  "nodeType": "EmitStatement",
                  "src": "6139:71:34"
                }
              ]
            },
            "documentation": {
              "id": 30483,
              "nodeType": "StructuredDocumentation",
              "src": "4989:246:34",
              "text": " @notice Send tokens to a recipient on a remote chain\n @param _token The token address\n @param _amount The token amount\n @param _destination The destination domain\n @param _recipient The recipient address"
            },
            "functionSelector": "a9bd1226",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "send",
            "parameters": {
              "id": 30494,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30485,
                  "mutability": "mutable",
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 30550,
                  "src": "5263:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30484,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5263:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30487,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 30550,
                  "src": "5287:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 30486,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5287:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30489,
                  "mutability": "mutable",
                  "name": "_destination",
                  "nodeType": "VariableDeclaration",
                  "scope": 30550,
                  "src": "5312:19:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 30488,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5312:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30491,
                  "mutability": "mutable",
                  "name": "_recipient",
                  "nodeType": "VariableDeclaration",
                  "scope": 30550,
                  "src": "5341:18:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 30490,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5341:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30493,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 30550,
                  "src": "5369:4:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 30492,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "5369:4:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5253:205:34"
            },
            "returnParameters": {
              "id": 30495,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5468:0:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 30624,
            "nodeType": "FunctionDefinition",
            "src": "6584:987:34",
            "body": {
              "id": 30623,
              "nodeType": "Block",
              "src": "6761:810:34",
              "statements": [
                {
                  "assignments": [
                    30565,
                    30567
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30565,
                      "mutability": "mutable",
                      "name": "_tokenId",
                      "nodeType": "VariableDeclaration",
                      "scope": 30623,
                      "src": "6812:16:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes29",
                        "typeString": "bytes29"
                      },
                      "typeName": {
                        "id": 30564,
                        "name": "bytes29",
                        "nodeType": "ElementaryTypeName",
                        "src": "6812:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 30567,
                      "mutability": "mutable",
                      "name": "_detailsHash",
                      "nodeType": "VariableDeclaration",
                      "scope": 30623,
                      "src": "6830:20:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "typeName": {
                        "id": 30566,
                        "name": "bytes32",
                        "nodeType": "ElementaryTypeName",
                        "src": "6830:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30572,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 30569,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30553,
                        "src": "6866:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 30570,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30555,
                        "src": "6874:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 30568,
                      "name": "_takeTokens",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 30811,
                      "src": "6854:11:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bytes29_$_t_bytes32_$",
                        "typeString": "function (address,uint256) returns (bytes29,bytes32)"
                      }
                    },
                    "id": 30571,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6854:28:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bytes29_$_t_bytes32_$",
                      "typeString": "tuple(bytes29,bytes32)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6811:71:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "id": 30579,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 30574,
                          "name": "_remoteHook",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30559,
                          "src": "6900:11:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "arguments": [
                            {
                              "hexValue": "30",
                              "id": 30577,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6923:1:34",
                              "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": 30576,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "6915:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_bytes32_$",
                              "typeString": "type(bytes32)"
                            },
                            "typeName": {
                              "id": 30575,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "6915:7:34",
                              "typeDescriptions": {}
                            }
                          },
                          "id": 30578,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6915:10:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "src": "6900:25:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "21686f6f6b",
                        "id": 30580,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6927:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_880b346687e0121adfe144f0410c28aa1984c794a5d7f7df34cabf0eec678f87",
                          "typeString": "literal_string \"!hook\""
                        },
                        "value": "!hook"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_880b346687e0121adfe144f0410c28aa1984c794a5d7f7df34cabf0eec678f87",
                          "typeString": "literal_string \"!hook\""
                        }
                      ],
                      "id": 30573,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "6892:7:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 30581,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6892:43:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30582,
                  "nodeType": "ExpressionStatement",
                  "src": "6892:43:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "id": 30588,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 30584,
                          "name": "_destination",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30557,
                          "src": "6966:12:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "id": 30585,
                              "name": "_tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30565,
                              "src": "6982:8:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes29",
                                "typeString": "bytes29"
                              }
                            },
                            "id": 30586,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "domain",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 29983,
                            "src": "6982:15:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_uint32_$bound_to$_t_bytes29_$",
                              "typeString": "function (bytes29) pure returns (uint32)"
                            }
                          },
                          "id": 30587,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6982:17:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "src": "6966:33:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "73656e64732074656d706f726172696c792064697361626c6564",
                        "id": 30589,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "7013:28:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_a9cdb9b4b51f8d476cf90b8e6bb2de4c011f73f712f409a6e78be9a6627e511b",
                          "typeString": "literal_string \"sends temporarily disabled\""
                        },
                        "value": "sends temporarily disabled"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_a9cdb9b4b51f8d476cf90b8e6bb2de4c011f73f712f409a6e78be9a6627e511b",
                          "typeString": "literal_string \"sends temporarily disabled\""
                        }
                      ],
                      "id": 30583,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "6945:7:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 30590,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6945:106:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30591,
                  "nodeType": "ExpressionStatement",
                  "src": "6945:106:34"
                },
                {
                  "assignments": [
                    30593
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30593,
                      "mutability": "mutable",
                      "name": "_action",
                      "nodeType": "VariableDeclaration",
                      "scope": 30623,
                      "src": "7101:15:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes29",
                        "typeString": "bytes29"
                      },
                      "typeName": {
                        "id": 30592,
                        "name": "bytes29",
                        "nodeType": "ElementaryTypeName",
                        "src": "7101:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30606,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 30596,
                        "name": "_remoteHook",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30559,
                        "src": "7167:11:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 30597,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30555,
                        "src": "7192:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 30598,
                        "name": "_detailsHash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30567,
                        "src": "7213:12:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "expression": {
                              "id": 30601,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "7266:3:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 30602,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "src": "7266:10:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "expression": {
                            "id": 30599,
                            "name": "TypeCasts",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46345,
                            "src": "7239:9:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_TypeCasts_$46345_$",
                              "typeString": "type(library TypeCasts)"
                            }
                          },
                          "id": 30600,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "addressToBytes32",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 46325,
                          "src": "7239:26:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_address_$returns$_t_bytes32_$",
                            "typeString": "function (address) pure returns (bytes32)"
                          }
                        },
                        "id": 30603,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "7239:38:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 30604,
                        "name": "_extraData",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30561,
                        "src": "7291:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      ],
                      "expression": {
                        "id": 30594,
                        "name": "BridgeMessage",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30301,
                        "src": "7119:13:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_BridgeMessage_$30301_$",
                          "typeString": "type(library BridgeMessage)"
                        }
                      },
                      "id": 30595,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "formatTransferToHook",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 29888,
                      "src": "7119:34:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_bytes29_$",
                        "typeString": "function (bytes32,uint256,bytes32,bytes32,bytes memory) pure returns (bytes29)"
                      }
                    },
                    "id": 30605,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7119:192:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7101:210:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 30608,
                        "name": "_destination",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30557,
                        "src": "7401:12:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      {
                        "id": 30609,
                        "name": "_tokenId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30565,
                        "src": "7415:8:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      {
                        "id": 30610,
                        "name": "_action",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30593,
                        "src": "7425:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        },
                        {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      ],
                      "id": 30607,
                      "name": "_sendTransferMessage",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 30843,
                      "src": "7380:20:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$_t_bytes29_$_t_bytes29_$returns$__$",
                        "typeString": "function (uint32,bytes29,bytes29)"
                      }
                    },
                    "id": 30611,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7380:53:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30612,
                  "nodeType": "ExpressionStatement",
                  "src": "7380:53:34"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 30614,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30553,
                        "src": "7503:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 30615,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "7511:3:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 30616,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "7511:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "id": 30617,
                        "name": "_destination",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30557,
                        "src": "7523:12:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      {
                        "id": 30618,
                        "name": "_remoteHook",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30559,
                        "src": "7537:11:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 30619,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30555,
                        "src": "7550:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "hexValue": "74727565",
                        "id": 30620,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "bool",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "7559:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "value": "true"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 30613,
                      "name": "Send",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 30374,
                      "src": "7498:4:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint32_$_t_bytes32_$_t_uint256_$_t_bool_$returns$__$",
                        "typeString": "function (address,address,uint32,bytes32,uint256,bool)"
                      }
                    },
                    "id": 30621,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7498:66:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30622,
                  "nodeType": "EmitStatement",
                  "src": "7493:71:34"
                }
              ]
            },
            "documentation": {
              "id": 30551,
              "nodeType": "StructuredDocumentation",
              "src": "6223:356:34",
              "text": " @notice Send tokens to a hook on the remote chain\n @param _token The token address\n @param _amount The token amount\n @param _destination The destination domain\n @param _remoteHook The hook contract on the remote chain\n @param _extraData Extra data that will be passed to the hook for\n        execution"
            },
            "functionSelector": "bc7dbab3",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "sendToHook",
            "parameters": {
              "id": 30562,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30553,
                  "mutability": "mutable",
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 30624,
                  "src": "6613:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30552,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6613:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30555,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 30624,
                  "src": "6637:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 30554,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6637:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30557,
                  "mutability": "mutable",
                  "name": "_destination",
                  "nodeType": "VariableDeclaration",
                  "scope": 30624,
                  "src": "6662:19:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 30556,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6662:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30559,
                  "mutability": "mutable",
                  "name": "_remoteHook",
                  "nodeType": "VariableDeclaration",
                  "scope": 30624,
                  "src": "6691:19:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 30558,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6691:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30561,
                  "mutability": "mutable",
                  "name": "_extraData",
                  "nodeType": "VariableDeclaration",
                  "scope": 30624,
                  "src": "6720:25:34",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 30560,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "6720:5:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6603:148:34"
            },
            "returnParameters": {
              "id": 30563,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6761:0:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 30667,
            "nodeType": "FunctionDefinition",
            "src": "7988:409:34",
            "body": {
              "id": 30666,
              "nodeType": "Block",
              "src": "8105:292:34",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 30642,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "8268:4:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_BaseBridgeRouter_$31120",
                              "typeString": "contract BaseBridgeRouter"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_BaseBridgeRouter_$31120",
                              "typeString": "contract BaseBridgeRouter"
                            }
                          ],
                          "id": 30641,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "8260:7:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 30640,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "8260:7:34",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 30643,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8260:13:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "hexValue": "31",
                        "id": 30644,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8275:1:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_1_by_1",
                          "typeString": "int_const 1"
                        },
                        "value": "1"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_rational_1_by_1",
                          "typeString": "int_const 1"
                        }
                      ],
                      "expression": {
                        "arguments": [
                          {
                            "id": 30637,
                            "name": "_custom",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30631,
                            "src": "8246:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 30636,
                          "name": "IBridgeToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 33609,
                          "src": "8233:12:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IBridgeToken_$33609_$",
                            "typeString": "type(contract IBridgeToken)"
                          }
                        },
                        "id": 30638,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8233:21:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                          "typeString": "contract IBridgeToken"
                        }
                      },
                      "id": 30639,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "mint",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33589,
                      "src": "8233:26:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256) external"
                      }
                    },
                    "id": 30645,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8233:44:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30646,
                  "nodeType": "ExpressionStatement",
                  "src": "8233:44:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 30653,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "8322:4:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_BaseBridgeRouter_$31120",
                              "typeString": "contract BaseBridgeRouter"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_BaseBridgeRouter_$31120",
                              "typeString": "contract BaseBridgeRouter"
                            }
                          ],
                          "id": 30652,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "8314:7:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 30651,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "8314:7:34",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 30654,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8314:13:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "hexValue": "31",
                        "id": 30655,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8329:1:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_1_by_1",
                          "typeString": "int_const 1"
                        },
                        "value": "1"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_rational_1_by_1",
                          "typeString": "int_const 1"
                        }
                      ],
                      "expression": {
                        "arguments": [
                          {
                            "id": 30648,
                            "name": "_custom",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30631,
                            "src": "8300:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 30647,
                          "name": "IBridgeToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 33609,
                          "src": "8287:12:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IBridgeToken_$33609_$",
                            "typeString": "type(contract IBridgeToken)"
                          }
                        },
                        "id": 30649,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8287:21:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                          "typeString": "contract IBridgeToken"
                        }
                      },
                      "id": 30650,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "burn",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33582,
                      "src": "8287:26:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256) external"
                      }
                    },
                    "id": 30656,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8287:44:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30657,
                  "nodeType": "ExpressionStatement",
                  "src": "8287:44:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 30661,
                        "name": "_domain",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30627,
                        "src": "8368:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      {
                        "id": 30662,
                        "name": "_id",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30629,
                        "src": "8377:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 30663,
                        "name": "_custom",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30631,
                        "src": "8382:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "id": 30658,
                        "name": "tokenRegistry",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30351,
                        "src": "8341:13:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ITokenRegistry_$33703",
                          "typeString": "contract ITokenRegistry"
                        }
                      },
                      "id": 30660,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "enrollCustom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33695,
                      "src": "8341:26:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_uint32_$_t_bytes32_$_t_address_$returns$__$",
                        "typeString": "function (uint32,bytes32,address) external"
                      }
                    },
                    "id": 30664,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8341:49:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30665,
                  "nodeType": "ExpressionStatement",
                  "src": "8341:49:34"
                }
              ]
            },
            "documentation": {
              "id": 30625,
              "nodeType": "StructuredDocumentation",
              "src": "7628:355:34",
              "text": " @notice Enroll a custom token. This allows projects to work with\n         governance to specify a custom representation.\n @param _domain the domain of the canonical Token to enroll\n @param _id the bytes32 ID of the canonical of the Token to enroll\n @param _custom the address of the custom implementation to use."
            },
            "functionSelector": "28b1aea0",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 30634,
                "modifierName": {
                  "id": 30633,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 23113,
                  "src": "8095:9:34",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "8095:9:34"
              }
            ],
            "name": "enrollCustom",
            "parameters": {
              "id": 30632,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30627,
                  "mutability": "mutable",
                  "name": "_domain",
                  "nodeType": "VariableDeclaration",
                  "scope": 30667,
                  "src": "8019:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 30626,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "8019:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30629,
                  "mutability": "mutable",
                  "name": "_id",
                  "nodeType": "VariableDeclaration",
                  "scope": 30667,
                  "src": "8043:11:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 30628,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "8043:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30631,
                  "mutability": "mutable",
                  "name": "_custom",
                  "nodeType": "VariableDeclaration",
                  "scope": 30667,
                  "src": "8064:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30630,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8064:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8009:76:34"
            },
            "returnParameters": {
              "id": 30635,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8105:0:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 30719,
            "nodeType": "FunctionDefinition",
            "src": "8830:452:34",
            "body": {
              "id": 30718,
              "nodeType": "Block",
              "src": "8874:408:34",
              "statements": [
                {
                  "assignments": [
                    30674
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30674,
                      "mutability": "mutable",
                      "name": "_currentRepr",
                      "nodeType": "VariableDeclaration",
                      "scope": 30718,
                      "src": "8884:20:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 30673,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "8884:7:34",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30679,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 30677,
                        "name": "_oldRepr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30670,
                        "src": "8942:8:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "id": 30675,
                        "name": "tokenRegistry",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30351,
                        "src": "8907:13:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ITokenRegistry_$33703",
                          "typeString": "contract ITokenRegistry"
                        }
                      },
                      "id": 30676,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "oldReprToCurrentRepr",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33702,
                      "src": "8907:34:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_address_$",
                        "typeString": "function (address) view external returns (address)"
                      }
                    },
                    "id": 30678,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8907:44:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "8884:67:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 30683,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 30681,
                          "name": "_currentRepr",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30674,
                          "src": "8969:12:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "id": 30682,
                          "name": "_oldRepr",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30670,
                          "src": "8985:8:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "8969:24:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "21646966666572656e74",
                        "id": 30684,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8995:12:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_07d635fa153385697a692b37ba850cebc27e2908c420ef0ade8900e4bffa96c4",
                          "typeString": "literal_string \"!different\""
                        },
                        "value": "!different"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_07d635fa153385697a692b37ba850cebc27e2908c420ef0ade8900e4bffa96c4",
                          "typeString": "literal_string \"!different\""
                        }
                      ],
                      "id": 30680,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "8961:7:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 30685,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8961:47:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30686,
                  "nodeType": "ExpressionStatement",
                  "src": "8961:47:34"
                },
                {
                  "assignments": [
                    30688
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30688,
                      "mutability": "mutable",
                      "name": "_old",
                      "nodeType": "VariableDeclaration",
                      "scope": 30718,
                      "src": "9086:17:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                        "typeString": "contract IBridgeToken"
                      },
                      "typeName": {
                        "id": 30687,
                        "name": "IBridgeToken",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 33609,
                        "src": "9086:12:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                          "typeString": "contract IBridgeToken"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30692,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 30690,
                        "name": "_oldRepr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30670,
                        "src": "9119:8:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 30689,
                      "name": "IBridgeToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 33609,
                      "src": "9106:12:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_contract$_IBridgeToken_$33609_$",
                        "typeString": "type(contract IBridgeToken)"
                      }
                    },
                    "id": 30691,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9106:22:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                      "typeString": "contract IBridgeToken"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "9086:42:34"
                },
                {
                  "assignments": [
                    30694
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30694,
                      "mutability": "mutable",
                      "name": "_bal",
                      "nodeType": "VariableDeclaration",
                      "scope": 30718,
                      "src": "9138:12:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 30693,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "9138:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30700,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 30697,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "9168:3:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 30698,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "9168:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "expression": {
                        "id": 30695,
                        "name": "_old",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30688,
                        "src": "9153:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                          "typeString": "contract IBridgeToken"
                        }
                      },
                      "id": 30696,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "balanceOf",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33560,
                      "src": "9153:14:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) view external returns (uint256)"
                      }
                    },
                    "id": 30699,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9153:26:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "9138:41:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 30704,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "9199:3:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 30705,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "9199:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "id": 30706,
                        "name": "_bal",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30694,
                        "src": "9211:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "id": 30701,
                        "name": "_old",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30688,
                        "src": "9189:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                          "typeString": "contract IBridgeToken"
                        }
                      },
                      "id": 30703,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "burn",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33582,
                      "src": "9189:9:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256) external"
                      }
                    },
                    "id": 30707,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9189:27:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30708,
                  "nodeType": "ExpressionStatement",
                  "src": "9189:27:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 30713,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "9258:3:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 30714,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "9258:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "id": 30715,
                        "name": "_bal",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30694,
                        "src": "9270:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "arguments": [
                          {
                            "id": 30710,
                            "name": "_currentRepr",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30674,
                            "src": "9239:12:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 30709,
                          "name": "IBridgeToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 33609,
                          "src": "9226:12:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IBridgeToken_$33609_$",
                            "typeString": "type(contract IBridgeToken)"
                          }
                        },
                        "id": 30711,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "9226:26:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                          "typeString": "contract IBridgeToken"
                        }
                      },
                      "id": 30712,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "mint",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33589,
                      "src": "9226:31:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256) external"
                      }
                    },
                    "id": 30716,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9226:49:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30717,
                  "nodeType": "ExpressionStatement",
                  "src": "9226:49:34"
                }
              ]
            },
            "documentation": {
              "id": 30668,
              "nodeType": "StructuredDocumentation",
              "src": "8403:422:34",
              "text": " @notice Migrate all tokens in a previous representation to the latest\n         custom representation. This works by looking up local mappings\n         and then burning old tokens and minting new tokens.\n @dev This is explicitly opt-in to allow dapps to decide when and how to\n      upgrade to the new representation.\n @param _oldRepr The address of the old token to migrate"
            },
            "functionSelector": "ce5494bb",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "migrate",
            "parameters": {
              "id": 30671,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30670,
                  "mutability": "mutable",
                  "name": "_oldRepr",
                  "nodeType": "VariableDeclaration",
                  "scope": 30719,
                  "src": "8847:16:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30669,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8847:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8846:18:34"
            },
            "returnParameters": {
              "id": 30672,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8874:0:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 30811,
            "nodeType": "FunctionDefinition",
            "src": "9813:1239:34",
            "body": {
              "id": 30810,
              "nodeType": "Block",
              "src": "9945:1107:34",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 30734,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 30732,
                          "name": "_amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30724,
                          "src": "10005:7:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "hexValue": "30",
                          "id": 30733,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "10015:1:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "10005:11:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "21616d6e74",
                        "id": 30735,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "10018:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_68b2b497b71cd104f16a8d4f119b234b325c9481ae87c628408fd4cd4c964eac",
                          "typeString": "literal_string \"!amnt\""
                        },
                        "value": "!amnt"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_68b2b497b71cd104f16a8d4f119b234b325c9481ae87c628408fd4cd4c964eac",
                          "typeString": "literal_string \"!amnt\""
                        }
                      ],
                      "id": 30731,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "9997:7:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 30736,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9997:29:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30737,
                  "nodeType": "ExpressionStatement",
                  "src": "9997:29:34"
                },
                {
                  "assignments": [
                    30739
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30739,
                      "mutability": "mutable",
                      "name": "_t",
                      "nodeType": "VariableDeclaration",
                      "scope": 30810,
                      "src": "10083:15:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                        "typeString": "contract IBridgeToken"
                      },
                      "typeName": {
                        "id": 30738,
                        "name": "IBridgeToken",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 33609,
                        "src": "10083:12:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                          "typeString": "contract IBridgeToken"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30743,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 30741,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30722,
                        "src": "10114:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 30740,
                      "name": "IBridgeToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 33609,
                      "src": "10101:12:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_contract$_IBridgeToken_$33609_$",
                        "typeString": "type(contract IBridgeToken)"
                      }
                    },
                    "id": 30742,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10101:20:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                      "typeString": "contract IBridgeToken"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "10083:38:34"
                },
                {
                  "condition": {
                    "arguments": [
                      {
                        "id": 30746,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30722,
                        "src": "10219:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "id": 30744,
                        "name": "tokenRegistry",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30351,
                        "src": "10191:13:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ITokenRegistry_$33703",
                          "typeString": "contract ITokenRegistry"
                        }
                      },
                      "id": 30745,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "isLocalOrigin",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33650,
                      "src": "10191:27:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_bool_$",
                        "typeString": "function (address) view external returns (bool)"
                      }
                    },
                    "id": 30747,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10191:35:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 30791,
                    "nodeType": "Block",
                    "src": "10667:216:34",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "expression": {
                                "id": 30780,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "10807:3:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 30781,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "src": "10807:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "id": 30782,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30724,
                              "src": "10819:7:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "id": 30777,
                              "name": "_t",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30739,
                              "src": "10799:2:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                                "typeString": "contract IBridgeToken"
                              }
                            },
                            "id": 30779,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "burn",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 33582,
                            "src": "10799:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256) external"
                            }
                          },
                          "id": 30783,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10799:28:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 30784,
                        "nodeType": "ExpressionStatement",
                        "src": "10799:28:34"
                      },
                      {
                        "expression": {
                          "id": 30789,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 30785,
                            "name": "_detailsHash",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30729,
                            "src": "10841:12:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "expression": {
                                "id": 30786,
                                "name": "_t",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 30739,
                                "src": "10856:2:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                                  "typeString": "contract IBridgeToken"
                                }
                              },
                              "id": 30787,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "detailsHash",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 33575,
                              "src": "10856:14:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_view$__$returns$_t_bytes32_$",
                                "typeString": "function () view external returns (bytes32)"
                              }
                            },
                            "id": 30788,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "10856:16:34",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "src": "10841:31:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 30790,
                        "nodeType": "ExpressionStatement",
                        "src": "10841:31:34"
                      }
                    ]
                  },
                  "id": 30792,
                  "nodeType": "IfStatement",
                  "src": "10187:696:34",
                  "trueBody": {
                    "id": 30776,
                    "nodeType": "Block",
                    "src": "10228:433:34",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "expression": {
                                "id": 30752,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "10383:3:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 30753,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "src": "10383:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "arguments": [
                                {
                                  "id": 30756,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "10403:4:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_BaseBridgeRouter_$31120",
                                    "typeString": "contract BaseBridgeRouter"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_BaseBridgeRouter_$31120",
                                    "typeString": "contract BaseBridgeRouter"
                                  }
                                ],
                                "id": 30755,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "10395:7:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 30754,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "10395:7:34",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 30757,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "10395:13:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "id": 30758,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30724,
                              "src": "10410:7:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "arguments": [
                                {
                                  "id": 30749,
                                  "name": "_token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 30722,
                                  "src": "10358:6:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 30748,
                                "name": "IERC20",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 27517,
                                "src": "10351:6:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_IERC20_$27517_$",
                                  "typeString": "type(contract IERC20)"
                                }
                              },
                              "id": 30750,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "10351:14:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$27517",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 30751,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransferFrom",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 27576,
                            "src": "10351:31:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$27517_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$27517_$",
                              "typeString": "function (contract IERC20,address,address,uint256)"
                            }
                          },
                          "id": 30759,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10351:67:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 30760,
                        "nodeType": "ExpressionStatement",
                        "src": "10351:67:34"
                      },
                      {
                        "expression": {
                          "id": 30774,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 30761,
                            "name": "_detailsHash",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30729,
                            "src": "10506:12:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "arguments": [
                              {
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "id": 30764,
                                    "name": "_t",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 30739,
                                    "src": "10567:2:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                                      "typeString": "contract IBridgeToken"
                                    }
                                  },
                                  "id": 30765,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "name",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 33553,
                                  "src": "10567:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$__$returns$_t_string_memory_ptr_$",
                                    "typeString": "function () external returns (string memory)"
                                  }
                                },
                                "id": 30766,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "10567:9:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_string_memory_ptr",
                                  "typeString": "string memory"
                                }
                              },
                              {
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "id": 30767,
                                    "name": "_t",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 30739,
                                    "src": "10594:2:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                                      "typeString": "contract IBridgeToken"
                                    }
                                  },
                                  "id": 30768,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "symbol",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 33565,
                                  "src": "10594:9:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$__$returns$_t_string_memory_ptr_$",
                                    "typeString": "function () view external returns (string memory)"
                                  }
                                },
                                "id": 30769,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "10594:11:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_string_memory_ptr",
                                  "typeString": "string memory"
                                }
                              },
                              {
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "id": 30770,
                                    "name": "_t",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 30739,
                                    "src": "10623:2:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                                      "typeString": "contract IBridgeToken"
                                    }
                                  },
                                  "id": 30771,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "decimals",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 33570,
                                  "src": "10623:11:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$__$returns$_t_uint8_$",
                                    "typeString": "function () view external returns (uint8)"
                                  }
                                },
                                "id": 30772,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "10623:13:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_string_memory_ptr",
                                  "typeString": "string memory"
                                },
                                {
                                  "typeIdentifier": "t_string_memory_ptr",
                                  "typeString": "string memory"
                                },
                                {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                }
                              ],
                              "expression": {
                                "id": 30762,
                                "name": "BridgeMessage",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 30301,
                                "src": "10521:13:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_BridgeMessage_$30301_$",
                                  "typeString": "type(library BridgeMessage)"
                                }
                              },
                              "id": 30763,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "getDetailsHash",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 29960,
                              "src": "10521:28:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint8_$returns$_t_bytes32_$",
                                "typeString": "function (string memory,string memory,uint8) pure returns (bytes32)"
                              }
                            },
                            "id": 30773,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "10521:129:34",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "src": "10506:144:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 30775,
                        "nodeType": "ExpressionStatement",
                        "src": "10506:144:34"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    30794,
                    30796
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30794,
                      "mutability": "mutable",
                      "name": "_domain",
                      "nodeType": "VariableDeclaration",
                      "scope": 30810,
                      "src": "10920:14:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      },
                      "typeName": {
                        "id": 30793,
                        "name": "uint32",
                        "nodeType": "ElementaryTypeName",
                        "src": "10920:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 30796,
                      "mutability": "mutable",
                      "name": "_id",
                      "nodeType": "VariableDeclaration",
                      "scope": 30810,
                      "src": "10936:11:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "typeName": {
                        "id": 30795,
                        "name": "bytes32",
                        "nodeType": "ElementaryTypeName",
                        "src": "10936:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30801,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 30799,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30722,
                        "src": "10976:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "id": 30797,
                        "name": "tokenRegistry",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30351,
                        "src": "10951:13:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ITokenRegistry_$33703",
                          "typeString": "contract ITokenRegistry"
                        }
                      },
                      "id": 30798,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "getTokenId",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33686,
                      "src": "10951:24:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint32_$_t_bytes32_$",
                        "typeString": "function (address) view external returns (uint32,bytes32)"
                      }
                    },
                    "id": 30800,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10951:32:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint32_$_t_bytes32_$",
                      "typeString": "tuple(uint32,bytes32)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "10919:64:34"
                },
                {
                  "expression": {
                    "id": 30808,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 30802,
                      "name": "_tokenId",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 30727,
                      "src": "10993:8:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes29",
                        "typeString": "bytes29"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 30805,
                          "name": "_domain",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30794,
                          "src": "11032:7:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        {
                          "id": 30806,
                          "name": "_id",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30796,
                          "src": "11041:3:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          },
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        ],
                        "expression": {
                          "id": 30803,
                          "name": "BridgeMessage",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30301,
                          "src": "11004:13:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_BridgeMessage_$30301_$",
                            "typeString": "type(library BridgeMessage)"
                          }
                        },
                        "id": 30804,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "formatTokenId",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 29928,
                        "src": "11004:27:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint32_$_t_bytes32_$returns$_t_bytes29_$",
                          "typeString": "function (uint32,bytes32) pure returns (bytes29)"
                        }
                      },
                      "id": 30807,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "11004:41:34",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes29",
                        "typeString": "bytes29"
                      }
                    },
                    "src": "10993:52:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "id": 30809,
                  "nodeType": "ExpressionStatement",
                  "src": "10993:52:34"
                }
              ]
            },
            "documentation": {
              "id": 30720,
              "nodeType": "StructuredDocumentation",
              "src": "9337:471:34",
              "text": " @notice Take from msg.sender as part of sending tokens across chains\n @dev Locks canonical tokens in escrow in BridgeRouter\n      OR Burns representation tokens\n @param _token The token to pull from the sender\n @param _amount The amount to pull from the sender\n @return _tokenId the bytes canonical token identifier\n @return _detailsHash the hash of the canonical token details (name,\n         symbol, decimal)"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_takeTokens",
            "parameters": {
              "id": 30725,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30722,
                  "mutability": "mutable",
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 30811,
                  "src": "9834:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30721,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9834:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30724,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 30811,
                  "src": "9850:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 30723,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9850:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9833:33:34"
            },
            "returnParameters": {
              "id": 30730,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30727,
                  "mutability": "mutable",
                  "name": "_tokenId",
                  "nodeType": "VariableDeclaration",
                  "scope": 30811,
                  "src": "9901:16:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes29",
                    "typeString": "bytes29"
                  },
                  "typeName": {
                    "id": 30726,
                    "name": "bytes29",
                    "nodeType": "ElementaryTypeName",
                    "src": "9901:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30729,
                  "mutability": "mutable",
                  "name": "_detailsHash",
                  "nodeType": "VariableDeclaration",
                  "scope": 30811,
                  "src": "9919:20:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 30728,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "9919:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9900:40:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 30843,
            "nodeType": "FunctionDefinition",
            "src": "11542:473:34",
            "body": {
              "id": 30842,
              "nodeType": "Block",
              "src": "11667:348:34",
              "statements": [
                {
                  "assignments": [
                    30822
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30822,
                      "mutability": "mutable",
                      "name": "_remote",
                      "nodeType": "VariableDeclaration",
                      "scope": 30842,
                      "src": "11741:15:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "typeName": {
                        "id": 30821,
                        "name": "bytes32",
                        "nodeType": "ElementaryTypeName",
                        "src": "11741:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30826,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 30824,
                        "name": "_destination",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30814,
                        "src": "11775:12:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      ],
                      "id": 30823,
                      "name": "_mustHaveRemote",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46767,
                      "src": "11759:15:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_uint32_$returns$_t_bytes32_$",
                        "typeString": "function (uint32) view returns (bytes32)"
                      }
                    },
                    "id": 30825,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11759:29:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11741:47:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 30833,
                        "name": "_destination",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30814,
                        "src": "11905:12:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      {
                        "id": 30834,
                        "name": "_remote",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30822,
                        "src": "11931:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "id": 30837,
                            "name": "_tokenId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30816,
                            "src": "11980:8:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes29",
                              "typeString": "bytes29"
                            }
                          },
                          {
                            "id": 30838,
                            "name": "_action",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30818,
                            "src": "11990:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes29",
                              "typeString": "bytes29"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes29",
                              "typeString": "bytes29"
                            },
                            {
                              "typeIdentifier": "t_bytes29",
                              "typeString": "bytes29"
                            }
                          ],
                          "expression": {
                            "id": 30835,
                            "name": "BridgeMessage",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30301,
                            "src": "11952:13:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_BridgeMessage_$30301_$",
                              "typeString": "type(library BridgeMessage)"
                            }
                          },
                          "id": 30836,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "formatMessage",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 29750,
                          "src": "11952:27:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_bytes29_$_t_bytes29_$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function (bytes29,bytes29) view returns (bytes memory)"
                          }
                        },
                        "id": 30839,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "11952:46:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "expression": {
                        "arguments": [
                          {
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "expression": {
                                "id": 30828,
                                "name": "xAppConnectionManager",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 46780,
                                "src": "11853:21:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_XAppConnectionManager_$45020",
                                  "typeString": "contract XAppConnectionManager"
                                }
                              },
                              "id": 30829,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "home",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 44639,
                              "src": "11853:26:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_view$__$returns$_t_contract$_Home_$43790_$",
                                "typeString": "function () view external returns (contract Home)"
                              }
                            },
                            "id": 30830,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "11853:28:34",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Home_$43790",
                              "typeString": "contract Home"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_Home_$43790",
                              "typeString": "contract Home"
                            }
                          ],
                          "id": 30827,
                          "name": "Home",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 43790,
                          "src": "11848:4:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_Home_$43790_$",
                            "typeString": "type(contract Home)"
                          }
                        },
                        "id": 30831,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "11848:34:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Home_$43790",
                          "typeString": "contract Home"
                        }
                      },
                      "id": 30832,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "dispatch",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 43526,
                      "src": "11848:43:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_uint32_$_t_bytes32_$_t_bytes_memory_ptr_$returns$__$",
                        "typeString": "function (uint32,bytes32,bytes memory) external"
                      }
                    },
                    "id": 30840,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11848:160:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30841,
                  "nodeType": "ExpressionStatement",
                  "src": "11848:160:34"
                }
              ]
            },
            "documentation": {
              "id": 30812,
              "nodeType": "StructuredDocumentation",
              "src": "11058:479:34",
              "text": " @notice Dispatch a message via Nomad to a destination domain\n         addressed to the remote BridgeRouter on that chain\n @dev Message will trigger `handle` method on the remote BridgeRouter\n      when it is received on the destination chain\n @param _destination The domain of the destination chain\n @param _tokenId The canonical token identifier for the transfer message\n @param _action The contents of the transfer message"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_sendTransferMessage",
            "parameters": {
              "id": 30819,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30814,
                  "mutability": "mutable",
                  "name": "_destination",
                  "nodeType": "VariableDeclaration",
                  "scope": 30843,
                  "src": "11581:19:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 30813,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "11581:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30816,
                  "mutability": "mutable",
                  "name": "_tokenId",
                  "nodeType": "VariableDeclaration",
                  "scope": 30843,
                  "src": "11610:16:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes29",
                    "typeString": "bytes29"
                  },
                  "typeName": {
                    "id": 30815,
                    "name": "bytes29",
                    "nodeType": "ElementaryTypeName",
                    "src": "11610:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30818,
                  "mutability": "mutable",
                  "name": "_action",
                  "nodeType": "VariableDeclaration",
                  "scope": 30843,
                  "src": "11636:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes29",
                    "typeString": "bytes29"
                  },
                  "typeName": {
                    "id": 30817,
                    "name": "bytes29",
                    "nodeType": "ElementaryTypeName",
                    "src": "11636:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "11571:86:34"
            },
            "returnParameters": {
              "id": 30820,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11667:0:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 30874,
            "nodeType": "FunctionDefinition",
            "src": "12529:421:34",
            "body": {
              "id": 30873,
              "nodeType": "Block",
              "src": "12667:283:34",
              "statements": [
                {
                  "assignments": [
                    30856
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30856,
                      "mutability": "mutable",
                      "name": "_recipient",
                      "nodeType": "VariableDeclaration",
                      "scope": 30873,
                      "src": "12735:18:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 30855,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "12735:7:34",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30860,
                  "initialValue": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "id": 30857,
                        "name": "_action",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30852,
                        "src": "12756:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "id": 30858,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "evmRecipient",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 30097,
                      "src": "12756:20:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_address_$bound_to$_t_bytes29_$",
                        "typeString": "function (bytes29) pure returns (address)"
                      }
                    },
                    "id": 30859,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12756:22:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "12735:43:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 30862,
                        "name": "_origin",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30846,
                        "src": "12823:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      {
                        "id": 30863,
                        "name": "_nonce",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30848,
                        "src": "12832:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      {
                        "id": 30864,
                        "name": "_tokenId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30850,
                        "src": "12840:8:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      {
                        "id": 30865,
                        "name": "_action",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30852,
                        "src": "12850:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      {
                        "id": 30866,
                        "name": "_recipient",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30856,
                        "src": "12859:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        },
                        {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 30861,
                      "name": "_giveTokens",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 31014,
                      "src": "12811:11:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$_t_uint32_$_t_bytes29_$_t_bytes29_$_t_address_$returns$_t_address_$",
                        "typeString": "function (uint32,uint32,bytes29,bytes29,address) returns (address)"
                      }
                    },
                    "id": 30867,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12811:59:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 30868,
                  "nodeType": "ExpressionStatement",
                  "src": "12811:59:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 30870,
                        "name": "_recipient",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30856,
                        "src": "12932:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 30869,
                      "name": "_dust",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 31090,
                      "src": "12926:5:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 30871,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12926:17:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 30872,
                  "nodeType": "ExpressionStatement",
                  "src": "12926:17:34"
                }
              ]
            },
            "documentation": {
              "id": 30844,
              "nodeType": "StructuredDocumentation",
              "src": "12072:452:34",
              "text": " @notice Handles an incoming Transfer message.\n If the token is of local origin, the amount is sent from escrow.\n Otherwise, a representation token is minted.\n @param _origin The domain of the chain from which the transfer originated\n @param _nonce The unique identifier for the message from origin to\n        destination\n @param _tokenId The token ID\n @param _action The action"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_handleTransfer",
            "parameters": {
              "id": 30853,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30846,
                  "mutability": "mutable",
                  "name": "_origin",
                  "nodeType": "VariableDeclaration",
                  "scope": 30874,
                  "src": "12563:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 30845,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "12563:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30848,
                  "mutability": "mutable",
                  "name": "_nonce",
                  "nodeType": "VariableDeclaration",
                  "scope": 30874,
                  "src": "12587:13:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 30847,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "12587:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30850,
                  "mutability": "mutable",
                  "name": "_tokenId",
                  "nodeType": "VariableDeclaration",
                  "scope": 30874,
                  "src": "12610:16:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes29",
                    "typeString": "bytes29"
                  },
                  "typeName": {
                    "id": 30849,
                    "name": "bytes29",
                    "nodeType": "ElementaryTypeName",
                    "src": "12610:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30852,
                  "mutability": "mutable",
                  "name": "_action",
                  "nodeType": "VariableDeclaration",
                  "scope": 30874,
                  "src": "12636:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes29",
                    "typeString": "bytes29"
                  },
                  "typeName": {
                    "id": 30851,
                    "name": "bytes29",
                    "nodeType": "ElementaryTypeName",
                    "src": "12636:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "12553:104:34"
            },
            "returnParameters": {
              "id": 30854,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12667:0:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 30943,
            "nodeType": "FunctionDefinition",
            "src": "13426:1292:34",
            "body": {
              "id": 30942,
              "nodeType": "Block",
              "src": "13570:1148:34",
              "statements": [
                {
                  "assignments": [
                    30887
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30887,
                      "mutability": "mutable",
                      "name": "_hook",
                      "nodeType": "VariableDeclaration",
                      "scope": 30942,
                      "src": "13634:13:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 30886,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "13634:7:34",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30891,
                  "initialValue": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "id": 30888,
                        "name": "_action",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30883,
                        "src": "13650:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "id": 30889,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "evmHook",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 30171,
                      "src": "13650:15:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_address_$bound_to$_t_bytes29_$",
                        "typeString": "function (bytes29) pure returns (address)"
                      }
                    },
                    "id": 30890,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13650:17:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "13634:33:34"
                },
                {
                  "assignments": [
                    30893
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30893,
                      "mutability": "mutable",
                      "name": "_token",
                      "nodeType": "VariableDeclaration",
                      "scope": 30942,
                      "src": "13700:14:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 30892,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "13700:7:34",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30901,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 30895,
                        "name": "_origin",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30877,
                        "src": "13729:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      {
                        "id": 30896,
                        "name": "_nonce",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30879,
                        "src": "13738:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      {
                        "id": 30897,
                        "name": "_tokenId",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30881,
                        "src": "13746:8:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      {
                        "id": 30898,
                        "name": "_action",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30883,
                        "src": "13756:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      {
                        "id": 30899,
                        "name": "_hook",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30887,
                        "src": "13765:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        },
                        {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 30894,
                      "name": "_giveTokens",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 31014,
                      "src": "13717:11:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$_t_uint32_$_t_bytes29_$_t_bytes29_$_t_address_$returns$_t_address_$",
                        "typeString": "function (uint32,uint32,bytes29,bytes29,address) returns (address)"
                      }
                    },
                    "id": 30900,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13717:54:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "13700:71:34"
                },
                {
                  "assignments": [
                    30903
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30903,
                      "mutability": "mutable",
                      "name": "_call",
                      "nodeType": "VariableDeclaration",
                      "scope": 30942,
                      "src": "13844:18:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 30902,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "13844:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30929,
                  "initialValue": {
                    "arguments": [
                      {
                        "expression": {
                          "expression": {
                            "id": 30906,
                            "name": "IBridgeHook",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 33543,
                            "src": "13901:11:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_IBridgeHook_$33543_$",
                              "typeString": "type(contract IBridgeHook)"
                            }
                          },
                          "id": 30907,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "onReceive",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 33542,
                          "src": "13901:21:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_declaration_nonpayable$_t_uint32_$_t_bytes32_$_t_uint32_$_t_bytes32_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$",
                            "typeString": "function IBridgeHook.onReceive(uint32,bytes32,uint32,bytes32,address,uint256,bytes memory)"
                          }
                        },
                        "id": 30908,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "memberName": "selector",
                        "nodeType": "MemberAccess",
                        "src": "13901:30:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        }
                      },
                      {
                        "id": 30909,
                        "name": "_origin",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30877,
                        "src": "13945:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      {
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "expression": {
                            "id": 30910,
                            "name": "_action",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30883,
                            "src": "13966:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes29",
                              "typeString": "bytes29"
                            }
                          },
                          "id": 30911,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 30191,
                          "src": "13966:14:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_bytes32_$bound_to$_t_bytes29_$",
                            "typeString": "function (bytes29) pure returns (bytes32)"
                          }
                        },
                        "id": 30912,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "13966:16:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "expression": {
                            "id": 30913,
                            "name": "_tokenId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30881,
                            "src": "13996:8:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes29",
                              "typeString": "bytes29"
                            }
                          },
                          "id": 30914,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "domain",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 29983,
                          "src": "13996:15:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_uint32_$bound_to$_t_bytes29_$",
                            "typeString": "function (bytes29) pure returns (uint32)"
                          }
                        },
                        "id": 30915,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "13996:17:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      {
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "expression": {
                            "id": 30916,
                            "name": "_tokenId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30881,
                            "src": "14027:8:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes29",
                              "typeString": "bytes29"
                            }
                          },
                          "id": 30917,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "id",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 30003,
                          "src": "14027:11:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_bytes32_$bound_to$_t_bytes29_$",
                            "typeString": "function (bytes29) pure returns (bytes32)"
                          }
                        },
                        "id": 30918,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "14027:13:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 30919,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30893,
                        "src": "14054:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "expression": {
                            "id": 30920,
                            "name": "_action",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30883,
                            "src": "14074:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes29",
                              "typeString": "bytes29"
                            }
                          },
                          "id": 30921,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "amnt",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 30112,
                          "src": "14074:12:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_uint256_$bound_to$_t_bytes29_$",
                            "typeString": "function (bytes29) pure returns (uint256)"
                          }
                        },
                        "id": 30922,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "14074:14:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "expression": {
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "expression": {
                                "id": 30923,
                                "name": "_action",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 30883,
                                "src": "14102:7:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes29",
                                  "typeString": "bytes29"
                                }
                              },
                              "id": 30924,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "extraData",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 30220,
                              "src": "14102:17:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_bytes29_$bound_to$_t_bytes29_$",
                                "typeString": "function (bytes29) pure returns (bytes29)"
                              }
                            },
                            "id": 30925,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "14102:19:34",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes29",
                              "typeString": "bytes29"
                            }
                          },
                          "id": 30926,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "clone",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 29466,
                          "src": "14102:25:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_bytes29_$returns$_t_bytes_memory_ptr_$bound_to$_t_bytes29_$",
                            "typeString": "function (bytes29) view returns (bytes memory)"
                          }
                        },
                        "id": 30927,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "14102:27:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "expression": {
                        "id": 30904,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -1,
                        "src": "13865:3:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 30905,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodeWithSelector",
                      "nodeType": "MemberAccess",
                      "src": "13865:22:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes4) pure returns (bytes memory)"
                      }
                    },
                    "id": 30928,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13865:274:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "13844:295:34"
                },
                {
                  "assignments": [
                    30931,
                    null
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30931,
                      "mutability": "mutable",
                      "name": "_success",
                      "nodeType": "VariableDeclaration",
                      "scope": 30942,
                      "src": "14435:13:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 30930,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "14435:4:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "visibility": "internal"
                    },
                    null
                  ],
                  "id": 30936,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 30934,
                        "name": "_call",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30903,
                        "src": "14465:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "expression": {
                        "id": 30932,
                        "name": "_hook",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30887,
                        "src": "14454:5:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "id": 30933,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "call",
                      "nodeType": "MemberAccess",
                      "src": "14454:10:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                      }
                    },
                    "id": 30935,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "14454:17:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                      "typeString": "tuple(bool,bytes memory)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "14434:37:34"
                },
                {
                  "condition": {
                    "id": 30938,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "14533:9:34",
                    "subExpression": {
                      "id": 30937,
                      "name": "_success",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 30931,
                      "src": "14534:8:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 30941,
                  "nodeType": "IfStatement",
                  "src": "14529:183:34",
                  "trueBody": {
                    "id": 30940,
                    "nodeType": "Block",
                    "src": "14544:168:34",
                    "statements": [
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "14567:135:34",
                          "statements": [
                            {
                              "nodeType": "YulVariableDeclaration",
                              "src": "14585:28:34",
                              "value": {
                                "arguments": [],
                                "functionName": {
                                  "name": "returndatasize",
                                  "nodeType": "YulIdentifier",
                                  "src": "14597:14:34"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "14597:16:34"
                              },
                              "variables": [
                                {
                                  "name": "data",
                                  "nodeType": "YulTypedName",
                                  "src": "14589:4:34",
                                  "type": ""
                                }
                              ]
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "14645:1:34",
                                    "type": "",
                                    "value": "0"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "14648:1:34",
                                    "type": "",
                                    "value": "0"
                                  },
                                  {
                                    "name": "data",
                                    "nodeType": "YulIdentifier",
                                    "src": "14651:4:34"
                                  }
                                ],
                                "functionName": {
                                  "name": "returndatacopy",
                                  "nodeType": "YulIdentifier",
                                  "src": "14630:14:34"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "14630:26:34"
                              },
                              "nodeType": "YulExpressionStatement",
                              "src": "14630:26:34"
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "14680:1:34",
                                    "type": "",
                                    "value": "0"
                                  },
                                  {
                                    "name": "data",
                                    "nodeType": "YulIdentifier",
                                    "src": "14683:4:34"
                                  }
                                ],
                                "functionName": {
                                  "name": "revert",
                                  "nodeType": "YulIdentifier",
                                  "src": "14673:6:34"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "14673:15:34"
                              },
                              "nodeType": "YulExpressionStatement",
                              "src": "14673:15:34"
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [],
                        "id": 30939,
                        "nodeType": "InlineAssembly",
                        "src": "14558:144:34"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 30875,
              "nodeType": "StructuredDocumentation",
              "src": "12956:465:34",
              "text": " @notice Handles an incoming TransferToHook message.\n @dev The hook is called AFTER tokens have been transferred to the hook\n      contract. If this hook errors, the bridge WILL revert.\n @param _origin The domain of the chain from which the transfer originated\n @param _nonce The unique identifier for the message from origin to destination\n @param _tokenId The token ID\n @param _action The action"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_handleTransferToHook",
            "parameters": {
              "id": 30884,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30877,
                  "mutability": "mutable",
                  "name": "_origin",
                  "nodeType": "VariableDeclaration",
                  "scope": 30943,
                  "src": "13466:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 30876,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "13466:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30879,
                  "mutability": "mutable",
                  "name": "_nonce",
                  "nodeType": "VariableDeclaration",
                  "scope": 30943,
                  "src": "13490:13:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 30878,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "13490:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30881,
                  "mutability": "mutable",
                  "name": "_tokenId",
                  "nodeType": "VariableDeclaration",
                  "scope": 30943,
                  "src": "13513:16:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes29",
                    "typeString": "bytes29"
                  },
                  "typeName": {
                    "id": 30880,
                    "name": "bytes29",
                    "nodeType": "ElementaryTypeName",
                    "src": "13513:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30883,
                  "mutability": "mutable",
                  "name": "_action",
                  "nodeType": "VariableDeclaration",
                  "scope": 30943,
                  "src": "13539:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes29",
                    "typeString": "bytes29"
                  },
                  "typeName": {
                    "id": 30882,
                    "name": "bytes29",
                    "nodeType": "ElementaryTypeName",
                    "src": "13539:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "13456:104:34"
            },
            "returnParameters": {
              "id": 30885,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "13570:0:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 31014,
            "nodeType": "FunctionDefinition",
            "src": "15331:1077:34",
            "body": {
              "id": 31013,
              "nodeType": "Block",
              "src": "15518:890:34",
              "statements": [
                {
                  "expression": {
                    "id": 30969,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 30959,
                      "name": "_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 30957,
                      "src": "15763:6:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "id": 30962,
                              "name": "_tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30950,
                              "src": "15816:8:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes29",
                                "typeString": "bytes29"
                              }
                            },
                            "id": 30963,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "domain",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 29983,
                            "src": "15816:15:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_uint32_$bound_to$_t_bytes29_$",
                              "typeString": "function (bytes29) pure returns (uint32)"
                            }
                          },
                          "id": 30964,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15816:17:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "id": 30965,
                              "name": "_tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30950,
                              "src": "15847:8:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes29",
                                "typeString": "bytes29"
                              }
                            },
                            "id": 30966,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "id",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 30003,
                            "src": "15847:11:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_bytes32_$bound_to$_t_bytes29_$",
                              "typeString": "function (bytes29) pure returns (bytes32)"
                            }
                          },
                          "id": 30967,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15847:13:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          },
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        ],
                        "expression": {
                          "id": 30960,
                          "name": "tokenRegistry",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 30351,
                          "src": "15772:13:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ITokenRegistry_$33703",
                            "typeString": "contract ITokenRegistry"
                          }
                        },
                        "id": 30961,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "ensureLocalToken",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 33659,
                        "src": "15772:30:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_nonpayable$_t_uint32_$_t_bytes32_$returns$_t_address_$",
                          "typeString": "function (uint32,bytes32) external returns (address)"
                        }
                      },
                      "id": 30968,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "15772:98:34",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "15763:107:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 30970,
                  "nodeType": "ExpressionStatement",
                  "src": "15763:107:34"
                },
                {
                  "assignments": [
                    30972
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 30972,
                      "mutability": "mutable",
                      "name": "_amount",
                      "nodeType": "VariableDeclaration",
                      "scope": 31013,
                      "src": "15908:15:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 30971,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "15908:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 30976,
                  "initialValue": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "id": 30973,
                        "name": "_action",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30952,
                        "src": "15926:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        }
                      },
                      "id": 30974,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "amnt",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 30112,
                      "src": "15926:12:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_uint256_$bound_to$_t_bytes29_$",
                        "typeString": "function (bytes29) pure returns (uint256)"
                      }
                    },
                    "id": 30975,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15926:14:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "15908:32:34"
                },
                {
                  "condition": {
                    "arguments": [
                      {
                        "id": 30979,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30957,
                        "src": "16040:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "id": 30977,
                        "name": "tokenRegistry",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30351,
                        "src": "16012:13:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ITokenRegistry_$33703",
                          "typeString": "contract ITokenRegistry"
                        }
                      },
                      "id": 30978,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "isLocalOrigin",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33650,
                      "src": "16012:27:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_bool_$",
                        "typeString": "function (address) view external returns (bool)"
                      }
                    },
                    "id": 30980,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16012:35:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 30997,
                    "nodeType": "Block",
                    "src": "16119:86:34",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 30989,
                              "name": "_token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30957,
                              "src": "16143:6:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 30990,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30972,
                              "src": "16151:7:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "id": 30991,
                              "name": "_recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30954,
                              "src": "16160:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "id": 30992,
                                  "name": "_action",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 30952,
                                  "src": "16172:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes29",
                                    "typeString": "bytes29"
                                  }
                                },
                                "id": 30993,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "detailsHash",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 30127,
                                "src": "16172:19:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_bytes29_$returns$_t_bytes32_$bound_to$_t_bytes29_$",
                                  "typeString": "function (bytes29) pure returns (bytes32)"
                                }
                              },
                              "id": 30994,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "16172:21:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 30988,
                            "name": "_giveRepr",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 31061,
                            "src": "16133:9:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_address_$_t_bytes32_$returns$__$",
                              "typeString": "function (address,uint256,address,bytes32)"
                            }
                          },
                          "id": 30995,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16133:61:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 30996,
                        "nodeType": "ExpressionStatement",
                        "src": "16133:61:34"
                      }
                    ]
                  },
                  "id": 30998,
                  "nodeType": "IfStatement",
                  "src": "16008:197:34",
                  "trueBody": {
                    "id": 30987,
                    "nodeType": "Block",
                    "src": "16049:64:34",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 30982,
                              "name": "_token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30957,
                              "src": "16074:6:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 30983,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30972,
                              "src": "16082:7:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "id": 30984,
                              "name": "_recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30954,
                              "src": "16091:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 30981,
                            "name": "_giveLocal",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 31033,
                            "src": "16063:10:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_address_$returns$__$",
                              "typeString": "function (address,uint256,address)"
                            }
                          },
                          "id": 30985,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16063:39:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 30986,
                        "nodeType": "ExpressionStatement",
                        "src": "16063:39:34"
                      }
                    ]
                  }
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 31001,
                            "name": "_origin",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30946,
                            "src": "16286:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          {
                            "id": 31002,
                            "name": "_nonce",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 30948,
                            "src": "16295:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            },
                            {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          ],
                          "id": 31000,
                          "name": "_originAndNonce",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 31111,
                          "src": "16270:15:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_uint32_$_t_uint32_$returns$_t_uint64_$",
                            "typeString": "function (uint32,uint32) pure returns (uint64)"
                          }
                        },
                        "id": 31003,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "16270:32:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      },
                      {
                        "id": 31004,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30957,
                        "src": "16316:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 31005,
                        "name": "_recipient",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30954,
                        "src": "16336:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "hexValue": "30",
                            "id": 31008,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "16368:1:34",
                            "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": 31007,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "16360:7:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 31006,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "16360:7:34",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 31009,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "16360:10:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "id": 31010,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30972,
                        "src": "16384:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 30999,
                      "name": "Receive",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 30387,
                      "src": "16249:7:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint64_$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (uint64,address,address,address,uint256)"
                      }
                    },
                    "id": 31011,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16249:152:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 31012,
                  "nodeType": "EmitStatement",
                  "src": "16244:157:34"
                }
              ]
            },
            "documentation": {
              "id": 30944,
              "nodeType": "StructuredDocumentation",
              "src": "14724:602:34",
              "text": " @notice Send tokens to a specified recipient.\n @dev Unlocks canonical tokens from escrow in BridgeRouter\n      OR Mints representation tokens\n @param _origin The domain of the chain from which the transfer originated\n @param _nonce The unique identifier for the message from origin to\n        destination\n @param _tokenId The canonical token identifier to credit\n @param _action The contents of the transfer message\n @param _recipient The recipient that will receive tokens\n @return _token The address of the local token contract"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_giveTokens",
            "parameters": {
              "id": 30955,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30946,
                  "mutability": "mutable",
                  "name": "_origin",
                  "nodeType": "VariableDeclaration",
                  "scope": 31014,
                  "src": "15361:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 30945,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "15361:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30948,
                  "mutability": "mutable",
                  "name": "_nonce",
                  "nodeType": "VariableDeclaration",
                  "scope": 31014,
                  "src": "15385:13:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 30947,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "15385:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30950,
                  "mutability": "mutable",
                  "name": "_tokenId",
                  "nodeType": "VariableDeclaration",
                  "scope": 31014,
                  "src": "15408:16:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes29",
                    "typeString": "bytes29"
                  },
                  "typeName": {
                    "id": 30949,
                    "name": "bytes29",
                    "nodeType": "ElementaryTypeName",
                    "src": "15408:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30952,
                  "mutability": "mutable",
                  "name": "_action",
                  "nodeType": "VariableDeclaration",
                  "scope": 31014,
                  "src": "15434:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes29",
                    "typeString": "bytes29"
                  },
                  "typeName": {
                    "id": 30951,
                    "name": "bytes29",
                    "nodeType": "ElementaryTypeName",
                    "src": "15434:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes29",
                      "typeString": "bytes29"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 30954,
                  "mutability": "mutable",
                  "name": "_recipient",
                  "nodeType": "VariableDeclaration",
                  "scope": 31014,
                  "src": "15459:18:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30953,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "15459:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "15351:132:34"
            },
            "returnParameters": {
              "id": 30958,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 30957,
                  "mutability": "mutable",
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 31014,
                  "src": "15502:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30956,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "15502:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "15501:16:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 31033,
            "nodeType": "FunctionDefinition",
            "src": "16672:185:34",
            "body": {
              "id": 31032,
              "nodeType": "Block",
              "src": "16792:65:34",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 31028,
                        "name": "_recipient",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 31021,
                        "src": "16830:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 31029,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 31019,
                        "src": "16842:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "arguments": [
                          {
                            "id": 31025,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 31017,
                            "src": "16809:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 31024,
                          "name": "IERC20",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 27517,
                          "src": "16802:6:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IERC20_$27517_$",
                            "typeString": "type(contract IERC20)"
                          }
                        },
                        "id": 31026,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "16802:14:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$27517",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 31027,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 27551,
                      "src": "16802:27:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$27517_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$27517_$",
                        "typeString": "function (contract IERC20,address,uint256)"
                      }
                    },
                    "id": 31030,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16802:48:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 31031,
                  "nodeType": "ExpressionStatement",
                  "src": "16802:48:34"
                }
              ]
            },
            "documentation": {
              "id": 31015,
              "nodeType": "StructuredDocumentation",
              "src": "16414:253:34",
              "text": " @notice Gives local tokens on inbound bridge message\n @dev May record ProcessFailure instead of transferring the asset itself\n @param _token The asset\n @param _amount The amount\n @param _recipient The recipient"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_giveLocal",
            "parameters": {
              "id": 31022,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 31017,
                  "mutability": "mutable",
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 31033,
                  "src": "16701:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 31016,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "16701:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 31019,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 31033,
                  "src": "16725:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 31018,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "16725:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 31021,
                  "mutability": "mutable",
                  "name": "_recipient",
                  "nodeType": "VariableDeclaration",
                  "scope": 31033,
                  "src": "16750:18:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 31020,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "16750:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "16691:83:34"
            },
            "returnParameters": {
              "id": 31023,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "16792:0:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "id": 31061,
            "nodeType": "FunctionDefinition",
            "src": "17153:416:34",
            "body": {
              "id": 31060,
              "nodeType": "Block",
              "src": "17294:275:34",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 31049,
                        "name": "_recipient",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 31040,
                        "src": "17433:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 31050,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 31038,
                        "src": "17445:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "arguments": [
                          {
                            "id": 31046,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 31036,
                            "src": "17420:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 31045,
                          "name": "IBridgeToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 33609,
                          "src": "17407:12:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IBridgeToken_$33609_$",
                            "typeString": "type(contract IBridgeToken)"
                          }
                        },
                        "id": 31047,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "17407:20:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                          "typeString": "contract IBridgeToken"
                        }
                      },
                      "id": 31048,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "mint",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33589,
                      "src": "17407:25:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256) external"
                      }
                    },
                    "id": 31051,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "17407:46:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 31052,
                  "nodeType": "ExpressionStatement",
                  "src": "17407:46:34"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 31057,
                        "name": "_detailsHash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 31042,
                        "src": "17549:12:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "expression": {
                        "arguments": [
                          {
                            "id": 31054,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 31036,
                            "src": "17526:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 31053,
                          "name": "IBridgeToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 33609,
                          "src": "17513:12:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IBridgeToken_$33609_$",
                            "typeString": "type(contract IBridgeToken)"
                          }
                        },
                        "id": 31055,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "17513:20:34",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IBridgeToken_$33609",
                          "typeString": "contract IBridgeToken"
                        }
                      },
                      "id": 31056,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "setDetailsHash",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33594,
                      "src": "17513:35:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_bytes32_$returns$__$",
                        "typeString": "function (bytes32) external"
                      }
                    },
                    "id": 31058,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "17513:49:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 31059,
                  "nodeType": "ExpressionStatement",
                  "src": "17513:49:34"
                }
              ]
            },
            "documentation": {
              "id": 31034,
              "nodeType": "StructuredDocumentation",
              "src": "16863:285:34",
              "text": " @notice Gives remote tokens on inbound bridge message\n @dev Mints the appropriate amount to the user\n @param _token The asset\n @param _amount The amount\n @param _recipient The recipient\n @param _detailsHash The hash of the token details"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_giveRepr",
            "parameters": {
              "id": 31043,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 31036,
                  "mutability": "mutable",
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 31061,
                  "src": "17181:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 31035,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "17181:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 31038,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 31061,
                  "src": "17205:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 31037,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17205:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 31040,
                  "mutability": "mutable",
                  "name": "_recipient",
                  "nodeType": "VariableDeclaration",
                  "scope": 31061,
                  "src": "17230:18:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 31039,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "17230:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 31042,
                  "mutability": "mutable",
                  "name": "_detailsHash",
                  "nodeType": "VariableDeclaration",
                  "scope": 31061,
                  "src": "17258:20:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 31041,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "17258:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "17171:113:34"
            },
            "returnParameters": {
              "id": 31044,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17294:0:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 31090,
            "nodeType": "FunctionDefinition",
            "src": "17954:692:34",
            "body": {
              "id": 31089,
              "nodeType": "Block",
              "src": "17998:648:34",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 31078,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 31070,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "id": 31067,
                          "name": "_recipient",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 31064,
                          "src": "18025:10:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 31068,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balance",
                        "nodeType": "MemberAccess",
                        "src": "18025:18:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "<",
                      "rightExpression": {
                        "id": 31069,
                        "name": "DUST_AMOUNT",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30349,
                        "src": "18046:11:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "18025:32:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&&",
                    "rightExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 31077,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "arguments": [
                            {
                              "id": 31073,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -28,
                              "src": "18081:4:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_BaseBridgeRouter_$31120",
                                "typeString": "contract BaseBridgeRouter"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_BaseBridgeRouter_$31120",
                                "typeString": "contract BaseBridgeRouter"
                              }
                            ],
                            "id": 31072,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "18073:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 31071,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "18073:7:34",
                              "typeDescriptions": {}
                            }
                          },
                          "id": 31074,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18073:13:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "id": 31075,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balance",
                        "nodeType": "MemberAccess",
                        "src": "18073:21:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": ">=",
                      "rightExpression": {
                        "id": 31076,
                        "name": "DUST_AMOUNT",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 30349,
                        "src": "18098:11:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "18073:36:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "18025:84:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 31088,
                  "nodeType": "IfStatement",
                  "src": "18008:632:34",
                  "trueBody": {
                    "id": 31087,
                    "nodeType": "Block",
                    "src": "18120:520:34",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 31084,
                              "name": "DUST_AMOUNT",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 30349,
                              "src": "18617:11:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "arguments": [
                                {
                                  "id": 31081,
                                  "name": "_recipient",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 31064,
                                  "src": "18600:10:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 31080,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "18592:8:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_payable_$",
                                  "typeString": "type(address payable)"
                                },
                                "typeName": {
                                  "id": 31079,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "18592:8:34",
                                  "stateMutability": "payable",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 31082,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "18592:19:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "id": 31083,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "send",
                            "nodeType": "MemberAccess",
                            "src": "18592:24:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_send_nonpayable$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (uint256) returns (bool)"
                            }
                          },
                          "id": 31085,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18592:37:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 31086,
                        "nodeType": "ExpressionStatement",
                        "src": "18592:37:34"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 31062,
              "nodeType": "StructuredDocumentation",
              "src": "17633:316:34",
              "text": " @notice Dust the recipient. This feature allows chain operators to use\n the Bridge as a faucet if so desired. Any gas asset held by the\n bridge will be slowly sent to users who need initial gas bootstrapping\n @dev Does not dust if insufficient funds, or if user has funds already"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_dust",
            "parameters": {
              "id": 31065,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 31064,
                  "mutability": "mutable",
                  "name": "_recipient",
                  "nodeType": "VariableDeclaration",
                  "scope": 31090,
                  "src": "17969:18:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 31063,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "17969:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "17968:20:34"
            },
            "returnParameters": {
              "id": 31066,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17998:0:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 31111,
            "nodeType": "FunctionDefinition",
            "src": "19095:171:34",
            "body": {
              "id": 31110,
              "nodeType": "Block",
              "src": "19210:56:34",
              "statements": [
                {
                  "expression": {
                    "commonType": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    },
                    "id": 31108,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "components": [
                        {
                          "commonType": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          },
                          "id": 31105,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "arguments": [
                              {
                                "id": 31102,
                                "name": "_origin",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 31093,
                                "src": "19235:7:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              ],
                              "id": 31101,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "19228:6:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": {
                                "id": 31100,
                                "name": "uint64",
                                "nodeType": "ElementaryTypeName",
                                "src": "19228:6:34",
                                "typeDescriptions": {}
                              }
                            },
                            "id": 31103,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "19228:15:34",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<<",
                          "rightExpression": {
                            "hexValue": "3332",
                            "id": 31104,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "19247:2:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_32_by_1",
                              "typeString": "int_const 32"
                            },
                            "value": "32"
                          },
                          "src": "19228:21:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        }
                      ],
                      "id": 31106,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "19227:23:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "|",
                    "rightExpression": {
                      "id": 31107,
                      "name": "_nonce",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 31095,
                      "src": "19253:6:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      }
                    },
                    "src": "19227:32:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "functionReturnParameters": 31099,
                  "id": 31109,
                  "nodeType": "Return",
                  "src": "19220:39:34"
                }
              ]
            },
            "documentation": {
              "id": 31091,
              "nodeType": "StructuredDocumentation",
              "src": "18702:388:34",
              "text": " @notice Internal utility function that combines\n         `_origin` and `_nonce`.\n @dev Both origin and nonce should be less than 2^32 - 1\n @param _origin Domain of chain where the transfer originated\n @param _nonce The unique identifier for the message from origin to\ndestination\n @return Returns (`_origin` << 32) & `_nonce`"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_originAndNonce",
            "parameters": {
              "id": 31096,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 31093,
                  "mutability": "mutable",
                  "name": "_origin",
                  "nodeType": "VariableDeclaration",
                  "scope": 31111,
                  "src": "19120:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 31092,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "19120:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 31095,
                  "mutability": "mutable",
                  "name": "_nonce",
                  "nodeType": "VariableDeclaration",
                  "scope": 31111,
                  "src": "19136:13:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 31094,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "19136:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "19119:31:34"
            },
            "returnParameters": {
              "id": 31099,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 31098,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 31111,
                  "src": "19198:6:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 31097,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "19198:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "19197:8:34"
            },
            "scope": 31120,
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 31119,
            "nodeType": "FunctionDefinition",
            "src": "19469:84:34",
            "body": {
              "id": 31118,
              "nodeType": "Block",
              "src": "19524:29:34",
              "statements": []
            },
            "baseFunctions": [
              23135
            ],
            "documentation": {
              "id": 31112,
              "nodeType": "StructuredDocumentation",
              "src": "19272:192:34",
              "text": " @dev should be impossible to renounce ownership;\n      we override OpenZeppelin OwnableUpgradeable's\n      implementation of renounceOwnership to make it a no-op"
            },
            "functionSelector": "715018a6",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 31116,
                "modifierName": {
                  "id": 31115,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 23113,
                  "src": "19514:9:34",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "19514:9:34"
              }
            ],
            "name": "renounceOwnership",
            "overrides": {
              "id": 31114,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "19505:8:34"
            },
            "parameters": {
              "id": 31113,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "19495:2:34"
            },
            "returnParameters": {
              "id": 31117,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "19524:0:34"
            },
            "scope": 31120,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "abstract": true,
        "baseContracts": [
          {
            "baseName": {
              "id": 30331,
              "name": "Version0",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 44622,
              "src": "1162:8:34",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Version0_$44622",
                "typeString": "contract Version0"
              }
            },
            "id": 30332,
            "nodeType": "InheritanceSpecifier",
            "src": "1162:8:34"
          },
          {
            "baseName": {
              "id": 30333,
              "name": "Router",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 46768,
              "src": "1172:6:34",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Router_$46768",
                "typeString": "contract Router"
              }
            },
            "id": 30334,
            "nodeType": "InheritanceSpecifier",
            "src": "1172:6:34"
          }
        ],
        "contractDependencies": [
          23168,
          23676,
          25131,
          44622,
          45034,
          46768,
          46866
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 30330,
          "nodeType": "StructuredDocumentation",
          "src": "1089:34:34",
          "text": " @title BaseBridgeRouter"
        },
        "fullyImplemented": true,
        "linearizedBaseContracts": [
          31120,
          46768,
          45034,
          46866,
          23168,
          25131,
          23676,
          44622
        ],
        "name": "BaseBridgeRouter",
        "scope": 31251
      },
      {
        "id": 31124,
        "nodeType": "ContractDefinition",
        "src": "19588:46:34",
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 31122,
              "name": "BaseBridgeRouter",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 31120,
              "src": "19613:16:34",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_BaseBridgeRouter_$31120",
                "typeString": "contract BaseBridgeRouter"
              }
            },
            "id": 31123,
            "nodeType": "InheritanceSpecifier",
            "src": "19613:16:34"
          }
        ],
        "contractDependencies": [
          23168,
          23676,
          25131,
          31120,
          44622,
          45034,
          46768,
          46866
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 31121,
          "nodeType": "StructuredDocumentation",
          "src": "19557:30:34",
          "text": " @title BridgeRouter"
        },
        "fullyImplemented": true,
        "linearizedBaseContracts": [
          31124,
          31120,
          46768,
          45034,
          46866,
          23168,
          25131,
          23676,
          44622
        ],
        "name": "BridgeRouter",
        "scope": 31251
      },
      {
        "id": 31250,
        "nodeType": "ContractDefinition",
        "src": "19675:2042:34",
        "nodes": [
          {
            "id": 31130,
            "nodeType": "UsingForDirective",
            "src": "19731:27:34",
            "libraryName": {
              "id": 31128,
              "name": "SafeERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 27730,
              "src": "19737:9:34",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeERC20_$27730",
                "typeString": "library SafeERC20"
              }
            },
            "typeName": {
              "id": 31129,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 27517,
              "src": "19751:6:34",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$27517",
                "typeString": "contract IERC20"
              }
            }
          },
          {
            "id": 31132,
            "nodeType": "VariableDeclaration",
            "src": "19812:44:34",
            "constant": false,
            "functionSelector": "4fb3ccc5",
            "mutability": "immutable",
            "name": "accountant",
            "scope": 31250,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IEventAccountant_$33635",
              "typeString": "contract IEventAccountant"
            },
            "typeName": {
              "id": 31131,
              "name": "IEventAccountant",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 33635,
              "src": "19812:16:34",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IEventAccountant_$33635",
                "typeString": "contract IEventAccountant"
              }
            },
            "visibility": "public"
          },
          {
            "id": 31144,
            "nodeType": "FunctionDefinition",
            "src": "19899:92:34",
            "body": {
              "id": 31143,
              "nodeType": "Block",
              "src": "19932:59:34",
              "statements": [
                {
                  "expression": {
                    "id": 31141,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 31137,
                      "name": "accountant",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 31132,
                      "src": "19942:10:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IEventAccountant_$33635",
                        "typeString": "contract IEventAccountant"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 31139,
                          "name": "_accountant",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 31134,
                          "src": "19972:11:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 31138,
                        "name": "IEventAccountant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 33635,
                        "src": "19955:16:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_IEventAccountant_$33635_$",
                          "typeString": "type(contract IEventAccountant)"
                        }
                      },
                      "id": 31140,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "19955:29:34",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IEventAccountant_$33635",
                        "typeString": "contract IEventAccountant"
                      }
                    },
                    "src": "19942:42:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IEventAccountant_$33635",
                      "typeString": "contract IEventAccountant"
                    }
                  },
                  "id": 31142,
                  "nodeType": "ExpressionStatement",
                  "src": "19942:42:34"
                }
              ]
            },
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "parameters": {
              "id": 31135,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 31134,
                  "mutability": "mutable",
                  "name": "_accountant",
                  "nodeType": "VariableDeclaration",
                  "scope": 31144,
                  "src": "19911:19:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 31133,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "19911:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "19910:21:34"
            },
            "returnParameters": {
              "id": 31136,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "19932:0:34"
            },
            "scope": 31250,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 31214,
            "nodeType": "FunctionDefinition",
            "src": "20104:692:34",
            "body": {
              "id": 31213,
              "nodeType": "Block",
              "src": "20156:640:34",
              "statements": [
                {
                  "assignments": [
                    31153
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 31153,
                      "mutability": "mutable",
                      "name": "_assets",
                      "nodeType": "VariableDeclaration",
                      "scope": 31213,
                      "src": "20166:34:34",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_address_payable_$14_memory_ptr",
                        "typeString": "address payable[14]"
                      },
                      "typeName": {
                        "baseType": {
                          "id": 31150,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20166:15:34",
                          "stateMutability": "payable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "id": 31152,
                        "length": {
                          "hexValue": "3134",
                          "id": 31151,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "20182:2:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_14_by_1",
                            "typeString": "int_const 14"
                          },
                          "value": "14"
                        },
                        "nodeType": "ArrayTypeName",
                        "src": "20166:19:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_payable_$14_storage_ptr",
                          "typeString": "address payable[14]"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 31157,
                  "initialValue": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "id": 31154,
                        "name": "accountant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 31132,
                        "src": "20203:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IEventAccountant_$33635",
                          "typeString": "contract IEventAccountant"
                        }
                      },
                      "id": 31155,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "affectedAssets",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33627,
                      "src": "20203:25:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_pure$__$returns$_t_array$_t_address_payable_$14_memory_ptr_$",
                        "typeString": "function () pure external returns (address payable[14] memory)"
                      }
                    },
                    "id": 31156,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "20203:27:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_payable_$14_memory_ptr",
                      "typeString": "address payable[14] memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "20166:64:34"
                },
                {
                  "body": {
                    "id": 31211,
                    "nodeType": "Block",
                    "src": "20273:517:34",
                    "statements": [
                      {
                        "assignments": [
                          31169
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 31169,
                            "mutability": "mutable",
                            "name": "_asset",
                            "nodeType": "VariableDeclaration",
                            "scope": 31211,
                            "src": "20287:13:34",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$27517",
                              "typeString": "contract IERC20"
                            },
                            "typeName": {
                              "id": 31168,
                              "name": "IERC20",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 27517,
                              "src": "20287:6:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$27517",
                                "typeString": "contract IERC20"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 31175,
                        "initialValue": {
                          "arguments": [
                            {
                              "baseExpression": {
                                "id": 31171,
                                "name": "_assets",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 31153,
                                "src": "20310:7:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_address_payable_$14_memory_ptr",
                                  "typeString": "address payable[14] memory"
                                }
                              },
                              "id": 31173,
                              "indexExpression": {
                                "id": 31172,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 31159,
                                "src": "20318:1:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "20310:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 31170,
                            "name": "IERC20",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 27517,
                            "src": "20303:6:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_IERC20_$27517_$",
                              "typeString": "type(contract IERC20)"
                            }
                          },
                          "id": 31174,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20303:18:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$27517",
                            "typeString": "contract IERC20"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "20287:34:34"
                      },
                      {
                        "assignments": [
                          31177
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 31177,
                            "mutability": "mutable",
                            "name": "_balance",
                            "nodeType": "VariableDeclaration",
                            "scope": 31211,
                            "src": "20335:16:34",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 31176,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "20335:7:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 31185,
                        "initialValue": {
                          "arguments": [
                            {
                              "arguments": [
                                {
                                  "id": 31182,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "20379:4:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_EthereumBridgeRouter_$31250",
                                    "typeString": "contract EthereumBridgeRouter"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_EthereumBridgeRouter_$31250",
                                    "typeString": "contract EthereumBridgeRouter"
                                  }
                                ],
                                "id": 31181,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "20371:7:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 31180,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "20371:7:34",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 31183,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "20371:13:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "id": 31178,
                              "name": "_asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 31169,
                              "src": "20354:6:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$27517",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 31179,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 27456,
                            "src": "20354:16:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 31184,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20354:31:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "20335:50:34"
                      },
                      {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 31188,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 31186,
                            "name": "_balance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 31177,
                            "src": "20403:8:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "hexValue": "30",
                            "id": 31187,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "20414:1:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "20403:12:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 31210,
                        "nodeType": "IfStatement",
                        "src": "20399:381:34",
                        "trueBody": {
                          "id": 31209,
                          "nodeType": "Block",
                          "src": "20417:363:34",
                          "statements": [
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "id": 31194,
                                        "name": "accountant",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 31132,
                                        "src": "20687:10:34",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_IEventAccountant_$33635",
                                          "typeString": "contract IEventAccountant"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_IEventAccountant_$33635",
                                          "typeString": "contract IEventAccountant"
                                        }
                                      ],
                                      "id": 31193,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "20679:7:34",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 31192,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "20679:7:34",
                                        "typeDescriptions": {}
                                      }
                                    },
                                    "id": 31195,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "20679:19:34",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "hexValue": "30",
                                    "id": 31196,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "20700:1:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "expression": {
                                    "id": 31189,
                                    "name": "_asset",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 31169,
                                    "src": "20664:6:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$27517",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "id": 31191,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "approve",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 27486,
                                  "src": "20664:14:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                    "typeString": "function (address,uint256) external returns (bool)"
                                  }
                                },
                                "id": 31197,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "20664:38:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 31198,
                              "nodeType": "ExpressionStatement",
                              "src": "20664:38:34"
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "id": 31204,
                                        "name": "accountant",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 31132,
                                        "src": "20743:10:34",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_IEventAccountant_$33635",
                                          "typeString": "contract IEventAccountant"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_IEventAccountant_$33635",
                                          "typeString": "contract IEventAccountant"
                                        }
                                      ],
                                      "id": 31203,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "20735:7:34",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 31202,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "20735:7:34",
                                        "typeDescriptions": {}
                                      }
                                    },
                                    "id": 31205,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "20735:19:34",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "id": 31206,
                                    "name": "_balance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 31177,
                                    "src": "20756:8:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "id": 31199,
                                    "name": "_asset",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 31169,
                                    "src": "20720:6:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$27517",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "id": 31201,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "approve",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 27486,
                                  "src": "20720:14:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                    "typeString": "function (address,uint256) external returns (bool)"
                                  }
                                },
                                "id": 31207,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "20720:45:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 31208,
                              "nodeType": "ExpressionStatement",
                              "src": "20720:45:34"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 31164,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 31162,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 31159,
                      "src": "20260:1:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "hexValue": "3134",
                      "id": 31163,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "20264:2:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_14_by_1",
                        "typeString": "int_const 14"
                      },
                      "value": "14"
                    },
                    "src": "20260:6:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 31212,
                  "initializationExpression": {
                    "assignments": [
                      31159
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 31159,
                        "mutability": "mutable",
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "scope": 31212,
                        "src": "20245:9:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 31158,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20245:7:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "visibility": "internal"
                      }
                    ],
                    "id": 31161,
                    "initialValue": {
                      "hexValue": "30",
                      "id": 31160,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "20257:1:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "20245:13:34"
                  },
                  "loopExpression": {
                    "expression": {
                      "id": 31166,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "20268:3:34",
                      "subExpression": {
                        "id": 31165,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 31159,
                        "src": "20268:1:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 31167,
                    "nodeType": "ExpressionStatement",
                    "src": "20268:3:34"
                  },
                  "nodeType": "ForStatement",
                  "src": "20240:550:34"
                }
              ]
            },
            "documentation": {
              "id": 31145,
              "nodeType": "StructuredDocumentation",
              "src": "19997:102:34",
              "text": " @notice Approve funds remaining in the bridge router to be collected via accountant"
            },
            "functionSelector": "459f1383",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 31148,
                "modifierName": {
                  "id": 31147,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 23113,
                  "src": "20146:9:34",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "20146:9:34"
              }
            ],
            "name": "approveAffectedAssets",
            "parameters": {
              "id": 31146,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "20134:2:34"
            },
            "returnParameters": {
              "id": 31149,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "20156:0:34"
            },
            "scope": 31250,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 31249,
            "nodeType": "FunctionDefinition",
            "src": "21060:655:34",
            "body": {
              "id": 31248,
              "nodeType": "Block",
              "src": "21181:534:34",
              "statements": [
                {
                  "condition": {
                    "arguments": [
                      {
                        "id": 31227,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 31217,
                        "src": "21550:6:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "id": 31225,
                        "name": "accountant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 31132,
                        "src": "21523:10:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IEventAccountant_$33635",
                          "typeString": "contract IEventAccountant"
                        }
                      },
                      "id": 31226,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "isAffectedAsset",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 33634,
                      "src": "21523:26:34",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_bool_$",
                        "typeString": "function (address) view external returns (bool)"
                      }
                    },
                    "id": 31228,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "21523:34:34",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 31246,
                    "nodeType": "Block",
                    "src": "21636:73:34",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 31242,
                              "name": "_recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 31221,
                              "src": "21678:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 31243,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 31219,
                              "src": "21690:7:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "arguments": [
                                {
                                  "id": 31239,
                                  "name": "_token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 31217,
                                  "src": "21657:6:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 31238,
                                "name": "IERC20",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 27517,
                                "src": "21650:6:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_IERC20_$27517_$",
                                  "typeString": "type(contract IERC20)"
                                }
                              },
                              "id": 31240,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "21650:14:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$27517",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 31241,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 27551,
                            "src": "21650:27:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$27517_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$27517_$",
                              "typeString": "function (contract IERC20,address,uint256)"
                            }
                          },
                          "id": 31244,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21650:48:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 31245,
                        "nodeType": "ExpressionStatement",
                        "src": "21650:48:34"
                      }
                    ]
                  },
                  "id": 31247,
                  "nodeType": "IfStatement",
                  "src": "21519:190:34",
                  "trueBody": {
                    "id": 31237,
                    "nodeType": "Block",
                    "src": "21559:71:34",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 31232,
                              "name": "_token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 31217,
                              "src": "21591:6:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 31233,
                              "name": "_recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 31221,
                              "src": "21599:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 31234,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 31219,
                              "src": "21611:7:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "id": 31229,
                              "name": "accountant",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 31132,
                              "src": "21573:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IEventAccountant_$33635",
                                "typeString": "contract IEventAccountant"
                              }
                            },
                            "id": 31231,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "record",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 33620,
                            "src": "21573:17:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256) external"
                            }
                          },
                          "id": 31235,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21573:46:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 31236,
                        "nodeType": "ExpressionStatement",
                        "src": "21573:46:34"
                      }
                    ]
                  }
                }
              ]
            },
            "baseFunctions": [
              31033
            ],
            "documentation": {
              "id": 31215,
              "nodeType": "StructuredDocumentation",
              "src": "20802:253:34",
              "text": " @notice Gives local tokens on inbound bridge message\n @dev May record ProcessFailure instead of transferring the asset itself\n @param _token The asset\n @param _amount The amount\n @param _recipient The recipient"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_giveLocal",
            "overrides": {
              "id": 31223,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "21172:8:34"
            },
            "parameters": {
              "id": 31222,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 31217,
                  "mutability": "mutable",
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "scope": 31249,
                  "src": "21089:14:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 31216,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "21089:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 31219,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 31249,
                  "src": "21113:15:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 31218,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "21113:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 31221,
                  "mutability": "mutable",
                  "name": "_recipient",
                  "nodeType": "VariableDeclaration",
                  "scope": 31249,
                  "src": "21138:18:34",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 31220,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "21138:7:34",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "21079:83:34"
            },
            "returnParameters": {
              "id": 31224,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "21181:0:34"
            },
            "scope": 31250,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 31126,
              "name": "BaseBridgeRouter",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 31120,
              "src": "19708:16:34",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_BaseBridgeRouter_$31120",
                "typeString": "contract BaseBridgeRouter"
              }
            },
            "id": 31127,
            "nodeType": "InheritanceSpecifier",
            "src": "19708:16:34"
          }
        ],
        "contractDependencies": [
          23168,
          23676,
          25131,
          31120,
          44622,
          45034,
          46768,
          46866
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 31125,
          "nodeType": "StructuredDocumentation",
          "src": "19636:38:34",
          "text": " @title EthereumBridgeRouter"
        },
        "fullyImplemented": true,
        "linearizedBaseContracts": [
          31250,
          31120,
          46768,
          45034,
          46866,
          23168,
          25131,
          23676,
          44622
        ],
        "name": "EthereumBridgeRouter",
        "scope": 31251
      }
    ],
    "license": "MIT OR Apache-2.0"
  },
  "id": 34
}