{
  "fileName": "GSNRecipient.sol",
  "contractName": "GSNRecipientUpgradeSafe",
  "source": "pragma solidity ^0.6.0;\n\nimport \"./IRelayRecipient.sol\";\nimport \"./IRelayHub.sol\";\nimport \"./Context.sol\";\nimport \"../Initializable.sol\";\n\n/**\n * @dev Base GSN recipient contract: includes the {IRelayRecipient} interface\n * and enables GSN support on all contracts in the inheritance tree.\n *\n * TIP: This contract is abstract. The functions {IRelayRecipient-acceptRelayedCall},\n *  {_preRelayedCall}, and {_postRelayedCall} are not implemented and must be\n * provided by derived contracts. See the\n * xref:ROOT:gsn-strategies.adoc#gsn-strategies[GSN strategies] for more\n * information on how to use the pre-built {GSNRecipientSignature} and\n * {GSNRecipientERC20Fee}, or how to write your own.\n */\nabstract contract GSNRecipientUpgradeSafe is Initializable, IRelayRecipient, ContextUpgradeSafe {\n    function __GSNRecipient_init() internal initializer {\n        __Context_init_unchained();\n        __GSNRecipient_init_unchained();\n    }\n\n    function __GSNRecipient_init_unchained() internal initializer {\n\n        _relayHub = 0xD216153c06E857cD7f72665E0aF1d7D82172F494;\n\n    }\n\n    // Default RelayHub address, deployed on mainnet and all testnets at the same address\n    address private _relayHub ;\n\n    uint256 constant private _RELAYED_CALL_ACCEPTED = 0;\n    uint256 constant private _RELAYED_CALL_REJECTED = 11;\n\n    // How much gas is forwarded to postRelayedCall\n    uint256 constant internal _POST_RELAYED_CALL_MAX_GAS = 100000;\n\n    /**\n     * @dev Emitted when a contract changes its {IRelayHub} contract to a new one.\n     */\n    event RelayHubChanged(address indexed oldRelayHub, address indexed newRelayHub);\n\n    /**\n     * @dev Returns the address of the {IRelayHub} contract for this recipient.\n     */\n    function getHubAddr() public view override returns (address) {\n        return _relayHub;\n    }\n\n    /**\n     * @dev Switches to a new {IRelayHub} instance. This method is added for future-proofing: there's no reason to not\n     * use the default instance.\n     *\n     * IMPORTANT: After upgrading, the {GSNRecipient} will no longer be able to receive relayed calls from the old\n     * {IRelayHub} instance. Additionally, all funds should be previously withdrawn via {_withdrawDeposits}.\n     */\n    function _upgradeRelayHub(address newRelayHub) internal virtual {\n        address currentRelayHub = _relayHub;\n        require(newRelayHub != address(0), \"GSNRecipient: new RelayHub is the zero address\");\n        require(newRelayHub != currentRelayHub, \"GSNRecipient: new RelayHub is the current one\");\n\n        emit RelayHubChanged(currentRelayHub, newRelayHub);\n\n        _relayHub = newRelayHub;\n    }\n\n    /**\n     * @dev Returns the version string of the {IRelayHub} for which this recipient implementation was built. If\n     * {_upgradeRelayHub} is used, the new {IRelayHub} instance should be compatible with this version.\n     */\n    // This function is view for future-proofing, it may require reading from\n    // storage in the future.\n    function relayHubVersion() public view returns (string memory) {\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n        return \"1.0.0\";\n    }\n\n    /**\n     * @dev Withdraws the recipient's deposits in `RelayHub`.\n     *\n     * Derived contracts should expose this in an external interface with proper access control.\n     */\n    function _withdrawDeposits(uint256 amount, address payable payee) internal virtual {\n        IRelayHub(_relayHub).withdraw(amount, payee);\n    }\n\n    // Overrides for Context's functions: when called from RelayHub, sender and\n    // data require some pre-processing: the actual sender is stored at the end\n    // of the call data, which in turns means it needs to be removed from it\n    // when handling said data.\n\n    /**\n     * @dev Replacement for msg.sender. Returns the actual sender of a transaction: msg.sender for regular transactions,\n     * and the end-user for GSN relayed calls (where msg.sender is actually `RelayHub`).\n     *\n     * IMPORTANT: Contracts derived from {GSNRecipient} should never use `msg.sender`, and use {_msgSender} instead.\n     */\n    function _msgSender() internal view virtual override returns (address payable) {\n        if (msg.sender != _relayHub) {\n            return msg.sender;\n        } else {\n            return _getRelayedCallSender();\n        }\n    }\n\n    /**\n     * @dev Replacement for msg.data. Returns the actual calldata of a transaction: msg.data for regular transactions,\n     * and a reduced version for GSN relayed calls (where msg.data contains additional information).\n     *\n     * IMPORTANT: Contracts derived from {GSNRecipient} should never use `msg.data`, and use {_msgData} instead.\n     */\n    function _msgData() internal view virtual override returns (bytes memory) {\n        if (msg.sender != _relayHub) {\n            return msg.data;\n        } else {\n            return _getRelayedCallData();\n        }\n    }\n\n    // Base implementations for pre and post relayedCall: only RelayHub can invoke them, and data is forwarded to the\n    // internal hook.\n\n    /**\n     * @dev See `IRelayRecipient.preRelayedCall`.\n     *\n     * This function should not be overriden directly, use `_preRelayedCall` instead.\n     *\n     * * Requirements:\n     *\n     * - the caller must be the `RelayHub` contract.\n     */\n    function preRelayedCall(bytes memory context) public virtual override returns (bytes32) {\n        require(msg.sender == getHubAddr(), \"GSNRecipient: caller is not RelayHub\");\n        return _preRelayedCall(context);\n    }\n\n    /**\n     * @dev See `IRelayRecipient.preRelayedCall`.\n     *\n     * Called by `GSNRecipient.preRelayedCall`, which asserts the caller is the `RelayHub` contract. Derived contracts\n     * must implement this function with any relayed-call preprocessing they may wish to do.\n     *\n     */\n    function _preRelayedCall(bytes memory context) internal virtual returns (bytes32);\n\n    /**\n     * @dev See `IRelayRecipient.postRelayedCall`.\n     *\n     * This function should not be overriden directly, use `_postRelayedCall` instead.\n     *\n     * * Requirements:\n     *\n     * - the caller must be the `RelayHub` contract.\n     */\n    function postRelayedCall(bytes memory context, bool success, uint256 actualCharge, bytes32 preRetVal) public virtual override {\n        require(msg.sender == getHubAddr(), \"GSNRecipient: caller is not RelayHub\");\n        _postRelayedCall(context, success, actualCharge, preRetVal);\n    }\n\n    /**\n     * @dev See `IRelayRecipient.postRelayedCall`.\n     *\n     * Called by `GSNRecipient.postRelayedCall`, which asserts the caller is the `RelayHub` contract. Derived contracts\n     * must implement this function with any relayed-call postprocessing they may wish to do.\n     *\n     */\n    function _postRelayedCall(bytes memory context, bool success, uint256 actualCharge, bytes32 preRetVal) internal virtual;\n\n    /**\n     * @dev Return this in acceptRelayedCall to proceed with the execution of a relayed call. Note that this contract\n     * will be charged a fee by RelayHub\n     */\n    function _approveRelayedCall() internal pure returns (uint256, bytes memory) {\n        return _approveRelayedCall(\"\");\n    }\n\n    /**\n     * @dev See `GSNRecipient._approveRelayedCall`.\n     *\n     * This overload forwards `context` to _preRelayedCall and _postRelayedCall.\n     */\n    function _approveRelayedCall(bytes memory context) internal pure returns (uint256, bytes memory) {\n        return (_RELAYED_CALL_ACCEPTED, context);\n    }\n\n    /**\n     * @dev Return this in acceptRelayedCall to impede execution of a relayed call. No fees will be charged.\n     */\n    function _rejectRelayedCall(uint256 errorCode) internal pure returns (uint256, bytes memory) {\n        return (_RELAYED_CALL_REJECTED + errorCode, \"\");\n    }\n\n    /*\n     * @dev Calculates how much RelayHub will charge a recipient for using `gas` at a `gasPrice`, given a relayer's\n     * `serviceFee`.\n     */\n    function _computeCharge(uint256 gas, uint256 gasPrice, uint256 serviceFee) internal pure returns (uint256) {\n        // The fee is expressed as a percentage. E.g. a value of 40 stands for a 40% fee, so the recipient will be\n        // charged for 1.4 times the spent amount.\n        return (gas * gasPrice * (100 + serviceFee)) / 100;\n    }\n\n    function _getRelayedCallSender() private pure returns (address payable result) {\n        // We need to read 20 bytes (an address) located at array index msg.data.length - 20. In memory, the array\n        // is prefixed with a 32-byte length value, so we first add 32 to get the memory read index. However, doing\n        // so would leave the address in the upper 20 bytes of the 32-byte word, which is inconvenient and would\n        // require bit shifting. We therefore subtract 12 from the read index so the address lands on the lower 20\n        // bytes. This can always be done due to the 32-byte prefix.\n\n        // The final memory read index is msg.data.length - 20 + 32 - 12 = msg.data.length. Using inline assembly is the\n        // easiest/most-efficient way to perform this operation.\n\n        // These fields are not accessible from assembly\n        bytes memory array = msg.data;\n        uint256 index = msg.data.length;\n\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.\n            result := and(mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n        }\n        return result;\n    }\n\n    function _getRelayedCallData() private pure returns (bytes memory) {\n        // RelayHub appends the sender address at the end of the calldata, so in order to retrieve the actual msg.data,\n        // we must strip the last 20 bytes (length of an address type) from it.\n\n        uint256 actualDataLength = msg.data.length - 20;\n        bytes memory actualData = new bytes(actualDataLength);\n\n        for (uint256 i = 0; i < actualDataLength; ++i) {\n            actualData[i] = msg.data[i];\n        }\n\n        return actualData;\n    }\n\n    uint256[49] private __gap;\n}\n",
  "sourcePath": "contracts/GSN/GSNRecipient.sol",
  "sourceMap": "",
  "deployedSourceMap": "",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldRelayHub",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newRelayHub",
          "type": "address"
        }
      ],
      "name": "RelayHubChanged",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "relay",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "encodedFunction",
          "type": "bytes"
        },
        {
          "internalType": "uint256",
          "name": "transactionFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "gasPrice",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "gasLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "nonce",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "approvalData",
          "type": "bytes"
        },
        {
          "internalType": "uint256",
          "name": "maxPossibleCharge",
          "type": "uint256"
        }
      ],
      "name": "acceptRelayedCall",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getHubAddr",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "context",
          "type": "bytes"
        },
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "actualCharge",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "preRetVal",
          "type": "bytes32"
        }
      ],
      "name": "postRelayedCall",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "context",
          "type": "bytes"
        }
      ],
      "name": "preRelayedCall",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "relayHubVersion",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "ast": {
    "absolutePath": "contracts/GSN/GSNRecipient.sol",
    "exportedSymbols": {
      "GSNRecipientUpgradeSafe": [
        425
      ]
    },
    "id": 426,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 46,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:1"
      },
      {
        "absolutePath": "contracts/GSN/IRelayRecipient.sol",
        "file": "./IRelayRecipient.sol",
        "id": 47,
        "nodeType": "ImportDirective",
        "scope": 426,
        "sourceUnit": 1335,
        "src": "25:31:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/GSN/IRelayHub.sol",
        "file": "./IRelayHub.sol",
        "id": 48,
        "nodeType": "ImportDirective",
        "scope": 426,
        "sourceUnit": 1279,
        "src": "57:25:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/GSN/Context.sol",
        "file": "./Context.sol",
        "id": 49,
        "nodeType": "ImportDirective",
        "scope": 426,
        "sourceUnit": 45,
        "src": "83:23:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/Initializable.sol",
        "file": "../Initializable.sol",
        "id": 50,
        "nodeType": "ImportDirective",
        "scope": 426,
        "sourceUnit": 1408,
        "src": "107:30:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 52,
              "name": "Initializable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1407,
              "src": "745:13:1",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Initializable_$1407",
                "typeString": "contract Initializable"
              }
            },
            "id": 53,
            "nodeType": "InheritanceSpecifier",
            "src": "745:13:1"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 54,
              "name": "IRelayRecipient",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1334,
              "src": "760:15:1",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IRelayRecipient_$1334",
                "typeString": "contract IRelayRecipient"
              }
            },
            "id": 55,
            "nodeType": "InheritanceSpecifier",
            "src": "760:15:1"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 56,
              "name": "ContextUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 44,
              "src": "777:18:1",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ContextUpgradeSafe_$44",
                "typeString": "contract ContextUpgradeSafe"
              }
            },
            "id": 57,
            "nodeType": "InheritanceSpecifier",
            "src": "777:18:1"
          }
        ],
        "contractDependencies": [
          44,
          1334,
          1407
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 51,
          "nodeType": "StructuredDocumentation",
          "src": "139:560:1",
          "text": "@dev Base GSN recipient contract: includes the {IRelayRecipient} interface\nand enables GSN support on all contracts in the inheritance tree.\n * TIP: This contract is abstract. The functions {IRelayRecipient-acceptRelayedCall},\n {_preRelayedCall}, and {_postRelayedCall} are not implemented and must be\nprovided by derived contracts. See the\nxref:ROOT:gsn-strategies.adoc#gsn-strategies[GSN strategies] for more\ninformation on how to use the pre-built {GSNRecipientSignature} and\n{GSNRecipientERC20Fee}, or how to write your own."
        },
        "fullyImplemented": false,
        "id": 425,
        "linearizedBaseContracts": [
          425,
          44,
          1334,
          1407
        ],
        "name": "GSNRecipientUpgradeSafe",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 68,
              "nodeType": "Block",
              "src": "854:84:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 62,
                      "name": "__Context_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19,
                      "src": "864:24:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 63,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "864:26:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 64,
                  "nodeType": "ExpressionStatement",
                  "src": "864:26:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 65,
                      "name": "__GSNRecipient_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 79,
                      "src": "900:29:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 66,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "900:31:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 67,
                  "nodeType": "ExpressionStatement",
                  "src": "900:31:1"
                }
              ]
            },
            "documentation": null,
            "id": 69,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 60,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 59,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "842:11:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "842:11:1"
              }
            ],
            "name": "__GSNRecipient_init",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 58,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "830:2:1"
            },
            "returnParameters": {
              "id": 61,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "854:0:1"
            },
            "scope": 425,
            "src": "802:136:1",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 78,
              "nodeType": "Block",
              "src": "1006:73:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 76,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 74,
                      "name": "_relayHub",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 81,
                      "src": "1017:9:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "307844323136313533633036453835376344376637323636354530614631643744383231373246343934",
                      "id": 75,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1029:42:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      },
                      "value": "0xD216153c06E857cD7f72665E0aF1d7D82172F494"
                    },
                    "src": "1017:54:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 77,
                  "nodeType": "ExpressionStatement",
                  "src": "1017:54:1"
                }
              ]
            },
            "documentation": null,
            "id": 79,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 72,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 71,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "994:11:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "994:11:1"
              }
            ],
            "name": "__GSNRecipient_init_unchained",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 70,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "982:2:1"
            },
            "returnParameters": {
              "id": 73,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1006:0:1"
            },
            "scope": 425,
            "src": "944:135:1",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 81,
            "mutability": "mutable",
            "name": "_relayHub",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 425,
            "src": "1175:25:1",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 80,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "1175:7:1",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": true,
            "id": 84,
            "mutability": "constant",
            "name": "_RELAYED_CALL_ACCEPTED",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 425,
            "src": "1208:51:1",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 82,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "1208:7:1",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 83,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "1258:1:1",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "private"
          },
          {
            "constant": true,
            "id": 87,
            "mutability": "constant",
            "name": "_RELAYED_CALL_REJECTED",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 425,
            "src": "1265:52:1",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 85,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "1265:7:1",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "3131",
              "id": 86,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "1315:2:1",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_11_by_1",
                "typeString": "int_const 11"
              },
              "value": "11"
            },
            "visibility": "private"
          },
          {
            "constant": true,
            "id": 90,
            "mutability": "constant",
            "name": "_POST_RELAYED_CALL_MAX_GAS",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 425,
            "src": "1376:61:1",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 88,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "1376:7:1",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "313030303030",
              "id": 89,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "1431:6:1",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_100000_by_1",
                "typeString": "int_const 100000"
              },
              "value": "100000"
            },
            "visibility": "internal"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 91,
              "nodeType": "StructuredDocumentation",
              "src": "1444:94:1",
              "text": "@dev Emitted when a contract changes its {IRelayHub} contract to a new one."
            },
            "id": 97,
            "name": "RelayHubChanged",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 96,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 93,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "oldRelayHub",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 97,
                  "src": "1565:27:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 92,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1565:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 95,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "newRelayHub",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 97,
                  "src": "1594:27:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 94,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1594:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1564:58:1"
            },
            "src": "1543:80:1"
          },
          {
            "baseFunctions": [
              1287
            ],
            "body": {
              "id": 106,
              "nodeType": "Block",
              "src": "1786:33:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 104,
                    "name": "_relayHub",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 81,
                    "src": "1803:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 103,
                  "id": 105,
                  "nodeType": "Return",
                  "src": "1796:16:1"
                }
              ]
            },
            "documentation": {
              "id": 98,
              "nodeType": "StructuredDocumentation",
              "src": "1629:91:1",
              "text": "@dev Returns the address of the {IRelayHub} contract for this recipient."
            },
            "functionSelector": "74e861d6",
            "id": 107,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getHubAddr",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 100,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1759:8:1"
            },
            "parameters": {
              "id": 99,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1744:2:1"
            },
            "returnParameters": {
              "id": 103,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 102,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 107,
                  "src": "1777:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 101,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1777:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1776:9:1"
            },
            "scope": 425,
            "src": "1725:94:1",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 143,
              "nodeType": "Block",
              "src": "2288:339:1",
              "statements": [
                {
                  "assignments": [
                    114
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 114,
                      "mutability": "mutable",
                      "name": "currentRelayHub",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 143,
                      "src": "2298:23:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 113,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "2298:7:1",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 116,
                  "initialValue": {
                    "argumentTypes": null,
                    "id": 115,
                    "name": "_relayHub",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 81,
                    "src": "2324:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2298:35:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 123,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 118,
                          "name": "newRelayHub",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 110,
                          "src": "2351:11:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 121,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2374:1:1",
                              "subdenomination": null,
                              "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": 120,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2366:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 119,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "2366:7:1",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 122,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2366:10:1",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "2351:25:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "47534e526563697069656e743a206e65772052656c617948756220697320746865207a65726f2061646472657373",
                        "id": 124,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2378:48:1",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_6f491055395682510b2d42bd98bb3e1d6b09e7412a20297798e6a1eaf3a959fc",
                          "typeString": "literal_string \"GSNRecipient: new RelayHub is the zero address\""
                        },
                        "value": "GSNRecipient: new RelayHub is the zero address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_6f491055395682510b2d42bd98bb3e1d6b09e7412a20297798e6a1eaf3a959fc",
                          "typeString": "literal_string \"GSNRecipient: new RelayHub is the zero address\""
                        }
                      ],
                      "id": 117,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2343:7:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 125,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2343:84:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 126,
                  "nodeType": "ExpressionStatement",
                  "src": "2343:84:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 130,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 128,
                          "name": "newRelayHub",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 110,
                          "src": "2445:11:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 129,
                          "name": "currentRelayHub",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 114,
                          "src": "2460:15:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "2445:30:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "47534e526563697069656e743a206e65772052656c6179487562206973207468652063757272656e74206f6e65",
                        "id": 131,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2477:47:1",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_a813abdd30d501e1e20e9af7c88309a559a778de193d0ada7263f2d66933ec3e",
                          "typeString": "literal_string \"GSNRecipient: new RelayHub is the current one\""
                        },
                        "value": "GSNRecipient: new RelayHub is the current one"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_a813abdd30d501e1e20e9af7c88309a559a778de193d0ada7263f2d66933ec3e",
                          "typeString": "literal_string \"GSNRecipient: new RelayHub is the current one\""
                        }
                      ],
                      "id": 127,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2437:7:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 132,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2437:88:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 133,
                  "nodeType": "ExpressionStatement",
                  "src": "2437:88:1"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 135,
                        "name": "currentRelayHub",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 114,
                        "src": "2557:15:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 136,
                        "name": "newRelayHub",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 110,
                        "src": "2574:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 134,
                      "name": "RelayHubChanged",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 97,
                      "src": "2541:15:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 137,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2541:45:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 138,
                  "nodeType": "EmitStatement",
                  "src": "2536:50:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 141,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 139,
                      "name": "_relayHub",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 81,
                      "src": "2597:9:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 140,
                      "name": "newRelayHub",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 110,
                      "src": "2609:11:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "2597:23:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 142,
                  "nodeType": "ExpressionStatement",
                  "src": "2597:23:1"
                }
              ]
            },
            "documentation": {
              "id": 108,
              "nodeType": "StructuredDocumentation",
              "src": "1825:394:1",
              "text": "@dev Switches to a new {IRelayHub} instance. This method is added for future-proofing: there's no reason to not\nuse the default instance.\n     * IMPORTANT: After upgrading, the {GSNRecipient} will no longer be able to receive relayed calls from the old\n{IRelayHub} instance. Additionally, all funds should be previously withdrawn via {_withdrawDeposits}."
            },
            "id": 144,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_upgradeRelayHub",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 111,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 110,
                  "mutability": "mutable",
                  "name": "newRelayHub",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 144,
                  "src": "2250:19:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 109,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2250:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2249:21:1"
            },
            "returnParameters": {
              "id": 112,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2288:0:1"
            },
            "scope": 425,
            "src": "2224:403:1",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 154,
              "nodeType": "Block",
              "src": "3036:164:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 150,
                    "name": "this",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": -28,
                    "src": "3046:4:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_GSNRecipientUpgradeSafe_$425",
                      "typeString": "contract GSNRecipientUpgradeSafe"
                    }
                  },
                  "id": 151,
                  "nodeType": "ExpressionStatement",
                  "src": "3046:4:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "312e302e30",
                    "id": 152,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "3186:7:1",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c",
                      "typeString": "literal_string \"1.0.0\""
                    },
                    "value": "1.0.0"
                  },
                  "functionReturnParameters": 149,
                  "id": 153,
                  "nodeType": "Return",
                  "src": "3179:14:1"
                }
              ]
            },
            "documentation": {
              "id": 145,
              "nodeType": "StructuredDocumentation",
              "src": "2633:227:1",
              "text": "@dev Returns the version string of the {IRelayHub} for which this recipient implementation was built. If\n{_upgradeRelayHub} is used, the new {IRelayHub} instance should be compatible with this version."
            },
            "functionSelector": "ad61ccd5",
            "id": 155,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "relayHubVersion",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 146,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2997:2:1"
            },
            "returnParameters": {
              "id": 149,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 148,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 155,
                  "src": "3021:13:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 147,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3021:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3020:15:1"
            },
            "scope": 425,
            "src": "2973:227:1",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 171,
              "nodeType": "Block",
              "src": "3471:61:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 167,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 158,
                        "src": "3511:6:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 168,
                        "name": "payee",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 160,
                        "src": "3519:5:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 164,
                            "name": "_relayHub",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 81,
                            "src": "3491:9:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 163,
                          "name": "IRelayHub",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1278,
                          "src": "3481:9:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IRelayHub_$1278_$",
                            "typeString": "type(contract IRelayHub)"
                          }
                        },
                        "id": 165,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3481:20:1",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IRelayHub_$1278",
                          "typeString": "contract IRelayHub"
                        }
                      },
                      "id": 166,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "withdraw",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1121,
                      "src": "3481:29:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_address_payable_$returns$__$",
                        "typeString": "function (uint256,address payable) external"
                      }
                    },
                    "id": 169,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3481:44:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 170,
                  "nodeType": "ExpressionStatement",
                  "src": "3481:44:1"
                }
              ]
            },
            "documentation": {
              "id": 156,
              "nodeType": "StructuredDocumentation",
              "src": "3206:177:1",
              "text": "@dev Withdraws the recipient's deposits in `RelayHub`.\n     * Derived contracts should expose this in an external interface with proper access control."
            },
            "id": 172,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_withdrawDeposits",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 161,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 158,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 172,
                  "src": "3415:14:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 157,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3415:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 160,
                  "mutability": "mutable",
                  "name": "payee",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 172,
                  "src": "3431:21:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address_payable",
                    "typeString": "address payable"
                  },
                  "typeName": {
                    "id": 159,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3431:15:1",
                    "stateMutability": "payable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3414:39:1"
            },
            "returnParameters": {
              "id": 162,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3471:0:1"
            },
            "scope": 425,
            "src": "3388:144:1",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              28
            ],
            "body": {
              "id": 192,
              "nodeType": "Block",
              "src": "4237:148:1",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 182,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 179,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "4251:3:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 180,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "4251:10:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 181,
                      "name": "_relayHub",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 81,
                      "src": "4265:9:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "4251:23:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 190,
                    "nodeType": "Block",
                    "src": "4324:55:1",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 187,
                            "name": "_getRelayedCallSender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 376,
                            "src": "4345:21:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$__$returns$_t_address_payable_$",
                              "typeString": "function () pure returns (address payable)"
                            }
                          },
                          "id": 188,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4345:23:1",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "functionReturnParameters": 178,
                        "id": 189,
                        "nodeType": "Return",
                        "src": "4338:30:1"
                      }
                    ]
                  },
                  "id": 191,
                  "nodeType": "IfStatement",
                  "src": "4247:132:1",
                  "trueBody": {
                    "id": 186,
                    "nodeType": "Block",
                    "src": "4276:42:1",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 183,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "4297:3:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 184,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "4297:10:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "functionReturnParameters": 178,
                        "id": 185,
                        "nodeType": "Return",
                        "src": "4290:17:1"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 173,
              "nodeType": "StructuredDocumentation",
              "src": "3808:345:1",
              "text": "@dev Replacement for msg.sender. Returns the actual sender of a transaction: msg.sender for regular transactions,\nand the end-user for GSN relayed calls (where msg.sender is actually `RelayHub`).\n     * IMPORTANT: Contracts derived from {GSNRecipient} should never use `msg.sender`, and use {_msgSender} instead."
            },
            "id": 193,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_msgSender",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 175,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "4202:8:1"
            },
            "parameters": {
              "id": 174,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4177:2:1"
            },
            "returnParameters": {
              "id": 178,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 177,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 193,
                  "src": "4220:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address_payable",
                    "typeString": "address payable"
                  },
                  "typeName": {
                    "id": 176,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4220:15:1",
                    "stateMutability": "payable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4219:17:1"
            },
            "scope": 425,
            "src": "4158:227:1",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              39
            ],
            "body": {
              "id": 213,
              "nodeType": "Block",
              "src": "4821:144:1",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 203,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 200,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "4835:3:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 201,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "4835:10:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 202,
                      "name": "_relayHub",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 81,
                      "src": "4849:9:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "4835:23:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 211,
                    "nodeType": "Block",
                    "src": "4906:53:1",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 208,
                            "name": "_getRelayedCallData",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 420,
                            "src": "4927:19:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$__$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function () pure returns (bytes memory)"
                            }
                          },
                          "id": 209,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4927:21:1",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 199,
                        "id": 210,
                        "nodeType": "Return",
                        "src": "4920:28:1"
                      }
                    ]
                  },
                  "id": 212,
                  "nodeType": "IfStatement",
                  "src": "4831:128:1",
                  "trueBody": {
                    "id": 207,
                    "nodeType": "Block",
                    "src": "4860:40:1",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 204,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "4881:3:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 205,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "data",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "4881:8:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_calldata_ptr",
                            "typeString": "bytes calldata"
                          }
                        },
                        "functionReturnParameters": 199,
                        "id": 206,
                        "nodeType": "Return",
                        "src": "4874:15:1"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 194,
              "nodeType": "StructuredDocumentation",
              "src": "4391:351:1",
              "text": "@dev Replacement for msg.data. Returns the actual calldata of a transaction: msg.data for regular transactions,\nand a reduced version for GSN relayed calls (where msg.data contains additional information).\n     * IMPORTANT: Contracts derived from {GSNRecipient} should never use `msg.data`, and use {_msgData} instead."
            },
            "id": 214,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_msgData",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 196,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "4789:8:1"
            },
            "parameters": {
              "id": 195,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4764:2:1"
            },
            "returnParameters": {
              "id": 199,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 198,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 214,
                  "src": "4807:12:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 197,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4807:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4806:14:1"
            },
            "scope": 425,
            "src": "4747:218:1",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              1321
            ],
            "body": {
              "id": 236,
              "nodeType": "Block",
              "src": "5449:133:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 228,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 224,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "5467:3:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 225,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "5467:10:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 226,
                            "name": "getHubAddr",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 107,
                            "src": "5481:10:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                              "typeString": "function () view returns (address)"
                            }
                          },
                          "id": 227,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5481:12:1",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "5467:26:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "47534e526563697069656e743a2063616c6c6572206973206e6f742052656c6179487562",
                        "id": 229,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5495:38:1",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_c5a8631418fdde7d8bd9088d1be86b076bc07c8b187afcea36c0a6e10c88ab53",
                          "typeString": "literal_string \"GSNRecipient: caller is not RelayHub\""
                        },
                        "value": "GSNRecipient: caller is not RelayHub"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_c5a8631418fdde7d8bd9088d1be86b076bc07c8b187afcea36c0a6e10c88ab53",
                          "typeString": "literal_string \"GSNRecipient: caller is not RelayHub\""
                        }
                      ],
                      "id": 223,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "5459:7:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 230,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5459:75:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 231,
                  "nodeType": "ExpressionStatement",
                  "src": "5459:75:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 233,
                        "name": "context",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 217,
                        "src": "5567:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 232,
                      "name": "_preRelayedCall",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 245,
                      "src": "5551:15:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) returns (bytes32)"
                      }
                    },
                    "id": 234,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5551:24:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "functionReturnParameters": 222,
                  "id": 235,
                  "nodeType": "Return",
                  "src": "5544:31:1"
                }
              ]
            },
            "documentation": {
              "id": 215,
              "nodeType": "StructuredDocumentation",
              "src": "5112:244:1",
              "text": "@dev See `IRelayRecipient.preRelayedCall`.\n     * This function should not be overriden directly, use `_preRelayedCall` instead.\n     * * Requirements:\n     * - the caller must be the `RelayHub` contract."
            },
            "functionSelector": "80274db7",
            "id": 237,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "preRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 219,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "5422:8:1"
            },
            "parameters": {
              "id": 218,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 217,
                  "mutability": "mutable",
                  "name": "context",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 237,
                  "src": "5385:20:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 216,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "5385:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5384:22:1"
            },
            "returnParameters": {
              "id": 222,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 221,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 237,
                  "src": "5440:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 220,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5440:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5439:9:1"
            },
            "scope": 425,
            "src": "5361:221:1",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": null,
            "documentation": {
              "id": 238,
              "nodeType": "StructuredDocumentation",
              "src": "5588:287:1",
              "text": "@dev See `IRelayRecipient.preRelayedCall`.\n     * Called by `GSNRecipient.preRelayedCall`, which asserts the caller is the `RelayHub` contract. Derived contracts\nmust implement this function with any relayed-call preprocessing they may wish to do.\n     "
            },
            "id": 245,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "_preRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 241,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 240,
                  "mutability": "mutable",
                  "name": "context",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 245,
                  "src": "5905:20:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 239,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "5905:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5904:22:1"
            },
            "returnParameters": {
              "id": 244,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 243,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 245,
                  "src": "5953:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 242,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5953:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5952:9:1"
            },
            "scope": 425,
            "src": "5880:82:1",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              1333
            ],
            "body": {
              "id": 274,
              "nodeType": "Block",
              "src": "6345:161:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 263,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 259,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "6363:3:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 260,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "6363:10:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 261,
                            "name": "getHubAddr",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 107,
                            "src": "6377:10:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                              "typeString": "function () view returns (address)"
                            }
                          },
                          "id": 262,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6377:12:1",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "6363:26:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "47534e526563697069656e743a2063616c6c6572206973206e6f742052656c6179487562",
                        "id": 264,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6391:38:1",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_c5a8631418fdde7d8bd9088d1be86b076bc07c8b187afcea36c0a6e10c88ab53",
                          "typeString": "literal_string \"GSNRecipient: caller is not RelayHub\""
                        },
                        "value": "GSNRecipient: caller is not RelayHub"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_c5a8631418fdde7d8bd9088d1be86b076bc07c8b187afcea36c0a6e10c88ab53",
                          "typeString": "literal_string \"GSNRecipient: caller is not RelayHub\""
                        }
                      ],
                      "id": 258,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "6355:7:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 265,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6355:75:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 266,
                  "nodeType": "ExpressionStatement",
                  "src": "6355:75:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 268,
                        "name": "context",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 248,
                        "src": "6457:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 269,
                        "name": "success",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 250,
                        "src": "6466:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 270,
                        "name": "actualCharge",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 252,
                        "src": "6475:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 271,
                        "name": "preRetVal",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 254,
                        "src": "6489:9:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 267,
                      "name": "_postRelayedCall",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 287,
                      "src": "6440:16:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_bytes_memory_ptr_$_t_bool_$_t_uint256_$_t_bytes32_$returns$__$",
                        "typeString": "function (bytes memory,bool,uint256,bytes32)"
                      }
                    },
                    "id": 272,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6440:59:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 273,
                  "nodeType": "ExpressionStatement",
                  "src": "6440:59:1"
                }
              ]
            },
            "documentation": {
              "id": 246,
              "nodeType": "StructuredDocumentation",
              "src": "5968:246:1",
              "text": "@dev See `IRelayRecipient.postRelayedCall`.\n     * This function should not be overriden directly, use `_postRelayedCall` instead.\n     * * Requirements:\n     * - the caller must be the `RelayHub` contract."
            },
            "functionSelector": "e06e0e22",
            "id": 275,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "postRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 256,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "6336:8:1"
            },
            "parameters": {
              "id": 255,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 248,
                  "mutability": "mutable",
                  "name": "context",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 275,
                  "src": "6244:20:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 247,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "6244:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 250,
                  "mutability": "mutable",
                  "name": "success",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 275,
                  "src": "6266:12:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 249,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "6266:4:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 252,
                  "mutability": "mutable",
                  "name": "actualCharge",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 275,
                  "src": "6280:20:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 251,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6280:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 254,
                  "mutability": "mutable",
                  "name": "preRetVal",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 275,
                  "src": "6302:17:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 253,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6302:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6243:77:1"
            },
            "returnParameters": {
              "id": 257,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6345:0:1"
            },
            "scope": 425,
            "src": "6219:287:1",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": null,
            "documentation": {
              "id": 276,
              "nodeType": "StructuredDocumentation",
              "src": "6512:290:1",
              "text": "@dev See `IRelayRecipient.postRelayedCall`.\n     * Called by `GSNRecipient.postRelayedCall`, which asserts the caller is the `RelayHub` contract. Derived contracts\nmust implement this function with any relayed-call postprocessing they may wish to do.\n     "
            },
            "id": 287,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "_postRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 285,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 278,
                  "mutability": "mutable",
                  "name": "context",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 287,
                  "src": "6833:20:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 277,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "6833:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 280,
                  "mutability": "mutable",
                  "name": "success",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 287,
                  "src": "6855:12:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 279,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "6855:4:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 282,
                  "mutability": "mutable",
                  "name": "actualCharge",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 287,
                  "src": "6869:20:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 281,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6869:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 284,
                  "mutability": "mutable",
                  "name": "preRetVal",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 287,
                  "src": "6891:17:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 283,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "6891:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6832:77:1"
            },
            "returnParameters": {
              "id": 286,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6926:0:1"
            },
            "scope": 425,
            "src": "6807:120:1",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 299,
              "nodeType": "Block",
              "src": "7185:47:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "hexValue": "",
                        "id": 296,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "7222:2:1",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                          "typeString": "literal_string \"\""
                        },
                        "value": ""
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                          "typeString": "literal_string \"\""
                        }
                      ],
                      "id": 295,
                      "name": "_approveRelayedCall",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        300,
                        315
                      ],
                      "referencedDeclaration": 315,
                      "src": "7202:19:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_uint256_$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes memory) pure returns (uint256,bytes memory)"
                      }
                    },
                    "id": 297,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7202:23:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes_memory_ptr_$",
                      "typeString": "tuple(uint256,bytes memory)"
                    }
                  },
                  "functionReturnParameters": 294,
                  "id": 298,
                  "nodeType": "Return",
                  "src": "7195:30:1"
                }
              ]
            },
            "documentation": {
              "id": 288,
              "nodeType": "StructuredDocumentation",
              "src": "6933:170:1",
              "text": "@dev Return this in acceptRelayedCall to proceed with the execution of a relayed call. Note that this contract\nwill be charged a fee by RelayHub"
            },
            "id": 300,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_approveRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 289,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7136:2:1"
            },
            "returnParameters": {
              "id": 294,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 291,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 300,
                  "src": "7162:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 290,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7162:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 293,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 300,
                  "src": "7171:12:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 292,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "7171:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7161:23:1"
            },
            "scope": 425,
            "src": "7108:124:1",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 314,
              "nodeType": "Block",
              "src": "7491:57:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "id": 310,
                        "name": "_RELAYED_CALL_ACCEPTED",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 84,
                        "src": "7509:22:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 311,
                        "name": "context",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 303,
                        "src": "7533:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "id": 312,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "7508:33:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes_memory_ptr_$",
                      "typeString": "tuple(uint256,bytes memory)"
                    }
                  },
                  "functionReturnParameters": 309,
                  "id": 313,
                  "nodeType": "Return",
                  "src": "7501:40:1"
                }
              ]
            },
            "documentation": {
              "id": 301,
              "nodeType": "StructuredDocumentation",
              "src": "7238:151:1",
              "text": "@dev See `GSNRecipient._approveRelayedCall`.\n     * This overload forwards `context` to _preRelayedCall and _postRelayedCall."
            },
            "id": 315,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_approveRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 304,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 303,
                  "mutability": "mutable",
                  "name": "context",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 315,
                  "src": "7423:20:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 302,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "7423:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7422:22:1"
            },
            "returnParameters": {
              "id": 309,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 306,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 315,
                  "src": "7468:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 305,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7468:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 308,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 315,
                  "src": "7477:12:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 307,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "7477:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7467:23:1"
            },
            "scope": 425,
            "src": "7394:154:1",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 331,
              "nodeType": "Block",
              "src": "7772:64:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 327,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 325,
                          "name": "_RELAYED_CALL_REJECTED",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 87,
                          "src": "7790:22:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "+",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 326,
                          "name": "errorCode",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 318,
                          "src": "7815:9:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "7790:34:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "",
                        "id": 328,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "7826:2:1",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                          "typeString": "literal_string \"\""
                        },
                        "value": ""
                      }
                    ],
                    "id": 329,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "7789:40:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470_$",
                      "typeString": "tuple(uint256,literal_string \"\")"
                    }
                  },
                  "functionReturnParameters": 324,
                  "id": 330,
                  "nodeType": "Return",
                  "src": "7782:47:1"
                }
              ]
            },
            "documentation": {
              "id": 316,
              "nodeType": "StructuredDocumentation",
              "src": "7554:120:1",
              "text": "@dev Return this in acceptRelayedCall to impede execution of a relayed call. No fees will be charged."
            },
            "id": 332,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_rejectRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 319,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 318,
                  "mutability": "mutable",
                  "name": "errorCode",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 332,
                  "src": "7707:17:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 317,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7707:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7706:19:1"
            },
            "returnParameters": {
              "id": 324,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 321,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 332,
                  "src": "7749:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 320,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7749:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 323,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 332,
                  "src": "7758:12:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 322,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "7758:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7748:23:1"
            },
            "scope": 425,
            "src": "7679:157:1",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 355,
              "nodeType": "Block",
              "src": "8101:233:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 353,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "components": [
                        {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 350,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 345,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 343,
                              "name": "gas",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 334,
                              "src": "8285:3:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "*",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 344,
                              "name": "gasPrice",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 336,
                              "src": "8291:8:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "8285:14:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "*",
                          "rightExpression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 348,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "313030",
                                  "id": 346,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8303:3:1",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_100_by_1",
                                    "typeString": "int_const 100"
                                  },
                                  "value": "100"
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "+",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 347,
                                  "name": "serviceFee",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 338,
                                  "src": "8309:10:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "8303:16:1",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 349,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "8302:18:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "8285:35:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 351,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "8284:37:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "/",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "313030",
                      "id": 352,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "8324:3:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_100_by_1",
                        "typeString": "int_const 100"
                      },
                      "value": "100"
                    },
                    "src": "8284:43:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 342,
                  "id": 354,
                  "nodeType": "Return",
                  "src": "8277:50:1"
                }
              ]
            },
            "documentation": null,
            "id": 356,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_computeCharge",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 339,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 334,
                  "mutability": "mutable",
                  "name": "gas",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 356,
                  "src": "8018:11:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 333,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8018:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 336,
                  "mutability": "mutable",
                  "name": "gasPrice",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 356,
                  "src": "8031:16:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 335,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8031:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 338,
                  "mutability": "mutable",
                  "name": "serviceFee",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 356,
                  "src": "8049:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 337,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8049:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8017:51:1"
            },
            "returnParameters": {
              "id": 342,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 341,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 356,
                  "src": "8092:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 340,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8092:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8091:9:1"
            },
            "scope": 425,
            "src": "7994:340:1",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 375,
              "nodeType": "Block",
              "src": "8419:1171:1",
              "statements": [
                {
                  "assignments": [
                    362
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 362,
                      "mutability": "mutable",
                      "name": "array",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 375,
                      "src": "9202:18:1",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 361,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "9202:5:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 365,
                  "initialValue": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "id": 363,
                      "name": "msg",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": -15,
                      "src": "9223:3:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_magic_message",
                        "typeString": "msg"
                      }
                    },
                    "id": 364,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "data",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "9223:8:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_calldata_ptr",
                      "typeString": "bytes calldata"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "9202:29:1"
                },
                {
                  "assignments": [
                    367
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 367,
                      "mutability": "mutable",
                      "name": "index",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 375,
                      "src": "9241:13:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 366,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "9241:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 371,
                  "initialValue": {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 368,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "9257:3:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 369,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "data",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "9257:8:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_calldata_ptr",
                        "typeString": "bytes calldata"
                      }
                    },
                    "id": 370,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "length",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "9257:15:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "9241:31:1"
                },
                {
                  "AST": {
                    "nodeType": "YulBlock",
                    "src": "9348:213:1",
                    "statements": [
                      {
                        "nodeType": "YulAssignment",
                        "src": "9468:83:1",
                        "value": {
                          "arguments": [
                            {
                              "arguments": [
                                {
                                  "arguments": [
                                    {
                                      "name": "array",
                                      "nodeType": "YulIdentifier",
                                      "src": "9492:5:1"
                                    },
                                    {
                                      "name": "index",
                                      "nodeType": "YulIdentifier",
                                      "src": "9499:5:1"
                                    }
                                  ],
                                  "functionName": {
                                    "name": "add",
                                    "nodeType": "YulIdentifier",
                                    "src": "9488:3:1"
                                  },
                                  "nodeType": "YulFunctionCall",
                                  "src": "9488:17:1"
                                }
                              ],
                              "functionName": {
                                "name": "mload",
                                "nodeType": "YulIdentifier",
                                "src": "9482:5:1"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "9482:24:1"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "9508:42:1",
                              "type": "",
                              "value": "0xffffffffffffffffffffffffffffffffffffffff"
                            }
                          ],
                          "functionName": {
                            "name": "and",
                            "nodeType": "YulIdentifier",
                            "src": "9478:3:1"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "9478:73:1"
                        },
                        "variableNames": [
                          {
                            "name": "result",
                            "nodeType": "YulIdentifier",
                            "src": "9468:6:1"
                          }
                        ]
                      }
                    ]
                  },
                  "evmVersion": "petersburg",
                  "externalReferences": [
                    {
                      "declaration": 362,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "9492:5:1",
                      "valueSize": 1
                    },
                    {
                      "declaration": 367,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "9499:5:1",
                      "valueSize": 1
                    },
                    {
                      "declaration": 359,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "9468:6:1",
                      "valueSize": 1
                    }
                  ],
                  "id": 372,
                  "nodeType": "InlineAssembly",
                  "src": "9339:222:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 373,
                    "name": "result",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 359,
                    "src": "9577:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  "functionReturnParameters": 360,
                  "id": 374,
                  "nodeType": "Return",
                  "src": "9570:13:1"
                }
              ]
            },
            "documentation": null,
            "id": 376,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_getRelayedCallSender",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 357,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8370:2:1"
            },
            "returnParameters": {
              "id": 360,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 359,
                  "mutability": "mutable",
                  "name": "result",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 376,
                  "src": "8395:22:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address_payable",
                    "typeString": "address payable"
                  },
                  "typeName": {
                    "id": 358,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8395:15:1",
                    "stateMutability": "payable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8394:24:1"
            },
            "scope": 425,
            "src": "8340:1250:1",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 419,
              "nodeType": "Block",
              "src": "9663:465:1",
              "statements": [
                {
                  "assignments": [
                    382
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 382,
                      "mutability": "mutable",
                      "name": "actualDataLength",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 419,
                      "src": "9874:24:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 381,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "9874:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 388,
                  "initialValue": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 387,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 383,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "9901:3:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 384,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "data",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "9901:8:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      },
                      "id": 385,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "9901:15:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "3230",
                      "id": 386,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "9919:2:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_20_by_1",
                        "typeString": "int_const 20"
                      },
                      "value": "20"
                    },
                    "src": "9901:20:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "9874:47:1"
                },
                {
                  "assignments": [
                    390
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 390,
                      "mutability": "mutable",
                      "name": "actualData",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 419,
                      "src": "9931:23:1",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 389,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "9931:5:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 395,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 393,
                        "name": "actualDataLength",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 382,
                        "src": "9967:16:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 392,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "NewExpression",
                      "src": "9957:9:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function (uint256) pure returns (bytes memory)"
                      },
                      "typeName": {
                        "id": 391,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "9961:5:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      }
                    },
                    "id": 394,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9957:27:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "9931:53:1"
                },
                {
                  "body": {
                    "id": 415,
                    "nodeType": "Block",
                    "src": "10042:52:1",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 413,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 406,
                              "name": "actualData",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 390,
                              "src": "10056:10:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            "id": 408,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 407,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 397,
                              "src": "10067:1:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "10056:13:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes1",
                              "typeString": "bytes1"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 409,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "10072:3:1",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 410,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "data",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "10072:8:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_calldata_ptr",
                                "typeString": "bytes calldata"
                              }
                            },
                            "id": 412,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 411,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 397,
                              "src": "10081:1:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "10072:11:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes1",
                              "typeString": "bytes1"
                            }
                          },
                          "src": "10056:27:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes1",
                            "typeString": "bytes1"
                          }
                        },
                        "id": 414,
                        "nodeType": "ExpressionStatement",
                        "src": "10056:27:1"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 402,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 400,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 397,
                      "src": "10015:1:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 401,
                      "name": "actualDataLength",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 382,
                      "src": "10019:16:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "10015:20:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 416,
                  "initializationExpression": {
                    "assignments": [
                      397
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 397,
                        "mutability": "mutable",
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 416,
                        "src": "10000:9:1",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 396,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10000:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 399,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 398,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "10012:1:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "10000:13:1"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 404,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": true,
                      "src": "10037:3:1",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 403,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 397,
                        "src": "10039:1:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 405,
                    "nodeType": "ExpressionStatement",
                    "src": "10037:3:1"
                  },
                  "nodeType": "ForStatement",
                  "src": "9995:99:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 417,
                    "name": "actualData",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 390,
                    "src": "10111:10:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "functionReturnParameters": 380,
                  "id": 418,
                  "nodeType": "Return",
                  "src": "10104:17:1"
                }
              ]
            },
            "documentation": null,
            "id": 420,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_getRelayedCallData",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 377,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9624:2:1"
            },
            "returnParameters": {
              "id": 380,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 379,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 420,
                  "src": "9649:12:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 378,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "9649:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9648:14:1"
            },
            "scope": 425,
            "src": "9596:532:1",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 424,
            "mutability": "mutable",
            "name": "__gap",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 425,
            "src": "10134:25:1",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_uint256_$49_storage",
              "typeString": "uint256[49]"
            },
            "typeName": {
              "baseType": {
                "id": 421,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "10134:7:1",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "id": 423,
              "length": {
                "argumentTypes": null,
                "hexValue": "3439",
                "id": 422,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "10142:2:1",
                "subdenomination": null,
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_49_by_1",
                  "typeString": "int_const 49"
                },
                "value": "49"
              },
              "nodeType": "ArrayTypeName",
              "src": "10134:11:1",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_uint256_$49_storage_ptr",
                "typeString": "uint256[49]"
              }
            },
            "value": null,
            "visibility": "private"
          }
        ],
        "scope": 426,
        "src": "700:9462:1"
      }
    ],
    "src": "0:10163:1"
  },
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "compiler": {
    "name": "solc",
    "version": "0.6.7+commit.b8d736ae.Emscripten.clang",
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "evmVersion": "petersburg"
  }
}
