{
  "fileName": "GSNRecipientSignature.sol",
  "contractName": "GSNRecipientSignatureUpgradeSafe",
  "source": "pragma solidity ^0.6.0;\n\nimport \"./GSNRecipient.sol\";\nimport \"../cryptography/ECDSA.sol\";\nimport \"../Initializable.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 GSNRecipientSignatureUpgradeSafe is Initializable, GSNRecipientUpgradeSafe {\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\n    function __GSNRecipientSignature_init(address trustedSigner) internal initializer {\n        __Context_init_unchained();\n        __GSNRecipient_init_unchained();\n        __GSNRecipientSignature_init_unchained(trustedSigner);\n    }\n\n    function __GSNRecipientSignature_init_unchained(address trustedSigner) internal initializer {\n\n\n        require(trustedSigner != address(0), \"GSNRecipientSignature: trusted signer is the zero address\");\n        _trustedSigner = trustedSigner;\n\n    }\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    uint256[49] private __gap;\n}\n",
  "sourcePath": "contracts/GSN/GSNRecipientSignature.sol",
  "sourceMap": "558:2213:3:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;558:2213:3;;;;;;;",
  "deployedSourceMap": "558:2213:3:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;558:2213:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;1725:94:1;;;:::i;:::-;;;;-1:-1:-1;;;;;1725:94:1;;;;;;;;;;;;;;5361:221;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;5361:221:1;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;5361:221:1;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;5361:221:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5361:221:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;5361:221:1;;-1:-1:-1;5361:221:1;;-1:-1:-1;;;;;5361:221:1:i;:::-;;;;;;;;;;;;;;;;1515:1031:3;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;1515:1031:3;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;1515:1031:3;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;1515:1031:3;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;1515:1031:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;1515:1031:3;;;;;;;;;;;;;;;-1:-1:-1;1515:1031:3;;;;;-1:-1:-1;1515:1031:3;;-1:-1:-1;1515:1031:3;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;1515:1031:3;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;1515:1031:3;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;1515:1031:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;1515:1031:3;;-1:-1:-1;;1515:1031:3;;;-1:-1:-1;1515:1031:3;;-1:-1:-1;;1515:1031:3:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1515:1031:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2973:227:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2973:227:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6219:287;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;6219:287:1;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;6219:287:1;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;6219:287:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;6219:287:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;6219:287:1;;-1:-1:-1;;;;6219:287:1;;;;;-1:-1:-1;6219:287:1;;;;;;;;;:::i;:::-;;1725:94;1803:9;;-1:-1:-1;;;;;1803:9:1;1725:94;:::o;5361:221::-;5440:7;5481:12;:10;:12::i;:::-;-1:-1:-1;;;;;5467:26:1;:10;-1:-1:-1;;;;;5467:26:1;;5459:75;;;;-1:-1:-1;;;5459:75:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5551:24;5567:7;5551:15;:24::i;:::-;5544:31;5361:221;-1:-1:-1;;5361:221:1:o;1515:1031:3:-;1868:7;1877:12;1905:17;1955:5;1974:4;1992:15;2021:14;2049:8;2071;2093:5;2144:12;:10;:12::i;:::-;2220:4;1925:353;;;;;;-1:-1:-1;;;;;1925:353:3;-1:-1:-1;;;;;1925:353:3;;;;;;;;-1:-1:-1;;;;;1925:353:3;-1:-1:-1;;;;;1925:353:3;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1925:353:3;;;;;-1:-1:-1;1925:353:3;;;;;;;-1:-1:-1;1925:353:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1925:353:3;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;1925:353:3;;;;;;2358:14;;2292:15;;;;;;;;;1925:353;;-1:-1:-1;;;;;;2358:14:3;;-1:-1:-1;2292:62:3;;-1:-1:-1;2341:12:3;;-1:-1:-1;2292:40:3;;:38;:40::i;:::-;:48;:62;:48;:62;:::i;:::-;-1:-1:-1;;;;;2292:80:3;;2288:252;;;2395:21;:19;:21::i;:::-;2388:28;;;;;;;2288:252;2454:75;2481:46;2454:18;:75::i;1515:1031::-;;;;;;;;;;;;;:::o;2973:227:1:-;3179:14;;;;;;;;;;;;-1:-1:-1;;;3179:14:1;;;;2973:227;:::o;6219:287::-;6377:12;:10;:12::i;:::-;-1:-1:-1;;;;;6363:26:1;:10;-1:-1:-1;;;;;6363:26:1;;6355:75;;;;-1:-1:-1;;;6355:75:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6440:59;6457:7;6466;6475:12;6489:9;6440:59;6219:287;;;;:::o;2552:86:3:-;-1:-1:-1;2626:7:3;;2552:86::o;3363:265:9:-;3562:58;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3562:58:9;;;;;;;3552:69;;;;;;3363:265::o;1031:2068::-;1109:7;1170:9;:16;1190:2;1170:22;1166:94;;1208:41;;;-1:-1:-1;;;1208:41:9;;;;;;;;;;;;;;;;;;;;;;;;;;;1166:94;1610:4;1595:20;;1589:27;1655:4;1640:20;;1634:27;1708:4;1693:20;;1687:27;1326:9;1679:36;2626:66;2613:79;;2609:154;;;2708:44;;-1:-1:-1;;;2708:44:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2609:154;2777:1;:7;;2782:2;2777:7;;:18;;;;;2788:1;:7;;2793:2;2788:7;;2777:18;2773:93;;;2811:44;;-1:-1:-1;;;2811:44:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2773:93;2977:24;;;2960:14;2977:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2960:14;;2977:24;;;;;;;-1:-1:-1;;2977:24:9;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;2977:24:9;;-1:-1:-1;;2977:24:9;;;-1:-1:-1;;;;;;;3019:20:9;;3011:57;;;;;-1:-1:-1;;;3011:57:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;3086:6;1031:2068;-1:-1:-1;;;;;;1031:2068:9:o;7108:124:1:-;7162:7;7171:12;7202:23;;;;;;;;;;;;;:19;:23::i;:::-;7195:30;;;;7108:124;;:::o;7679:157::-;7782:47;;;;;;;;;-1:-1:-1;7782:47:1;;1315:2;7790:34;;;;;7679:157::o;7394:154::-;7468:7;;7394:154::o",
  "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": "",
          "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": {
      "GSNRecipientSignatureUpgradeSafe": [
        1000
      ]
    },
    "id": 1001,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 846,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:3"
      },
      {
        "absolutePath": "contracts/GSN/GSNRecipient.sol",
        "file": "./GSNRecipient.sol",
        "id": 847,
        "nodeType": "ImportDirective",
        "scope": 1001,
        "sourceUnit": 426,
        "src": "25:28:3",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/cryptography/ECDSA.sol",
        "file": "../cryptography/ECDSA.sol",
        "id": 848,
        "nodeType": "ImportDirective",
        "scope": 1001,
        "sourceUnit": 1926,
        "src": "54:35:3",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/Initializable.sol",
        "file": "../Initializable.sol",
        "id": 849,
        "nodeType": "ImportDirective",
        "scope": 1001,
        "sourceUnit": 1408,
        "src": "90:30:3",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 851,
              "name": "Initializable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1407,
              "src": "603:13:3",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Initializable_$1407",
                "typeString": "contract Initializable"
              }
            },
            "id": 852,
            "nodeType": "InheritanceSpecifier",
            "src": "603:13:3"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 853,
              "name": "GSNRecipientUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 425,
              "src": "618:23:3",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_GSNRecipientUpgradeSafe_$425",
                "typeString": "contract GSNRecipientUpgradeSafe"
              }
            },
            "id": 854,
            "nodeType": "InheritanceSpecifier",
            "src": "618:23:3"
          }
        ],
        "contractDependencies": [
          44,
          425,
          1334,
          1407
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 850,
          "nodeType": "StructuredDocumentation",
          "src": "122:435:3",
          "text": "@dev A xref:ROOT:gsn-strategies.adoc#gsn-strategies[GSN strategy] that allows relayed transactions through when they are\naccompanied by the signature of a trusted signer. The intent is for this signature to be generated by a server that\nperforms validations off-chain. Note that nothing is charged to the user in this scheme. Thus, the server should make\nsure to account for this in their economic and threat model."
        },
        "fullyImplemented": true,
        "id": 1000,
        "linearizedBaseContracts": [
          1000,
          425,
          44,
          1334,
          1407
        ],
        "name": "GSNRecipientSignatureUpgradeSafe",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 857,
            "libraryName": {
              "contractScope": null,
              "id": 855,
              "name": "ECDSA",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1925,
              "src": "654:5:3",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ECDSA_$1925",
                "typeString": "library ECDSA"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "648:24:3",
            "typeName": {
              "id": 856,
              "name": "bytes32",
              "nodeType": "ElementaryTypeName",
              "src": "664:7:3",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes32",
                "typeString": "bytes32"
              }
            }
          },
          {
            "constant": false,
            "id": 859,
            "mutability": "mutable",
            "name": "_trustedSigner",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 1000,
            "src": "678:30:3",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 858,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "678:7:3",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "canonicalName": "GSNRecipientSignatureUpgradeSafe.GSNRecipientSignatureErrorCodes",
            "id": 861,
            "members": [
              {
                "id": 860,
                "name": "INVALID_SIGNER",
                "nodeType": "EnumValue",
                "src": "762:14:3"
              }
            ],
            "name": "GSNRecipientSignatureErrorCodes",
            "nodeType": "EnumDefinition",
            "src": "715:67:3"
          },
          {
            "body": {
              "id": 879,
              "nodeType": "Block",
              "src": "990:147:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 869,
                      "name": "__Context_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19,
                      "src": "1000:24:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 870,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1000:26:3",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 871,
                  "nodeType": "ExpressionStatement",
                  "src": "1000:26:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 872,
                      "name": "__GSNRecipient_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 79,
                      "src": "1036:29:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 873,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1036:31:3",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 874,
                  "nodeType": "ExpressionStatement",
                  "src": "1036:31:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 876,
                        "name": "trustedSigner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 864,
                        "src": "1116:13:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 875,
                      "name": "__GSNRecipientSignature_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 902,
                      "src": "1077:38:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 877,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1077:53:3",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 878,
                  "nodeType": "ExpressionStatement",
                  "src": "1077:53:3"
                }
              ]
            },
            "documentation": {
              "id": 862,
              "nodeType": "StructuredDocumentation",
              "src": "788:114:3",
              "text": "@dev Sets the trusted signer that is going to be producing signatures to approve relayed calls."
            },
            "id": 880,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 867,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 866,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "978:11:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "978:11:3"
              }
            ],
            "name": "__GSNRecipientSignature_init",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 865,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 864,
                  "mutability": "mutable",
                  "name": "trustedSigner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 880,
                  "src": "946:21:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 863,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "946:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "945:23:3"
            },
            "returnParameters": {
              "id": 868,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "990:0:3"
            },
            "scope": 1000,
            "src": "908:229:3",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 901,
              "nodeType": "Block",
              "src": "1235:157:3",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 893,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 888,
                          "name": "trustedSigner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 882,
                          "src": "1255:13:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 891,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1280: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": 890,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1272:7:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 889,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "1272:7:3",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 892,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1272:10:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "1255:27:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "47534e526563697069656e745369676e61747572653a2074727573746564207369676e657220697320746865207a65726f2061646472657373",
                        "id": 894,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1284: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": 887,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1247:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 895,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1247:97:3",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 896,
                  "nodeType": "ExpressionStatement",
                  "src": "1247:97:3"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 899,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 897,
                      "name": "_trustedSigner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 859,
                      "src": "1354:14:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 898,
                      "name": "trustedSigner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 882,
                      "src": "1371:13:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1354:30:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 900,
                  "nodeType": "ExpressionStatement",
                  "src": "1354:30:3"
                }
              ]
            },
            "documentation": null,
            "id": 902,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 885,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 884,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "1223:11:3",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1223:11:3"
              }
            ],
            "name": "__GSNRecipientSignature_init_unchained",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 883,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 882,
                  "mutability": "mutable",
                  "name": "trustedSigner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 902,
                  "src": "1191:21:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 881,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1191:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1190:23:3"
            },
            "returnParameters": {
              "id": 886,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1235:0:3"
            },
            "scope": 1000,
            "src": "1143:249:3",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              1313
            ],
            "body": {
              "id": 972,
              "nodeType": "Block",
              "src": "1895:651:3",
              "statements": [
                {
                  "assignments": [
                    930
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 930,
                      "mutability": "mutable",
                      "name": "blob",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 972,
                      "src": "1905:17:3",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes_memory_ptr",
                        "typeString": "bytes"
                      },
                      "typeName": {
                        "id": 929,
                        "name": "bytes",
                        "nodeType": "ElementaryTypeName",
                        "src": "1905:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_storage_ptr",
                          "typeString": "bytes"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 947,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 933,
                        "name": "relay",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 905,
                        "src": "1955:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 934,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 907,
                        "src": "1974:4:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 935,
                        "name": "encodedFunction",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 909,
                        "src": "1992:15:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 936,
                        "name": "transactionFee",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 911,
                        "src": "2021:14:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 937,
                        "name": "gasPrice",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 913,
                        "src": "2049:8:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 938,
                        "name": "gasLimit",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 915,
                        "src": "2071:8:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 939,
                        "name": "nonce",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 917,
                        "src": "2093:5:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 940,
                          "name": "getHubAddr",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 107,
                          "src": "2144:10:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                            "typeString": "function () view returns (address)"
                          }
                        },
                        "id": 941,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2144:12:3",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 944,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "2220:4:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_GSNRecipientSignatureUpgradeSafe_$1000",
                              "typeString": "contract GSNRecipientSignatureUpgradeSafe"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_GSNRecipientSignatureUpgradeSafe_$1000",
                              "typeString": "contract GSNRecipientSignatureUpgradeSafe"
                            }
                          ],
                          "id": 943,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "2212:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 942,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "2212:7:3",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 945,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2212: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": 931,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -1,
                        "src": "1925:3:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 932,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "encodePacked",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "1925:16:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                        "typeString": "function () pure returns (bytes memory)"
                      }
                    },
                    "id": 946,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1925:353:3",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_memory_ptr",
                      "typeString": "bytes memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1905:373:3"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 957,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 954,
                          "name": "approvalData",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 919,
                          "src": "2341: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": 949,
                                  "name": "blob",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 930,
                                  "src": "2302:4:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                ],
                                "id": 948,
                                "name": "keccak256",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -8,
                                "src": "2292:9:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                  "typeString": "function (bytes memory) pure returns (bytes32)"
                                }
                              },
                              "id": 950,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2292:15:3",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "id": 951,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "toEthSignedMessageHash",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1924,
                            "src": "2292:38:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bytes32_$returns$_t_bytes32_$bound_to$_t_bytes32_$",
                              "typeString": "function (bytes32) pure returns (bytes32)"
                            }
                          },
                          "id": 952,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2292:40:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 953,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "recover",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1907,
                        "src": "2292: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": 955,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2292:62:3",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 956,
                      "name": "_trustedSigner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 859,
                      "src": "2358:14:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "2292:80:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 970,
                    "nodeType": "Block",
                    "src": "2433:107:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 965,
                                    "name": "GSNRecipientSignatureErrorCodes",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 861,
                                    "src": "2481:31:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_enum$_GSNRecipientSignatureErrorCodes_$861_$",
                                      "typeString": "type(enum GSNRecipientSignatureUpgradeSafe.GSNRecipientSignatureErrorCodes)"
                                    }
                                  },
                                  "id": 966,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "memberName": "INVALID_SIGNER",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2481:46:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_enum$_GSNRecipientSignatureErrorCodes_$861",
                                    "typeString": "enum GSNRecipientSignatureUpgradeSafe.GSNRecipientSignatureErrorCodes"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_enum$_GSNRecipientSignatureErrorCodes_$861",
                                    "typeString": "enum GSNRecipientSignatureUpgradeSafe.GSNRecipientSignatureErrorCodes"
                                  }
                                ],
                                "id": 964,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2473:7:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint256_$",
                                  "typeString": "type(uint256)"
                                },
                                "typeName": {
                                  "id": 963,
                                  "name": "uint256",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2473:7:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 967,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2473:55:3",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 962,
                            "name": "_rejectRelayedCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 332,
                            "src": "2454: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": 968,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2454:75:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(uint256,bytes memory)"
                          }
                        },
                        "functionReturnParameters": 928,
                        "id": 969,
                        "nodeType": "Return",
                        "src": "2447:82:3"
                      }
                    ]
                  },
                  "id": 971,
                  "nodeType": "IfStatement",
                  "src": "2288:252:3",
                  "trueBody": {
                    "id": 961,
                    "nodeType": "Block",
                    "src": "2374:53:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 958,
                            "name": "_approveRelayedCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              300,
                              315
                            ],
                            "referencedDeclaration": 300,
                            "src": "2395:19:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$__$returns$_t_uint256_$_t_bytes_memory_ptr_$",
                              "typeString": "function () pure returns (uint256,bytes memory)"
                            }
                          },
                          "id": 959,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2395:21:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(uint256,bytes memory)"
                          }
                        },
                        "functionReturnParameters": 928,
                        "id": 960,
                        "nodeType": "Return",
                        "src": "2388:28:3"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 903,
              "nodeType": "StructuredDocumentation",
              "src": "1399:111:3",
              "text": "@dev Ensures that only transactions with a trusted signature can be relayed through the GSN."
            },
            "functionSelector": "83947ea0",
            "id": 973,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "acceptRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 923,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1842:8:3"
            },
            "parameters": {
              "id": 922,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 905,
                  "mutability": "mutable",
                  "name": "relay",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 973,
                  "src": "1551:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 904,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1551:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 907,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 973,
                  "src": "1574:12:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 906,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1574:7:3",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 909,
                  "mutability": "mutable",
                  "name": "encodedFunction",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 973,
                  "src": "1596:28:3",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 908,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1596:5:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 911,
                  "mutability": "mutable",
                  "name": "transactionFee",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 973,
                  "src": "1634:22:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 910,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1634:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 913,
                  "mutability": "mutable",
                  "name": "gasPrice",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 973,
                  "src": "1666:16:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 912,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1666:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 915,
                  "mutability": "mutable",
                  "name": "gasLimit",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 973,
                  "src": "1692:16:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 914,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1692:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 917,
                  "mutability": "mutable",
                  "name": "nonce",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 973,
                  "src": "1718:13:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 916,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1718:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 919,
                  "mutability": "mutable",
                  "name": "approvalData",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 973,
                  "src": "1741:25:3",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 918,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1741:5:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 921,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 973,
                  "src": "1776:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 920,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1776:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1541:248:3"
            },
            "returnParameters": {
              "id": 928,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 925,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 973,
                  "src": "1868:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 924,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1868:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 927,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 973,
                  "src": "1877:12:3",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 926,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1877:5:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1867:23:3"
            },
            "scope": 1000,
            "src": "1515:1031:3",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              245
            ],
            "body": {
              "id": 981,
              "nodeType": "Block",
              "src": "2635:3:3",
              "statements": []
            },
            "documentation": null,
            "id": 982,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_preRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 977,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2608:8:3"
            },
            "parameters": {
              "id": 976,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 975,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 982,
                  "src": "2577:12:3",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 974,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2577:5:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2576:14:3"
            },
            "returnParameters": {
              "id": 980,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 979,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 982,
                  "src": "2626:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 978,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2626:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2625:9:3"
            },
            "scope": 1000,
            "src": "2552:86:3",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              287
            ],
            "body": {
              "id": 994,
              "nodeType": "Block",
              "src": "2734:3:3",
              "statements": []
            },
            "documentation": null,
            "id": 995,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_postRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 992,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2725:8:3"
            },
            "parameters": {
              "id": 991,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 984,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 995,
                  "src": "2670:12:3",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 983,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2670:5:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 986,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 995,
                  "src": "2684:4:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 985,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2684:4:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 988,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 995,
                  "src": "2690:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 987,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2690:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 990,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 995,
                  "src": "2699:7:3",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 989,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2699:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2669:38:3"
            },
            "returnParameters": {
              "id": 993,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2734:0:3"
            },
            "scope": 1000,
            "src": "2644:93:3",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 999,
            "mutability": "mutable",
            "name": "__gap",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 1000,
            "src": "2743:25:3",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_uint256_$49_storage",
              "typeString": "uint256[49]"
            },
            "typeName": {
              "baseType": {
                "id": 996,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "2743:7:3",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "id": 998,
              "length": {
                "argumentTypes": null,
                "hexValue": "3439",
                "id": 997,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "2751:2:3",
                "subdenomination": null,
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_49_by_1",
                  "typeString": "int_const 49"
                },
                "value": "49"
              },
              "nodeType": "ArrayTypeName",
              "src": "2743:11:3",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_uint256_$49_storage_ptr",
                "typeString": "uint256[49]"
              }
            },
            "value": null,
            "visibility": "private"
          }
        ],
        "scope": 1001,
        "src": "558:2213:3"
      }
    ],
    "src": "0:2772:3"
  },
  "bytecode": "0x608060405234801561001057600080fd5b506109b3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c806374e861d61461005c57806380274db71461008057806383947ea014610136578063ad61ccd514610312578063e06e0e221461038f575b600080fd5b610064610442565b604080516001600160a01b039092168252519081900360200190f35b6101246004803603602081101561009657600080fd5b810190602081018135600160201b8111156100b057600080fd5b8201836020820111156100c257600080fd5b803590602001918460018302840111600160201b831117156100e357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610451945050505050565b60408051918252519081900360200190f35b610293600480360361012081101561014d57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111600160201b831117156101b357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929584359560208601359560408101359550606081013594509192509060a081019060800135600160201b81111561021d57600080fd5b82018360208201111561022f57600080fd5b803590602001918460018302840111600160201b8311171561025057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506104b9915050565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156102d65781810151838201526020016102be565b50505050905090810190601f1680156103035780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b61031a610612565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561035457818101518382015260200161033c565b50505050905090810190601f1680156103815780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610440600480360360808110156103a557600080fd5b810190602081018135600160201b8111156103bf57600080fd5b8201836020820111156103d157600080fd5b803590602001918460018302840111600160201b831117156103f257600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050505080351515915060208101359060400135610631565b005b6065546001600160a01b031690565b600061045b610442565b6001600160a01b0316336001600160a01b0316146104aa5760405162461bcd60e51b815260040180806020018281038252602481526020018061095a6024913960400191505060405180910390fd5b6104b382610696565b92915050565b60006060808b8b8b8b8b8b8b6104cd610442565b30604051602001808a6001600160a01b03166001600160a01b031660601b8152601401896001600160a01b03166001600160a01b031660601b815260140188805190602001908083835b602083106105365780518252601f199092019160209182019101610517565b51815160209384036101000a6000190180199092169116179052920198895250878101969096525060408087019490945260608087019390935290821b6bffffffffffffffffffffffff199081166080870152911b1660948401528051808403608801815260a890930190526097548251918301919091209195506001600160a01b031693506105d992508891506105cd9061069c565b9063ffffffff6106ed16565b6001600160a01b031614156105fa576105f06108d4565b9250925050610604565b6105f060006108f8565b995099975050505050505050565b6040805180820190915260058152640312e302e360dc1b602082015290565b610639610442565b6001600160a01b0316336001600160a01b0316146106885760405162461bcd60e51b815260040180806020018281038252602481526020018061095a6024913960400191505060405180910390fd5b610690848484845b50505050565b50600090565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008151604114610745576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156107b65760405162461bcd60e51b81526004018080602001828103825260228152602001806109166022913960400191505060405180910390fd5b8060ff16601b141580156107ce57508060ff16601c14155b1561080a5760405162461bcd60e51b81526004018080602001828103825260228152602001806109386022913960400191505060405180910390fd5b60408051600080825260208083018085528a905260ff85168385015260608301879052608083018690529251909260019260a080820193601f1981019281900390910190855afa158015610862573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166108ca576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b600060606108f060405180602001604052806000815250610910565b915091509091565b604080516020810190915260008152600b9190910191565b60009156fe45434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c756547534e526563697069656e743a2063616c6c6572206973206e6f742052656c6179487562a26469706673582212203353a54fe3885291161c71211f46c196519ddc1bc941786374bcb6813fbba5fb64736f6c63430006070033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c806374e861d61461005c57806380274db71461008057806383947ea014610136578063ad61ccd514610312578063e06e0e221461038f575b600080fd5b610064610442565b604080516001600160a01b039092168252519081900360200190f35b6101246004803603602081101561009657600080fd5b810190602081018135600160201b8111156100b057600080fd5b8201836020820111156100c257600080fd5b803590602001918460018302840111600160201b831117156100e357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610451945050505050565b60408051918252519081900360200190f35b610293600480360361012081101561014d57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111600160201b831117156101b357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929584359560208601359560408101359550606081013594509192509060a081019060800135600160201b81111561021d57600080fd5b82018360208201111561022f57600080fd5b803590602001918460018302840111600160201b8311171561025057600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506104b9915050565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156102d65781810151838201526020016102be565b50505050905090810190601f1680156103035780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b61031a610612565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561035457818101518382015260200161033c565b50505050905090810190601f1680156103815780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610440600480360360808110156103a557600080fd5b810190602081018135600160201b8111156103bf57600080fd5b8201836020820111156103d157600080fd5b803590602001918460018302840111600160201b831117156103f257600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050505080351515915060208101359060400135610631565b005b6065546001600160a01b031690565b600061045b610442565b6001600160a01b0316336001600160a01b0316146104aa5760405162461bcd60e51b815260040180806020018281038252602481526020018061095a6024913960400191505060405180910390fd5b6104b382610696565b92915050565b60006060808b8b8b8b8b8b8b6104cd610442565b30604051602001808a6001600160a01b03166001600160a01b031660601b8152601401896001600160a01b03166001600160a01b031660601b815260140188805190602001908083835b602083106105365780518252601f199092019160209182019101610517565b51815160209384036101000a6000190180199092169116179052920198895250878101969096525060408087019490945260608087019390935290821b6bffffffffffffffffffffffff199081166080870152911b1660948401528051808403608801815260a890930190526097548251918301919091209195506001600160a01b031693506105d992508891506105cd9061069c565b9063ffffffff6106ed16565b6001600160a01b031614156105fa576105f06108d4565b9250925050610604565b6105f060006108f8565b995099975050505050505050565b6040805180820190915260058152640312e302e360dc1b602082015290565b610639610442565b6001600160a01b0316336001600160a01b0316146106885760405162461bcd60e51b815260040180806020018281038252602481526020018061095a6024913960400191505060405180910390fd5b610690848484845b50505050565b50600090565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008151604114610745576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156107b65760405162461bcd60e51b81526004018080602001828103825260228152602001806109166022913960400191505060405180910390fd5b8060ff16601b141580156107ce57508060ff16601c14155b1561080a5760405162461bcd60e51b81526004018080602001828103825260228152602001806109386022913960400191505060405180910390fd5b60408051600080825260208083018085528a905260ff85168385015260608301879052608083018690529251909260019260a080820193601f1981019281900390910190855afa158015610862573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166108ca576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b600060606108f060405180602001604052806000815250610910565b915091509091565b604080516020810190915260008152600b9190910191565b60009156fe45434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c756547534e526563697069656e743a2063616c6c6572206973206e6f742052656c6179487562a26469706673582212203353a54fe3885291161c71211f46c196519ddc1bc941786374bcb6813fbba5fb64736f6c63430006070033",
  "compiler": {
    "name": "solc",
    "version": "0.6.7+commit.b8d736ae.Emscripten.clang",
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "evmVersion": "petersburg"
  }
}
