{
  "fileName": "GSNRecipientSignature.sol",
  "contractName": "GSNRecipientSignature",
  "source": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.7.0;\n\nimport \"./GSNRecipient.sol\";\nimport \"../cryptography/ECDSA.sol\";\n\n/**\n * @dev A xref:ROOT:gsn-strategies.adoc#gsn-strategies[GSN strategy] that allows relayed transactions through when they are\n * accompanied by the signature of a trusted signer. The intent is for this signature to be generated by a server that\n * performs validations off-chain. Note that nothing is charged to the user in this scheme. Thus, the server should make\n * sure to account for this in their economic and threat model.\n */\ncontract GSNRecipientSignature is GSNRecipient {\n    using ECDSA for bytes32;\n\n    address private _trustedSigner;\n\n    enum GSNRecipientSignatureErrorCodes {\n        INVALID_SIGNER\n    }\n\n    /**\n     * @dev Sets the trusted signer that is going to be producing signatures to approve relayed calls.\n     */\n    constructor(address trustedSigner) {\n        require(trustedSigner != address(0), \"GSNRecipientSignature: trusted signer is the zero address\");\n        _trustedSigner = trustedSigner;\n    }\n\n    /**\n     * @dev Ensures that only transactions with a trusted signature can be relayed through the GSN.\n     */\n    function acceptRelayedCall(\n        address relay,\n        address from,\n        bytes memory encodedFunction,\n        uint256 transactionFee,\n        uint256 gasPrice,\n        uint256 gasLimit,\n        uint256 nonce,\n        bytes memory approvalData,\n        uint256\n    )\n        public\n        view\n        virtual\n        override\n        returns (uint256, bytes memory)\n    {\n        bytes memory blob = abi.encodePacked(\n            relay,\n            from,\n            encodedFunction,\n            transactionFee,\n            gasPrice,\n            gasLimit,\n            nonce, // Prevents replays on RelayHub\n            getHubAddr(), // Prevents replays in multiple RelayHubs\n            address(this) // Prevents replays in multiple recipients\n        );\n        if (keccak256(blob).toEthSignedMessageHash().recover(approvalData) == _trustedSigner) {\n            return _approveRelayedCall();\n        } else {\n            return _rejectRelayedCall(uint256(GSNRecipientSignatureErrorCodes.INVALID_SIGNER));\n        }\n    }\n\n    function _preRelayedCall(bytes memory) internal virtual override returns (bytes32) { }\n\n    function _postRelayedCall(bytes memory, bool, uint256, bytes32) internal virtual override { }\n}\n",
  "sourcePath": "contracts/GSN/GSNRecipientSignature.sol",
  "sourceMap": "560:1847:3:-:0;;;885:42:1;857:70;;;;;;;;;;;;;;;;;;;;872:189:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;950:1;925:27;;:13;:27;;;;917:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1041:13;1024:14;;:30;;;;;;;;;;;;;;;;;;872:189;560:1847;;;;;;",
  "deployedSourceMap": "560:1847:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1451:94:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5087:221;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1183:1031:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2699:227:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5945:287;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1451:94;1503:7;1529:9;;;;;;;;;;;1522:16;;1451:94;:::o;5087:221::-;5166:7;5207:12;:10;:12::i;:::-;5193:26;;:10;:26;;;5185:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5277:24;5293:7;5277:15;:24::i;:::-;5270:31;;5087:221;;;:::o;1183:1031:3:-;1536:7;1545:12;1573:17;1623:5;1642:4;1660:15;1689:14;1717:8;1739;1761:5;1812:12;:10;:12::i;:::-;1888:4;1593:353;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1573:373;;2026:14;;;;;;;;;;;1960:80;;:62;2009:12;1960:40;1970:4;1960:15;;;;;;:38;:40::i;:::-;:48;;:62;;;;:::i;:::-;:80;;;1956:252;;;2063:21;:19;:21::i;:::-;2056:28;;;;;;;1956:252;2122:75;2149:46;2141:55;;;;;;;;2122:18;:75::i;:::-;2115:82;;;;;1183:1031;;;;;;;;;;;;;:::o;2699:227:1:-;2747:13;2905:14;;;;;;;;;;;;;;;;;;;2699:227;:::o;5945:287::-;6103:12;:10;:12::i;:::-;6089:26;;:10;:26;;;6081:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6166:59;6183:7;6192;6201:12;6215:9;6166:16;:59::i;:::-;5945:287;;;;:::o;2220:86:3:-;2294:7;2220:86;;;:::o;3396:265:8:-;3465:7;3648:4;3595:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3585:69;;;;;;3578:76;;3396:265;;;:::o;1064:2068::-;1142:7;1223:2;1203:9;:16;:22;1199:94;;1241:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1199:94;1359:9;1378;1397:7;1643:4;1632:9;1628:20;1622:27;1617:32;;1688:4;1677:9;1673:20;1667:27;1662:32;;1741:4;1730:9;1726:20;1720:27;1717:1;1712:36;1707:41;;2659:66;2654:1;2646:10;;:79;2642:154;;;2741:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2642:154;2815:2;2810:1;:7;;;;:18;;;;;2826:2;2821:1;:7;;;;2810:18;2806:93;;;2844:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2806:93;2993:14;3010:24;3020:4;3026:1;3029;3032;3010:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2993:41;;3070:1;3052:20;;:6;:20;;;;3044:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3119:6;3112:13;;;;;;1064:2068;;;;:::o;6834:124:1:-;6888:7;6897:12;6928:23;;;;;;;;;;;;;:19;:23::i;:::-;6921:30;;;;6834:124;;:::o;7405:157::-;7475:7;7484:12;7541:9;1041:2;7516:34;7508:47;;;;;;;;;;;;;;;;7405:157;;;:::o;2312:93:3:-;;;;;:::o;7120:154:1:-;7194:7;7203:12;984:1;7259:7;7227:40;;;;7120:154;;;:::o",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "trustedSigner",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "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": "",
          "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/GSNRecipientSignature.sol",
    "exportedSymbols": {
      "GSNRecipientSignature": [
        850
      ]
    },
    "id": 851,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 723,
        "literals": [
          "solidity",
          "^",
          "0.7",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "33:23:3"
      },
      {
        "absolutePath": "contracts/GSN/GSNRecipient.sol",
        "file": "./GSNRecipient.sol",
        "id": 724,
        "nodeType": "ImportDirective",
        "scope": 851,
        "sourceUnit": 376,
        "src": "58:28:3",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/cryptography/ECDSA.sol",
        "file": "../cryptography/ECDSA.sol",
        "id": 725,
        "nodeType": "ImportDirective",
        "scope": 851,
        "sourceUnit": 1675,
        "src": "87:35:3",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 727,
              "name": "GSNRecipient",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 375,
              "src": "594:12:3",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_GSNRecipient_$375",
                "typeString": "contract GSNRecipient"
              }
            },
            "id": 728,
            "nodeType": "InheritanceSpecifier",
            "src": "594:12:3"
          }
        ],
        "contractDependencies": [
          22,
          375,
          1184
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 726,
          "nodeType": "StructuredDocumentation",
          "src": "124:435:3",
          "text": " @dev A xref:ROOT:gsn-strategies.adoc#gsn-strategies[GSN strategy] that allows relayed transactions through when they are\n accompanied by the signature of a trusted signer. The intent is for this signature to be generated by a server that\n performs validations off-chain. Note that nothing is charged to the user in this scheme. Thus, the server should make\n sure to account for this in their economic and threat model."
        },
        "fullyImplemented": true,
        "id": 850,
        "linearizedBaseContracts": [
          850,
          375,
          22,
          1184
        ],
        "name": "GSNRecipientSignature",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 731,
            "libraryName": {
              "contractScope": null,
              "id": 729,
              "name": "ECDSA",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1674,
              "src": "619:5:3",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ECDSA_$1674",
                "typeString": "library ECDSA"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "613:24:3",
            "typeName": {
              "id": 730,
              "name": "bytes32",
              "nodeType": "ElementaryTypeName",
              "src": "629:7:3",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes32",
                "typeString": "bytes32"
              }
            }
          },
          {
            "constant": false,
            "id": 733,
            "mutability": "mutable",
            "name": "_trustedSigner",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 850,
            "src": "643:30:3",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 732,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "643:7:3",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "canonicalName": "GSNRecipientSignature.GSNRecipientSignatureErrorCodes",
            "id": 735,
            "members": [
              {
                "id": 734,
                "name": "INVALID_SIGNER",
                "nodeType": "EnumValue",
                "src": "727:14:3"
              }
            ],
            "name": "GSNRecipientSignatureErrorCodes",
            "nodeType": "EnumDefinition",
            "src": "680:67:3"
          },
          {
            "body": {
              "id": 755,
              "nodeType": "Block",
              "src": "907:154:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 747,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 742,
                          "name": "trustedSigner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 738,
                          "src": "925:13:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 745,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "950:1:3",
                              "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": 744,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "942:7:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 743,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "942:7:3",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 746,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "942:10:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "925:27:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "47534e526563697069656e745369676e61747572653a2074727573746564207369676e657220697320746865207a65726f2061646472657373",
                        "id": 748,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "954:59:3",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_b449863bc8ef919e776559b9a0800b6601550a12ec4edf55e3d3f41dc6eeaa03",
                          "typeString": "literal_string \"GSNRecipientSignature: trusted signer is the zero address\""
                        },
                        "value": "GSNRecipientSignature: trusted signer is the zero address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_b449863bc8ef919e776559b9a0800b6601550a12ec4edf55e3d3f41dc6eeaa03",
                          "typeString": "literal_string \"GSNRecipientSignature: trusted signer is the zero address\""
                        }
                      ],
                      "id": 741,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "917:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 749,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "917:97:3",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 750,
                  "nodeType": "ExpressionStatement",
                  "src": "917:97:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 753,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 751,
                      "name": "_trustedSigner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 733,
                      "src": "1024:14:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 752,
                      "name": "trustedSigner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 738,
                      "src": "1041:13:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1024:30:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 754,
                  "nodeType": "ExpressionStatement",
                  "src": "1024:30:3"
                }
              ]
            },
            "documentation": {
              "id": 736,
              "nodeType": "StructuredDocumentation",
              "src": "753:114:3",
              "text": " @dev Sets the trusted signer that is going to be producing signatures to approve relayed calls."
            },
            "id": 756,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 739,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 738,
                  "mutability": "mutable",
                  "name": "trustedSigner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 756,
                  "src": "884:21:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 737,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "884:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "883:23:3"
            },
            "returnParameters": {
              "id": 740,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "907:0:3"
            },
            "scope": 850,
            "src": "872:189:3",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              1163
            ],
            "body": {
              "id": 826,
              "nodeType": "Block",
              "src": "1563:651:3",
              "statements": [
                {
                  "assignments": [
                    784
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 784,
                      "mutability": "mutable",
                      "name": "blob",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 826,
                      "src": "1573:17:3",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 783,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "1573:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 801,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 787,
                        "name": "relay",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 759,
                        "src": "1623:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 788,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 761,
                        "src": "1642:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 789,
                        "name": "encodedFunction",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 763,
                        "src": "1660:15:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 790,
                        "name": "transactionFee",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 765,
                        "src": "1689:14:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 791,
                        "name": "gasPrice",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 767,
                        "src": "1717:8:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 792,
                        "name": "gasLimit",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 769,
                        "src": "1739:8:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 793,
                        "name": "nonce",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 771,
                        "src": "1761:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 794,
                          "name": "getHubAddr",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 61,
                          "src": "1812:10:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                            "typeString": "function () view returns (address)"
                          }
                        },
                        "id": 795,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1812:12:3",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 798,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "1888:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_GSNRecipientSignature_$850",
                              "typeString": "contract GSNRecipientSignature"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_GSNRecipientSignature_$850",
                              "typeString": "contract GSNRecipientSignature"
                            }
                          ],
                          "id": 797,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1880:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 796,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "1880:7:3",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 799,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1880:13:3",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 785,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -1,
                        "src": "1593:3:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 786,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodePacked",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "1593:16:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function () pure returns (bytes memory)"
                      }
                    },
                    "id": 800,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1593:353:3",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1573:373:3"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 811,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 808,
                          "name": "approvalData",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 773,
                          "src": "2009:12:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 803,
                                  "name": "blob",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 784,
                                  "src": "1970:4:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                ],
                                "id": 802,
                                "name": "keccak256",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -8,
                                "src": "1960:9:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                  "typeString": "function (bytes memory) pure returns (bytes32)"
                                }
                              },
                              "id": 804,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1960:15:3",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "id": 805,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "toEthSignedMessageHash",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1673,
                            "src": "1960:38:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bytes32_$returns$_t_bytes32_$bound_to$_t_bytes32_$",
                              "typeString": "function (bytes32) pure returns (bytes32)"
                            }
                          },
                          "id": 806,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1960:40:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 807,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "recover",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1656,
                        "src": "1960:48:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$bound_to$_t_bytes32_$",
                          "typeString": "function (bytes32,bytes memory) pure returns (address)"
                        }
                      },
                      "id": 809,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1960:62:3",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 810,
                      "name": "_trustedSigner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 733,
                      "src": "2026:14:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1960:80:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 824,
                    "nodeType": "Block",
                    "src": "2101:107:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 819,
                                    "name": "GSNRecipientSignatureErrorCodes",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 735,
                                    "src": "2149:31:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_enum$_GSNRecipientSignatureErrorCodes_$735_$",
                                      "typeString": "type(enum GSNRecipientSignature.GSNRecipientSignatureErrorCodes)"
                                    }
                                  },
                                  "id": 820,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "memberName": "INVALID_SIGNER",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2149:46:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_enum$_GSNRecipientSignatureErrorCodes_$735",
                                    "typeString": "enum GSNRecipientSignature.GSNRecipientSignatureErrorCodes"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_enum$_GSNRecipientSignatureErrorCodes_$735",
                                    "typeString": "enum GSNRecipientSignature.GSNRecipientSignatureErrorCodes"
                                  }
                                ],
                                "id": 818,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2141:7:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint256_$",
                                  "typeString": "type(uint256)"
                                },
                                "typeName": {
                                  "id": 817,
                                  "name": "uint256",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2141:7:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 821,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2141:55:3",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 816,
                            "name": "_rejectRelayedCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 286,
                            "src": "2122:18:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$_t_bytes_memory_ptr_$",
                              "typeString": "function (uint256) pure returns (uint256,bytes memory)"
                            }
                          },
                          "id": 822,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2122:75:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(uint256,bytes memory)"
                          }
                        },
                        "functionReturnParameters": 782,
                        "id": 823,
                        "nodeType": "Return",
                        "src": "2115:82:3"
                      }
                    ]
                  },
                  "id": 825,
                  "nodeType": "IfStatement",
                  "src": "1956:252:3",
                  "trueBody": {
                    "id": 815,
                    "nodeType": "Block",
                    "src": "2042:53:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 812,
                            "name": "_approveRelayedCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              254,
                              269
                            ],
                            "referencedDeclaration": 254,
                            "src": "2063:19:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$__$returns$_t_uint256_$_t_bytes_memory_ptr_$",
                              "typeString": "function () pure returns (uint256,bytes memory)"
                            }
                          },
                          "id": 813,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2063:21:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(uint256,bytes memory)"
                          }
                        },
                        "functionReturnParameters": 782,
                        "id": 814,
                        "nodeType": "Return",
                        "src": "2056:28:3"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 757,
              "nodeType": "StructuredDocumentation",
              "src": "1067:111:3",
              "text": " @dev Ensures that only transactions with a trusted signature can be relayed through the GSN."
            },
            "functionSelector": "83947ea0",
            "id": 827,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "acceptRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 777,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1510:8:3"
            },
            "parameters": {
              "id": 776,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 759,
                  "mutability": "mutable",
                  "name": "relay",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 827,
                  "src": "1219:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 758,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1219:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 761,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 827,
                  "src": "1242:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 760,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1242:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 763,
                  "mutability": "mutable",
                  "name": "encodedFunction",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 827,
                  "src": "1264:28:3",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 762,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1264:5:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 765,
                  "mutability": "mutable",
                  "name": "transactionFee",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 827,
                  "src": "1302:22:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 764,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1302:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 767,
                  "mutability": "mutable",
                  "name": "gasPrice",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 827,
                  "src": "1334:16:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 766,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1334:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 769,
                  "mutability": "mutable",
                  "name": "gasLimit",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 827,
                  "src": "1360:16:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 768,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1360:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 771,
                  "mutability": "mutable",
                  "name": "nonce",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 827,
                  "src": "1386:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 770,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1386:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 773,
                  "mutability": "mutable",
                  "name": "approvalData",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 827,
                  "src": "1409:25:3",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 772,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1409:5:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 775,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 827,
                  "src": "1444:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 774,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1444:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1209:248:3"
            },
            "returnParameters": {
              "id": 782,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 779,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 827,
                  "src": "1536:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 778,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1536:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 781,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 827,
                  "src": "1545:12:3",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 780,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1545:5:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1535:23:3"
            },
            "scope": 850,
            "src": "1183:1031:3",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              199
            ],
            "body": {
              "id": 835,
              "nodeType": "Block",
              "src": "2303:3:3",
              "statements": []
            },
            "documentation": null,
            "id": 836,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_preRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 831,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2276:8:3"
            },
            "parameters": {
              "id": 830,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 829,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 836,
                  "src": "2245:12:3",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 828,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2245:5:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2244:14:3"
            },
            "returnParameters": {
              "id": 834,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 833,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 836,
                  "src": "2294:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 832,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2294:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2293:9:3"
            },
            "scope": 850,
            "src": "2220:86:3",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              241
            ],
            "body": {
              "id": 848,
              "nodeType": "Block",
              "src": "2402:3:3",
              "statements": []
            },
            "documentation": null,
            "id": 849,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_postRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 846,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2393:8:3"
            },
            "parameters": {
              "id": 845,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 838,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 849,
                  "src": "2338:12:3",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 837,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2338:5:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 840,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 849,
                  "src": "2352:4:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 839,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2352:4:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 842,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 849,
                  "src": "2358:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 841,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2358:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 844,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 849,
                  "src": "2367:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 843,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2367:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2337:38:3"
            },
            "returnParameters": {
              "id": 847,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2402:0:3"
            },
            "scope": 850,
            "src": "2312:93:3",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          }
        ],
        "scope": 851,
        "src": "560:1847:3"
      }
    ],
    "src": "33:2375:3"
  },
  "bytecode": "0x608060405273d216153c06e857cd7f72665e0af1d7d82172f4946000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561006457600080fd5b50604051610e08380380610e088339818101604052602081101561008757600080fd5b8101908080519060200190929190505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561011e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180610dcf6039913960400191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610c608061016f6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806374e861d61461005c57806380274db71461009057806383947ea01461015f578063ad61ccd5146103a4578063e06e0e2214610427575b600080fd5b610064610502565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610149600480360360208110156100a657600080fd5b81019080803590602001906401000000008111156100c357600080fd5b8201836020820111156100d557600080fd5b803590602001918460018302840111640100000000831117156100f757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061052b565b6040518082815260200191505060405180910390f35b610322600480360361012081101561017657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101d357600080fd5b8201836020820111156101e557600080fd5b8035906020019184600183028401116401000000008311171561020757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561029257600080fd5b8201836020820111156102a457600080fd5b803590602001918460018302840111640100000000831117156102c657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291905050506105c8565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561036857808201518184015260208101905061034d565b50505050905090810190601f1680156103955780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6103ac610796565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ec5780820151818401526020810190506103d1565b50505050905090810190601f1680156104195780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105006004803603608081101561043d57600080fd5b810190808035906020019064010000000081111561045a57600080fd5b82018360208201111561046c57600080fd5b8035906020019184600183028401116401000000008311171561048e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080351515906020019092919080359060200190929190803590602001909291905050506107d3565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610535610502565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105b8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610c076024913960400191505060405180910390fd5b6105c182610870565b9050919050565b60006060808b8b8b8b8b8b8b6105dc610502565b30604051602001808a73ffffffffffffffffffffffffffffffffffffffff1660601b81526014018973ffffffffffffffffffffffffffffffffffffffff1660601b815260140188805190602001908083835b60208310610651578051825260208201915060208101905060208303925061062e565b6001836020036101000a0380198251168184511680821785525050505050509050018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1660601b81526014018273ffffffffffffffffffffffffffffffffffffffff1660601b815260140199505050505050505050506040516020818303038152906040529050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610740866107328480519060200120610877565b6108cf90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16141561076e57610764610b67565b9250925050610788565b61078260008081111561077d57fe5b610b8b565b92509250505b995099975050505050505050565b60606040518060400160405280600581526020017f312e302e30000000000000000000000000000000000000000000000000000000815250905090565b6107db610502565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461085e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610c076024913960400191505060405180910390fd5b61086a84848484610bac565b50505050565b6000919050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209050919050565b60006041825114610948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45434453413a20696e76616c6964207369676e6174757265206c656e6774680081525060200191505060405180910390fd5b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156109e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180610bc36022913960400191505060405180910390fd5b601b8160ff16141580156109f95750601c8160ff1614155b15610a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180610be56022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610aab573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f45434453413a20696e76616c6964207369676e6174757265000000000000000081525060200191505060405180910390fd5b8094505050505092915050565b60006060610b8360405180602001604052806000815250610bb2565b915091509091565b6000606082600b016040518060200160405280600081525091509150915091565b50505050565b600060606000839150915091509156fe45434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c756547534e526563697069656e743a2063616c6c6572206973206e6f742052656c6179487562a264697066735822122025989829b001f8f95ec5c6c8b0affa266a6109b091cbdb37c591d9fdbf92e23664736f6c6343000700003347534e526563697069656e745369676e61747572653a2074727573746564207369676e657220697320746865207a65726f2061646472657373",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c806374e861d61461005c57806380274db71461009057806383947ea01461015f578063ad61ccd5146103a4578063e06e0e2214610427575b600080fd5b610064610502565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610149600480360360208110156100a657600080fd5b81019080803590602001906401000000008111156100c357600080fd5b8201836020820111156100d557600080fd5b803590602001918460018302840111640100000000831117156100f757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061052b565b6040518082815260200191505060405180910390f35b610322600480360361012081101561017657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101d357600080fd5b8201836020820111156101e557600080fd5b8035906020019184600183028401116401000000008311171561020757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561029257600080fd5b8201836020820111156102a457600080fd5b803590602001918460018302840111640100000000831117156102c657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291905050506105c8565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561036857808201518184015260208101905061034d565b50505050905090810190601f1680156103955780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6103ac610796565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ec5780820151818401526020810190506103d1565b50505050905090810190601f1680156104195780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105006004803603608081101561043d57600080fd5b810190808035906020019064010000000081111561045a57600080fd5b82018360208201111561046c57600080fd5b8035906020019184600183028401116401000000008311171561048e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080351515906020019092919080359060200190929190803590602001909291905050506107d3565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610535610502565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105b8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610c076024913960400191505060405180910390fd5b6105c182610870565b9050919050565b60006060808b8b8b8b8b8b8b6105dc610502565b30604051602001808a73ffffffffffffffffffffffffffffffffffffffff1660601b81526014018973ffffffffffffffffffffffffffffffffffffffff1660601b815260140188805190602001908083835b60208310610651578051825260208201915060208101905060208303925061062e565b6001836020036101000a0380198251168184511680821785525050505050509050018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1660601b81526014018273ffffffffffffffffffffffffffffffffffffffff1660601b815260140199505050505050505050506040516020818303038152906040529050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610740866107328480519060200120610877565b6108cf90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16141561076e57610764610b67565b9250925050610788565b61078260008081111561077d57fe5b610b8b565b92509250505b995099975050505050505050565b60606040518060400160405280600581526020017f312e302e30000000000000000000000000000000000000000000000000000000815250905090565b6107db610502565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461085e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610c076024913960400191505060405180910390fd5b61086a84848484610bac565b50505050565b6000919050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209050919050565b60006041825114610948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45434453413a20696e76616c6964207369676e6174757265206c656e6774680081525060200191505060405180910390fd5b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156109e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180610bc36022913960400191505060405180910390fd5b601b8160ff16141580156109f95750601c8160ff1614155b15610a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180610be56022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610aab573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f45434453413a20696e76616c6964207369676e6174757265000000000000000081525060200191505060405180910390fd5b8094505050505092915050565b60006060610b8360405180602001604052806000815250610bb2565b915091509091565b6000606082600b016040518060200160405280600081525091509150915091565b50505050565b600060606000839150915091509156fe45434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c756547534e526563697069656e743a2063616c6c6572206973206e6f742052656c6179487562a264697066735822122025989829b001f8f95ec5c6c8b0affa266a6109b091cbdb37c591d9fdbf92e23664736f6c63430007000033",
  "compiler": {
    "name": "solc",
    "version": "0.7.0+commit.9e61f92b.Emscripten.clang",
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "evmVersion": "petersburg"
  }
}
