{
    "contractName": "GsnEip712Library",
    "abi": [
        {
            "inputs": [],
            "name": "EIP712DOMAIN_TYPEHASH",
            "outputs": [
                {
                    "internalType": "bytes32",
                    "name": "",
                    "type": "bytes32"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "GENERIC_PARAMS",
            "outputs": [
                {
                    "internalType": "string",
                    "name": "",
                    "type": "string"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "RELAYDATA_TYPE",
            "outputs": [
                {
                    "internalType": "bytes",
                    "name": "",
                    "type": "bytes"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "RELAYDATA_TYPEHASH",
            "outputs": [
                {
                    "internalType": "bytes32",
                    "name": "",
                    "type": "bytes32"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "RELAY_REQUEST_NAME",
            "outputs": [
                {
                    "internalType": "string",
                    "name": "",
                    "type": "string"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "RELAY_REQUEST_SUFFIX",
            "outputs": [
                {
                    "internalType": "string",
                    "name": "",
                    "type": "string"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "RELAY_REQUEST_TYPE",
            "outputs": [
                {
                    "internalType": "bytes",
                    "name": "",
                    "type": "bytes"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "RELAY_REQUEST_TYPEHASH",
            "outputs": [
                {
                    "internalType": "bytes32",
                    "name": "",
                    "type": "bytes32"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        }
    ],
    "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"EIP712DOMAIN_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GENERIC_PARAMS\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAYDATA_TYPE\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAYDATA_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_REQUEST_NAME\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_REQUEST_SUFFIX\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_REQUEST_TYPE\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RELAY_REQUEST_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"The ERC-712 Library for GSN\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Bridge Library to convert a GSN RelayRequest into a valid `ForwardRequest` for a `Forwarder`.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnEip712Library.sol\":\"GsnEip712Library\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/alexf/gsn2/packages/contracts/solpp/forwarder/IForwarder.sol\":{\"keccak256\":\"0xef3d770001c3245db4408cdd0afdfc622695ccfe31f28b74571d05158bbf83f8\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://08949174ed05b596d89c8f1eeedfeb254993b84054bbc1ff6081ad926f5db406\",\"dweb:/ipfs/QmNQtKzHpie4Esocxuc9YrPtGQyA928a1a5TWbVc7cPoqk\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/interfaces/IERC2771Recipient.sol\":{\"keccak256\":\"0x92a3665ec2fc3d2ab78cf8a08451b2ab6466dc7fae3c215150be2132500406fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://364eee344363535733b4cc1a7748e1fc8b10786f6df6c0e2bc0082bcb2477e0e\",\"dweb:/ipfs/QmfCwWAxFqU4woSqu3g5BFPASEA7eCSwcwUSHM9EoYhYdu\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnEip712Library.sol\":{\"keccak256\":\"0xc35980f371cab5d9af3e1ead06f82b2afb705a8dbb2a5f53793f0179c485c274\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://dd7732d690c7959df567ee3e4863b0045583506fbae3c87b684b6173fd126968\",\"dweb:/ipfs/QmUbcUAqxKZTQS5ZwwPVnfNAtCmas4pPWQhRWXXwWQEeef\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnTypes.sol\":{\"keccak256\":\"0xfc3ed2bbd925e24facf0c3bb96d57dd7fc5bcc4a684b5473f04e8d209b758805\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://cb57b5b38d3e588f119ae45174891f2049d1d0de160a12b81a20335cd8bf731b\",\"dweb:/ipfs/Qmf6xfbdLbTKEpnzxwnSaRy1YZJtLYTZh8URqry86oyoSU\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnUtils.sol\":{\"keccak256\":\"0x8616968305b6127f4cb43209502e074c3964230a66c703e6b8623b03e5ec6442\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://2b1f1163fee75613024b38c25e17649933919f4a47a5ba5e8c3ea046023eb1ad\",\"dweb:/ipfs/QmNWReZE8BQ82eXahdKjnNjQWHuH9L9wcTcnKgyV5ypKCa\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/utils/MinLibBytes.sol\":{\"keccak256\":\"0xa61a3d8fcd89182975d0bd17b86c22b6affd2f7bf26db66b1ddb2ee396f122ab\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2e0bc21e2c8c2f483aee9d5bc003fa77dc7afddbaa7cc99560581a416cfdef11\",\"dweb:/ipfs/QmbwLE7AJpoH2LVeeHxewq3tf1vXhLNUdYsubWxzDGKfTr\"]},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0xd04b0f06e0666f29cf7cccc82894de541e19bb30a765b107b1e40bb7fe5f7d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7b652499d098e88d8d878374616bb58434301061cae2253298b3f374044e0ddb\",\"dweb:/ipfs/QmbhAzctqo5jrSKU6idHdVyqfmzCcDbNUPvmx4GiXxfA6q\"]},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]}},\"version\":1}",
    "bytecode": "0x61055c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100925760003560e01c8063abf0d3f411610065578063abf0d3f4146100f0578063c46cf83f14610106578063c49f91d31461010e578063cc0c62b21461013557600080fd5b8063066a310c146100975780636225e61b146100b5578063931cd38f146100bd578063987673f7146100c5575b600080fd5b61009f61013d565b6040516100ac91906103bf565b60405180910390f35b61009f610159565b61009f6101f1565b61009f6040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b81525081565b6100f861021a565b6040519081526020016100ac565b61009f6102b9565b6100f87f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6100f86102d5565b6040518060a001604052806061815260200161040a6061913981565b6040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a001604052806061815260200161040a606191396040518060e0016040528060bc815260200161046b60bc91396040516020016101c09190610383565b60408051601f19818403018152908290526101df939291602001610324565b60405160208183030381529060405281565b6040518060e0016040528060bc815260200161046b60bc91396040516020016101df9190610383565b6040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a001604052806061815260200161040a606191396040518060e0016040528060bc815260200161046b60bc91396040516020016102819190610383565b60408051601f19818403018152908290526102a0939291602001610324565b6040516020818303038152906040528051906020012081565b6040518060e0016040528060bc815260200161046b60bc913981565b6040518060e0016040528060bc815260200161046b60bc91398051906020012081565b600081518084526103108160208601602086016103d9565b601f01601f19169290920160200192915050565b600084516103368184602089016103d9565b600560fb1b90830190815284516103548160018401602089016103d9565b600b60fa1b6001929091019182015283516103768160028401602088016103d9565b0160020195945050505050565b7352656c6179446174612072656c6179446174612960601b8152600082516103b28160148501602087016103d9565b9190910160140192915050565b6020815260006103d260208301846102f8565b9392505050565b60005b838110156103f45781810151838201526020016103dc565b83811115610403576000848401525b5050505056fe616464726573732066726f6d2c6164647265737320746f2c75696e743235362076616c75652c75696e74323536206761732c75696e74323536206e6f6e63652c627974657320646174612c75696e743235362076616c6964556e74696c54696d6552656c6179446174612875696e74323536206d61784665655065724761732c75696e74323536206d61785072696f726974794665655065724761732c75696e74323536207472616e73616374696f6e43616c6c64617461476173557365642c616464726573732072656c6179576f726b65722c61646472657373207061796d61737465722c6164647265737320666f727761726465722c6279746573207061796d6173746572446174612c75696e7432353620636c69656e74496429a264697066735822122003b32a92319f3faa537cff59d94a56f9582d3b891f6eb674e8f717f41ed52e7d64736f6c63430008070033",
    "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100925760003560e01c8063abf0d3f411610065578063abf0d3f4146100f0578063c46cf83f14610106578063c49f91d31461010e578063cc0c62b21461013557600080fd5b8063066a310c146100975780636225e61b146100b5578063931cd38f146100bd578063987673f7146100c5575b600080fd5b61009f61013d565b6040516100ac91906103bf565b60405180910390f35b61009f610159565b61009f6101f1565b61009f6040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b81525081565b6100f861021a565b6040519081526020016100ac565b61009f6102b9565b6100f87f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6100f86102d5565b6040518060a001604052806061815260200161040a6061913981565b6040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a001604052806061815260200161040a606191396040518060e0016040528060bc815260200161046b60bc91396040516020016101c09190610383565b60408051601f19818403018152908290526101df939291602001610324565b60405160208183030381529060405281565b6040518060e0016040528060bc815260200161046b60bc91396040516020016101df9190610383565b6040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a001604052806061815260200161040a606191396040518060e0016040528060bc815260200161046b60bc91396040516020016102819190610383565b60408051601f19818403018152908290526102a0939291602001610324565b6040516020818303038152906040528051906020012081565b6040518060e0016040528060bc815260200161046b60bc913981565b6040518060e0016040528060bc815260200161046b60bc91398051906020012081565b600081518084526103108160208601602086016103d9565b601f01601f19169290920160200192915050565b600084516103368184602089016103d9565b600560fb1b90830190815284516103548160018401602089016103d9565b600b60fa1b6001929091019182015283516103768160028401602088016103d9565b0160020195945050505050565b7352656c6179446174612072656c6179446174612960601b8152600082516103b28160148501602087016103d9565b9190910160140192915050565b6020815260006103d260208301846102f8565b9392505050565b60005b838110156103f45781810151838201526020016103dc565b83811115610403576000848401525b5050505056fe616464726573732066726f6d2c6164647265737320746f2c75696e743235362076616c75652c75696e74323536206761732c75696e74323536206e6f6e63652c627974657320646174612c75696e743235362076616c6964556e74696c54696d6552656c6179446174612875696e74323536206d61784665655065724761732c75696e74323536206d61785072696f726974794665655065724761732c75696e74323536207472616e73616374696f6e43616c6c64617461476173557365642c616464726573732072656c6179576f726b65722c61646472657373207061796d61737465722c6164647265737320666f727761726465722c6279746573207061796d6173746572446174612c75696e7432353620636c69656e74496429a264697066735822122003b32a92319f3faa537cff59d94a56f9582d3b891f6eb674e8f717f41ed52e7d64736f6c63430008070033",
    "immutableReferences": {},
    "sourceMap": "381:5743:38:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;381:5743:38;;;;;;;;;;;;;;;;;",
    "deployedSourceMap": "381:5743:38:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;663:139;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1226:133;;;:::i;1109:110::-;;;:::i;1045:58::-;;;;;;;;;;;;;;;-1:-1:-1;;;1045:58:38;;;;;1442:78;;;:::i;:::-;;;1817:25:63;;;1805:2;1790:18;1442:78:38;1663:185:63;809:229:38;;;:::i;1665:157::-;;1713:109;1665:157;;1366:70;;;:::i;663:139::-;;;;;;;;;;;;;;;;;;;:::o;1226:133::-;1295:18;;;;;;;;;;;;;-1:-1:-1;;;1295:18:38;;;1318:14;;;;;;;;;;;;;;;;;1203;;;;;;;;;;;;;;;;;1162:56;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1162:56:38;;;;;;;;;;1269:90;;;;1162:56;1269:90;;:::i;:::-;;;;;;;;;;;;;1226:133;:::o;1109:110::-;1203:14;;;;;;;;;;;;;;;;;1162:56;;;;;;;;:::i;1442:78::-;1295:18;;;;;;;;;;;;;-1:-1:-1;;;1295:18:38;;;1318:14;;;;;;;;;;;;;;;;;1203;;;;;;;;;;;;;;;;;1162:56;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1162:56:38;;;;;;;;;;1269:90;;;;1162:56;1269:90;;:::i;:::-;;;;;;;;;;;;;1491:29;;;;;;1442:78;:::o;809:229::-;;;;;;;;;;;;;;;;;;;:::o;1366:70::-;1421:14;;;;;;;;;;;;;;;;;1411:25;;;;;;1366:70;:::o;14:257:63:-;55:3;93:5;87:12;120:6;115:3;108:19;136:63;192:6;185:4;180:3;176:14;169:4;162:5;158:16;136:63;:::i;:::-;253:2;232:15;-1:-1:-1;;228:29:63;219:39;;;;260:4;215:50;;14:257;-1:-1:-1;;14:257:63:o;276:940::-;705:3;743:6;737:13;759:53;805:6;800:3;793:4;785:6;781:17;759:53;:::i;:::-;-1:-1:-1;;;834:16:63;;;859:18;;;902:13;;924:65;902:13;976:1;965:13;;958:4;946:17;;924:65;:::i;:::-;-1:-1:-1;;;1052:1:63;1008:20;;;;1044:10;;;1037:23;1085:13;;1107:62;1085:13;1156:1;1148:10;;1141:4;1129:17;;1107:62;:::i;:::-;1189:17;1208:1;1185:25;;276:940;-1:-1:-1;;;;;276:940:63:o;1221:437::-;-1:-1:-1;;;1476:3:63;1469:35;1451:3;1533:6;1527:13;1549:62;1604:6;1599:2;1594:3;1590:12;1583:4;1575:6;1571:17;1549:62;:::i;:::-;1631:16;;;;1649:2;1627:25;;1221:437;-1:-1:-1;;1221:437:63:o;1853:225::-;2008:2;1997:9;1990:21;1971:4;2028:44;2068:2;2057:9;2053:18;2045:6;2028:44;:::i;:::-;2020:52;1853:225;-1:-1:-1;;;1853:225:63:o;2315:258::-;2387:1;2397:113;2411:6;2408:1;2405:13;2397:113;;;2487:11;;;2481:18;2468:11;;;2461:39;2433:2;2426:10;2397:113;;;2528:6;2525:1;2522:13;2519:48;;;2563:1;2554:6;2549:3;2545:16;2538:27;2519:48;;2315:258;;;:::o",
    "source": "pragma solidity ^0.8.0;\npragma abicoder v2;\n\n// SPDX-License-Identifier: GPL-3.0-only\n\nimport \"../utils/GsnTypes.sol\";\nimport \"../interfaces/IERC2771Recipient.sol\";\nimport \"../forwarder/IForwarder.sol\";\n\nimport \"./GsnUtils.sol\";\n\n/**\n * @title The ERC-712 Library for GSN\n * @notice Bridge Library to convert a GSN RelayRequest into a valid `ForwardRequest` for a `Forwarder`.\n */\nlibrary GsnEip712Library {\n    // maximum length of return value/revert reason for 'execute' method. Will truncate result if exceeded.\n    uint256 private constant MAX_RETURN_SIZE = 1024;\n\n    //copied from Forwarder (can't reference string constants even from another library)\n    string public constant GENERIC_PARAMS = \"address from,address to,uint256 value,uint256 gas,uint256 nonce,bytes data,uint256 validUntilTime\";\n\n    bytes public constant RELAYDATA_TYPE = \"RelayData(uint256 maxFeePerGas,uint256 maxPriorityFeePerGas,uint256 transactionCalldataGasUsed,address relayWorker,address paymaster,address forwarder,bytes paymasterData,uint256 clientId)\";\n\n    string public constant RELAY_REQUEST_NAME = \"RelayRequest\";\n    string public constant RELAY_REQUEST_SUFFIX = string(abi.encodePacked(\"RelayData relayData)\", RELAYDATA_TYPE));\n\n    bytes public constant RELAY_REQUEST_TYPE = abi.encodePacked(\n        RELAY_REQUEST_NAME,\"(\",GENERIC_PARAMS,\",\", RELAY_REQUEST_SUFFIX);\n\n    bytes32 public constant RELAYDATA_TYPEHASH = keccak256(RELAYDATA_TYPE);\n    bytes32 public constant RELAY_REQUEST_TYPEHASH = keccak256(RELAY_REQUEST_TYPE);\n\n    struct EIP712Domain {\n        string name;\n        string version;\n        uint256 chainId;\n        address verifyingContract;\n    }\n\n    bytes32 public constant EIP712DOMAIN_TYPEHASH = keccak256(\n        \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n    );\n\n    function splitRequest(\n        GsnTypes.RelayRequest calldata req\n    )\n    internal\n    pure\n    returns (\n        bytes memory suffixData\n    ) {\n        suffixData = abi.encode(\n            hashRelayData(req.relayData));\n    }\n\n    //verify that the recipient trusts the given forwarder\n    // MUST be called by paymaster\n    function verifyForwarderTrusted(GsnTypes.RelayRequest calldata relayRequest) internal view {\n        (bool success, bytes memory ret) = relayRequest.request.to.staticcall(\n            abi.encodeWithSelector(\n                IERC2771Recipient.isTrustedForwarder.selector, relayRequest.relayData.forwarder\n            )\n        );\n        require(success, \"isTrustedForwarder: reverted\");\n        require(ret.length == 32, \"isTrustedForwarder: bad response\");\n        require(abi.decode(ret, (bool)), \"invalid forwarder for recipient\");\n    }\n\n    function verifySignature(\n        string memory domainSeparatorName,\n        GsnTypes.RelayRequest calldata relayRequest,\n        bytes calldata signature\n    ) internal view {\n        (bytes memory suffixData) = splitRequest(relayRequest);\n        bytes32 _domainSeparator = domainSeparator(domainSeparatorName, relayRequest.relayData.forwarder);\n        IForwarder forwarder = IForwarder(payable(relayRequest.relayData.forwarder));\n        forwarder.verify(relayRequest.request, _domainSeparator, RELAY_REQUEST_TYPEHASH, suffixData, signature);\n    }\n\n    function verify(\n        string memory domainSeparatorName,\n        GsnTypes.RelayRequest calldata relayRequest,\n        bytes calldata signature\n    ) internal view {\n        verifyForwarderTrusted(relayRequest);\n        verifySignature(domainSeparatorName, relayRequest, signature);\n    }\n\n    function execute(\n        string memory domainSeparatorName,\n        GsnTypes.RelayRequest calldata relayRequest,\n        bytes calldata signature\n    ) internal returns (\n        bool forwarderSuccess,\n        bool callSuccess,\n        bytes memory ret\n    ) {\n        (bytes memory suffixData) = splitRequest(relayRequest);\n        bytes32 _domainSeparator = domainSeparator(domainSeparatorName, relayRequest.relayData.forwarder);\n        /* solhint-disable-next-line avoid-low-level-calls */\n        (forwarderSuccess, ret) = relayRequest.relayData.forwarder.call(\n            abi.encodeWithSelector(IForwarder.execute.selector,\n            relayRequest.request, _domainSeparator, RELAY_REQUEST_TYPEHASH, suffixData, signature\n        ));\n        if ( forwarderSuccess ) {\n\n          //decode return value of execute:\n          (callSuccess, ret) = abi.decode(ret, (bool, bytes));\n        }\n        truncateInPlace(ret);\n    }\n\n    //truncate the given parameter (in-place) if its length is above the given maximum length\n    // do nothing otherwise.\n    //NOTE: solidity warns unless the method is marked \"pure\", but it DOES modify its parameter.\n    function truncateInPlace(bytes memory data) internal pure {\n        MinLibBytes.truncateInPlace(data, MAX_RETURN_SIZE);\n    }\n\n    function domainSeparator(string memory name, address forwarder) internal view returns (bytes32) {\n        return hashDomain(EIP712Domain({\n            name : name,\n            version : \"3\",\n            chainId : getChainID(),\n            verifyingContract : forwarder\n            }));\n    }\n\n    function getChainID() internal view returns (uint256 id) {\n        /* solhint-disable no-inline-assembly */\n        assembly {\n            id := chainid()\n        }\n    }\n\n    function hashDomain(EIP712Domain memory req) internal pure returns (bytes32) {\n        return keccak256(abi.encode(\n                EIP712DOMAIN_TYPEHASH,\n                keccak256(bytes(req.name)),\n                keccak256(bytes(req.version)),\n                req.chainId,\n                req.verifyingContract));\n    }\n\n    function hashRelayData(GsnTypes.RelayData calldata req) internal pure returns (bytes32) {\n        return keccak256(abi.encode(\n                RELAYDATA_TYPEHASH,\n                req.maxFeePerGas,\n                req.maxPriorityFeePerGas,\n                req.transactionCalldataGasUsed,\n                req.relayWorker,\n                req.paymaster,\n                req.forwarder,\n                keccak256(req.paymasterData),\n                req.clientId\n            ));\n    }\n}",
    "sourcePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnEip712Library.sol",
    "ast": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnEip712Library.sol",
        "exportedSymbols": {
            "GsnEip712Library": [
                8464
            ],
            "GsnTypes": [
                8492
            ],
            "GsnUtils": [
                8572
            ],
            "IERC165": [
                12352
            ],
            "IERC2771Recipient": [
                5374
            ],
            "IForwarder": [
                5129
            ],
            "MinLibBytes": [
                8687
            ]
        },
        "id": 8465,
        "license": "GPL-3.0-only",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 8079,
                "literals": [
                    "solidity",
                    "^",
                    "0.8",
                    ".0"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:23:38"
            },
            {
                "id": 8080,
                "literals": [
                    "abicoder",
                    "v2"
                ],
                "nodeType": "PragmaDirective",
                "src": "24:19:38"
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnTypes.sol",
                "file": "../utils/GsnTypes.sol",
                "id": 8081,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8465,
                "sourceUnit": 8493,
                "src": "87:31:38",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/interfaces/IERC2771Recipient.sol",
                "file": "../interfaces/IERC2771Recipient.sol",
                "id": 8082,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8465,
                "sourceUnit": 5375,
                "src": "119:45:38",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/forwarder/IForwarder.sol",
                "file": "../forwarder/IForwarder.sol",
                "id": 8083,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8465,
                "sourceUnit": 5130,
                "src": "165:37:38",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnUtils.sol",
                "file": "./GsnUtils.sol",
                "id": 8084,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8465,
                "sourceUnit": 8573,
                "src": "204:24:38",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": false,
                "baseContracts": [],
                "contractDependencies": [],
                "contractKind": "library",
                "documentation": {
                    "id": 8085,
                    "nodeType": "StructuredDocumentation",
                    "src": "230:150:38",
                    "text": " @title The ERC-712 Library for GSN\n @notice Bridge Library to convert a GSN RelayRequest into a valid `ForwardRequest` for a `Forwarder`."
                },
                "fullyImplemented": true,
                "id": 8464,
                "linearizedBaseContracts": [
                    8464
                ],
                "name": "GsnEip712Library",
                "nameLocation": "389:16:38",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "constant": true,
                        "id": 8088,
                        "mutability": "constant",
                        "name": "MAX_RETURN_SIZE",
                        "nameLocation": "545:15:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "520:47:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                        },
                        "typeName": {
                            "id": 8086,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "520:7:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "value": {
                            "hexValue": "31303234",
                            "id": 8087,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "563:4:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_rational_1024_by_1",
                                "typeString": "int_const 1024"
                            },
                            "value": "1024"
                        },
                        "visibility": "private"
                    },
                    {
                        "constant": true,
                        "functionSelector": "066a310c",
                        "id": 8091,
                        "mutability": "constant",
                        "name": "GENERIC_PARAMS",
                        "nameLocation": "686:14:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "663:139:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string"
                        },
                        "typeName": {
                            "id": 8089,
                            "name": "string",
                            "nodeType": "ElementaryTypeName",
                            "src": "663:6:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_string_storage_ptr",
                                "typeString": "string"
                            }
                        },
                        "value": {
                            "hexValue": "616464726573732066726f6d2c6164647265737320746f2c75696e743235362076616c75652c75696e74323536206761732c75696e74323536206e6f6e63652c627974657320646174612c75696e743235362076616c6964556e74696c54696d65",
                            "id": 8090,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "703:99:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_33f12fe95872be7be9c474c0e99a56a1b0cad386a14d26df2bb11622e5368f9b",
                                "typeString": "literal_string \"address from,address to,uint256 value,uint256 gas,uint256 nonce,bytes data,uint256 validUntilTime\""
                            },
                            "value": "address from,address to,uint256 value,uint256 gas,uint256 nonce,bytes data,uint256 validUntilTime"
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "c46cf83f",
                        "id": 8094,
                        "mutability": "constant",
                        "name": "RELAYDATA_TYPE",
                        "nameLocation": "831:14:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "809:229:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes"
                        },
                        "typeName": {
                            "id": 8092,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "809:5:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                            }
                        },
                        "value": {
                            "hexValue": "52656c6179446174612875696e74323536206d61784665655065724761732c75696e74323536206d61785072696f726974794665655065724761732c75696e74323536207472616e73616374696f6e43616c6c64617461476173557365642c616464726573732072656c6179576f726b65722c61646472657373207061796d61737465722c6164647265737320666f727761726465722c6279746573207061796d6173746572446174612c75696e7432353620636c69656e74496429",
                            "id": 8093,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "848:190:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c5ea90dda9219120f9d08877180c718e673bc3e452715c45f7d7c9bd6548dacf",
                                "typeString": "literal_string \"RelayData(uint256 maxFeePerGas,uint256 maxPriorityFeePerGas,uint256 transactionCalldataGasUsed,address relayWorker,address paymaster,address forwarder,bytes paymasterData,uint256 clientId)\""
                            },
                            "value": "RelayData(uint256 maxFeePerGas,uint256 maxPriorityFeePerGas,uint256 transactionCalldataGasUsed,address relayWorker,address paymaster,address forwarder,bytes paymasterData,uint256 clientId)"
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "987673f7",
                        "id": 8097,
                        "mutability": "constant",
                        "name": "RELAY_REQUEST_NAME",
                        "nameLocation": "1068:18:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "1045:58:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string"
                        },
                        "typeName": {
                            "id": 8095,
                            "name": "string",
                            "nodeType": "ElementaryTypeName",
                            "src": "1045:6:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_string_storage_ptr",
                                "typeString": "string"
                            }
                        },
                        "value": {
                            "hexValue": "52656c617952657175657374",
                            "id": 8096,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1089:14:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9474f9de570f8c3456d0ad4af045975f85d14cb683a1e7b73535cecf52ff41f8",
                                "typeString": "literal_string \"RelayRequest\""
                            },
                            "value": "RelayRequest"
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "931cd38f",
                        "id": 8107,
                        "mutability": "constant",
                        "name": "RELAY_REQUEST_SUFFIX",
                        "nameLocation": "1132:20:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "1109:110:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string"
                        },
                        "typeName": {
                            "id": 8098,
                            "name": "string",
                            "nodeType": "ElementaryTypeName",
                            "src": "1109:6:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_string_storage_ptr",
                                "typeString": "string"
                            }
                        },
                        "value": {
                            "arguments": [
                                {
                                    "arguments": [
                                        {
                                            "hexValue": "52656c6179446174612072656c61794461746129",
                                            "id": 8103,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "string",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "1179:22:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_stringliteral_3fadbea26dd302bcc6197cc8afc00cbc86899723a86835ca1f1216f26949bb7f",
                                                "typeString": "literal_string \"RelayData relayData)\""
                                            },
                                            "value": "RelayData relayData)"
                                        },
                                        {
                                            "id": 8104,
                                            "name": "RELAYDATA_TYPE",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8094,
                                            "src": "1203:14:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                            }
                                        }
                                    ],
                                    "expression": {
                                        "argumentTypes": [
                                            {
                                                "typeIdentifier": "t_stringliteral_3fadbea26dd302bcc6197cc8afc00cbc86899723a86835ca1f1216f26949bb7f",
                                                "typeString": "literal_string \"RelayData relayData)\""
                                            },
                                            {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                            }
                                        ],
                                        "expression": {
                                            "id": 8101,
                                            "name": "abi",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4294967295,
                                            "src": "1162:3:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_magic_abi",
                                                "typeString": "abi"
                                            }
                                        },
                                        "id": 8102,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "memberName": "encodePacked",
                                        "nodeType": "MemberAccess",
                                        "src": "1162:16:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                            "typeString": "function () pure returns (bytes memory)"
                                        }
                                    },
                                    "id": 8105,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "1162:56:38",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                    }
                                }
                            ],
                            "expression": {
                                "argumentTypes": [
                                    {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                    }
                                ],
                                "id": 8100,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1155:6:38",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                    "typeString": "type(string storage pointer)"
                                },
                                "typeName": {
                                    "id": 8099,
                                    "name": "string",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1155:6:38",
                                    "typeDescriptions": {}
                                }
                            },
                            "id": 8106,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1155:64:38",
                            "tryCall": false,
                            "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "6225e61b",
                        "id": 8117,
                        "mutability": "constant",
                        "name": "RELAY_REQUEST_TYPE",
                        "nameLocation": "1248:18:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "1226:133:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes"
                        },
                        "typeName": {
                            "id": 8108,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "1226:5:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                            }
                        },
                        "value": {
                            "arguments": [
                                {
                                    "id": 8111,
                                    "name": "RELAY_REQUEST_NAME",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8097,
                                    "src": "1295:18:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                    }
                                },
                                {
                                    "hexValue": "28",
                                    "id": 8112,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1314:3:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_stringliteral_484bf06f3118ce360605f902ef526c45207bc469c2b056352f14b8408f9f6f9a",
                                        "typeString": "literal_string \"(\""
                                    },
                                    "value": "("
                                },
                                {
                                    "id": 8113,
                                    "name": "GENERIC_PARAMS",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8091,
                                    "src": "1318:14:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                    }
                                },
                                {
                                    "hexValue": "2c",
                                    "id": 8114,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1333:3:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_stringliteral_3e7a35b97029f9e0cf6effd71c1a7958822e9a217d3a3aec886668a7dd8231cb",
                                        "typeString": "literal_string \",\""
                                    },
                                    "value": ","
                                },
                                {
                                    "id": 8115,
                                    "name": "RELAY_REQUEST_SUFFIX",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8107,
                                    "src": "1338:20:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                    }
                                }
                            ],
                            "expression": {
                                "argumentTypes": [
                                    {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                    },
                                    {
                                        "typeIdentifier": "t_stringliteral_484bf06f3118ce360605f902ef526c45207bc469c2b056352f14b8408f9f6f9a",
                                        "typeString": "literal_string \"(\""
                                    },
                                    {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                    },
                                    {
                                        "typeIdentifier": "t_stringliteral_3e7a35b97029f9e0cf6effd71c1a7958822e9a217d3a3aec886668a7dd8231cb",
                                        "typeString": "literal_string \",\""
                                    },
                                    {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                    }
                                ],
                                "expression": {
                                    "id": 8109,
                                    "name": "abi",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4294967295,
                                    "src": "1269:3:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_magic_abi",
                                        "typeString": "abi"
                                    }
                                },
                                "id": 8110,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodePacked",
                                "nodeType": "MemberAccess",
                                "src": "1269:16:38",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                    "typeString": "function () pure returns (bytes memory)"
                                }
                            },
                            "id": 8116,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1269:90:38",
                            "tryCall": false,
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "cc0c62b2",
                        "id": 8122,
                        "mutability": "constant",
                        "name": "RELAYDATA_TYPEHASH",
                        "nameLocation": "1390:18:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "1366:70:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                        },
                        "typeName": {
                            "id": 8118,
                            "name": "bytes32",
                            "nodeType": "ElementaryTypeName",
                            "src": "1366:7:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        },
                        "value": {
                            "arguments": [
                                {
                                    "id": 8120,
                                    "name": "RELAYDATA_TYPE",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8094,
                                    "src": "1421:14:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                    }
                                }
                            ],
                            "expression": {
                                "argumentTypes": [
                                    {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                    }
                                ],
                                "id": 8119,
                                "name": "keccak256",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4294967288,
                                "src": "1411:9:38",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                    "typeString": "function (bytes memory) pure returns (bytes32)"
                                }
                            },
                            "id": 8121,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1411:25:38",
                            "tryCall": false,
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "abf0d3f4",
                        "id": 8127,
                        "mutability": "constant",
                        "name": "RELAY_REQUEST_TYPEHASH",
                        "nameLocation": "1466:22:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "1442:78:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                        },
                        "typeName": {
                            "id": 8123,
                            "name": "bytes32",
                            "nodeType": "ElementaryTypeName",
                            "src": "1442:7:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        },
                        "value": {
                            "arguments": [
                                {
                                    "id": 8125,
                                    "name": "RELAY_REQUEST_TYPE",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8117,
                                    "src": "1501:18:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                    }
                                }
                            ],
                            "expression": {
                                "argumentTypes": [
                                    {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                    }
                                ],
                                "id": 8124,
                                "name": "keccak256",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4294967288,
                                "src": "1491:9:38",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                    "typeString": "function (bytes memory) pure returns (bytes32)"
                                }
                            },
                            "id": 8126,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1491:29:38",
                            "tryCall": false,
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "canonicalName": "GsnEip712Library.EIP712Domain",
                        "id": 8136,
                        "members": [
                            {
                                "constant": false,
                                "id": 8129,
                                "mutability": "mutable",
                                "name": "name",
                                "nameLocation": "1564:4:38",
                                "nodeType": "VariableDeclaration",
                                "scope": 8136,
                                "src": "1557:11:38",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_string_storage_ptr",
                                    "typeString": "string"
                                },
                                "typeName": {
                                    "id": 8128,
                                    "name": "string",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1557:6:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_storage_ptr",
                                        "typeString": "string"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 8131,
                                "mutability": "mutable",
                                "name": "version",
                                "nameLocation": "1585:7:38",
                                "nodeType": "VariableDeclaration",
                                "scope": 8136,
                                "src": "1578:14:38",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_string_storage_ptr",
                                    "typeString": "string"
                                },
                                "typeName": {
                                    "id": 8130,
                                    "name": "string",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1578:6:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_storage_ptr",
                                        "typeString": "string"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 8133,
                                "mutability": "mutable",
                                "name": "chainId",
                                "nameLocation": "1610:7:38",
                                "nodeType": "VariableDeclaration",
                                "scope": 8136,
                                "src": "1602:15:38",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                },
                                "typeName": {
                                    "id": 8132,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1602:7:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 8135,
                                "mutability": "mutable",
                                "name": "verifyingContract",
                                "nameLocation": "1635:17:38",
                                "nodeType": "VariableDeclaration",
                                "scope": 8136,
                                "src": "1627:25:38",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                },
                                "typeName": {
                                    "id": 8134,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1627:7:38",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    }
                                },
                                "visibility": "internal"
                            }
                        ],
                        "name": "EIP712Domain",
                        "nameLocation": "1534:12:38",
                        "nodeType": "StructDefinition",
                        "scope": 8464,
                        "src": "1527:132:38",
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "c49f91d3",
                        "id": 8141,
                        "mutability": "constant",
                        "name": "EIP712DOMAIN_TYPEHASH",
                        "nameLocation": "1689:21:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "1665:157:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                        },
                        "typeName": {
                            "id": 8137,
                            "name": "bytes32",
                            "nodeType": "ElementaryTypeName",
                            "src": "1665:7:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        },
                        "value": {
                            "arguments": [
                                {
                                    "hexValue": "454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429",
                                    "id": 8139,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1732:84:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
                                        "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""
                                    },
                                    "value": "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
                                }
                            ],
                            "expression": {
                                "argumentTypes": [
                                    {
                                        "typeIdentifier": "t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
                                        "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""
                                    }
                                ],
                                "id": 8138,
                                "name": "keccak256",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4294967288,
                                "src": "1713:9:38",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                    "typeString": "function (bytes memory) pure returns (bytes32)"
                                }
                            },
                            "id": 8140,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1713:109:38",
                            "tryCall": false,
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 8159,
                            "nodeType": "Block",
                            "src": "1975:83:38",
                            "statements": [
                                {
                                    "expression": {
                                        "id": 8157,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "id": 8149,
                                            "name": "suffixData",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8147,
                                            "src": "1985:10:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "arguments": [
                                                {
                                                    "arguments": [
                                                        {
                                                            "expression": {
                                                                "id": 8153,
                                                                "name": "req",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8144,
                                                                "src": "2036:3:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                                }
                                                            },
                                                            "id": 8154,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "memberName": "relayData",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": 8490,
                                                            "src": "2036:13:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        ],
                                                        "id": 8152,
                                                        "name": "hashRelayData",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8463,
                                                        "src": "2022:13:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_function_internal_pure$_t_struct$_RelayData_$8484_calldata_ptr_$returns$_t_bytes32_$",
                                                            "typeString": "function (struct GsnTypes.RelayData calldata) pure returns (bytes32)"
                                                        }
                                                    },
                                                    "id": 8155,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "2022:28:38",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes32",
                                                        "typeString": "bytes32"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_bytes32",
                                                        "typeString": "bytes32"
                                                    }
                                                ],
                                                "expression": {
                                                    "id": 8150,
                                                    "name": "abi",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 4294967295,
                                                    "src": "1998:3:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_magic_abi",
                                                        "typeString": "abi"
                                                    }
                                                },
                                                "id": 8151,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "memberName": "encode",
                                                "nodeType": "MemberAccess",
                                                "src": "1998:10:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                                    "typeString": "function () pure returns (bytes memory)"
                                                }
                                            },
                                            "id": 8156,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "1998:53:38",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                            }
                                        },
                                        "src": "1985:66:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                        }
                                    },
                                    "id": 8158,
                                    "nodeType": "ExpressionStatement",
                                    "src": "1985:66:38"
                                }
                            ]
                        },
                        "id": 8160,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "splitRequest",
                        "nameLocation": "1838:12:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8145,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8144,
                                    "mutability": "mutable",
                                    "name": "req",
                                    "nameLocation": "1891:3:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8160,
                                    "src": "1860:34:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 8143,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8142,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "1860:21:38"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "1860:21:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1850:50:38"
                        },
                        "returnParameters": {
                            "id": 8148,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8147,
                                    "mutability": "mutable",
                                    "name": "suffixData",
                                    "nameLocation": "1958:10:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8160,
                                    "src": "1945:23:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 8146,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1945:5:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1935:39:38"
                        },
                        "scope": 8464,
                        "src": "1829:229:38",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8209,
                            "nodeType": "Block",
                            "src": "2249:449:38",
                            "statements": [
                                {
                                    "assignments": [
                                        8167,
                                        8169
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 8167,
                                            "mutability": "mutable",
                                            "name": "success",
                                            "nameLocation": "2265:7:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8209,
                                            "src": "2260:12:38",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            },
                                            "typeName": {
                                                "id": 8166,
                                                "name": "bool",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "2260:4:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            "visibility": "internal"
                                        },
                                        {
                                            "constant": false,
                                            "id": 8169,
                                            "mutability": "mutable",
                                            "name": "ret",
                                            "nameLocation": "2287:3:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8209,
                                            "src": "2274:16:38",
                                            "stateVariable": false,
                                            "storageLocation": "memory",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes"
                                            },
                                            "typeName": {
                                                "id": 8168,
                                                "name": "bytes",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "2274:5:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_storage_ptr",
                                                    "typeString": "bytes"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 8184,
                                    "initialValue": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "expression": {
                                                            "expression": {
                                                                "id": 8176,
                                                                "name": "IERC2771Recipient",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 5374,
                                                                "src": "2382:17:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_type$_t_contract$_IERC2771Recipient_$5374_$",
                                                                    "typeString": "type(contract IERC2771Recipient)"
                                                                }
                                                            },
                                                            "id": 8177,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "memberName": "isTrustedForwarder",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": 5361,
                                                            "src": "2382:36:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_declaration_view$_t_address_$returns$_t_bool_$",
                                                                "typeString": "function IERC2771Recipient.isTrustedForwarder(address) view returns (bool)"
                                                            }
                                                        },
                                                        "id": 8178,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "memberName": "selector",
                                                        "nodeType": "MemberAccess",
                                                        "src": "2382:45:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes4",
                                                            "typeString": "bytes4"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "expression": {
                                                                "id": 8179,
                                                                "name": "relayRequest",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8163,
                                                                "src": "2429:12:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                                }
                                                            },
                                                            "id": 8180,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "memberName": "relayData",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": 8490,
                                                            "src": "2429:22:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8181,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "forwarder",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8479,
                                                        "src": "2429:32:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_bytes4",
                                                            "typeString": "bytes4"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "id": 8174,
                                                        "name": "abi",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967295,
                                                        "src": "2342:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_abi",
                                                            "typeString": "abi"
                                                        }
                                                    },
                                                    "id": 8175,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "memberName": "encodeWithSelector",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2342:22:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                                        "typeString": "function (bytes4) pure returns (bytes memory)"
                                                    }
                                                },
                                                "id": 8182,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "2342:133:38",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "expression": {
                                                "expression": {
                                                    "expression": {
                                                        "id": 8170,
                                                        "name": "relayRequest",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8163,
                                                        "src": "2294:12:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                            "typeString": "struct GsnTypes.RelayRequest calldata"
                                                        }
                                                    },
                                                    "id": 8171,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "request",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 8487,
                                                    "src": "2294:20:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                        "typeString": "struct IForwarder.ForwardRequest calldata"
                                                    }
                                                },
                                                "id": 8172,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "to",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 5047,
                                                "src": "2294:23:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            },
                                            "id": 8173,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "staticcall",
                                            "nodeType": "MemberAccess",
                                            "src": "2294:34:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                                "typeString": "function (bytes memory) view returns (bool,bytes memory)"
                                            }
                                        },
                                        "id": 8183,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2294:191:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                            "typeString": "tuple(bool,bytes memory)"
                                        }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "2259:226:38"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 8186,
                                                "name": "success",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8167,
                                                "src": "2503:7:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "697354727573746564466f727761726465723a207265766572746564",
                                                "id": 8187,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2512:30:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_29871498aacc097c93f180e11ad1fc7bbe7fd0af33ce4f55cda39c1be559cc5e",
                                                    "typeString": "literal_string \"isTrustedForwarder: reverted\""
                                                },
                                                "value": "isTrustedForwarder: reverted"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_29871498aacc097c93f180e11ad1fc7bbe7fd0af33ce4f55cda39c1be559cc5e",
                                                    "typeString": "literal_string \"isTrustedForwarder: reverted\""
                                                }
                                            ],
                                            "id": 8185,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "2495:7:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 8188,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2495:48:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8189,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2495:48:38"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                "id": 8194,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "expression": {
                                                        "id": 8191,
                                                        "name": "ret",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8169,
                                                        "src": "2561:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes_memory_ptr",
                                                            "typeString": "bytes memory"
                                                        }
                                                    },
                                                    "id": 8192,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "length",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2561:10:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "hexValue": "3332",
                                                    "id": 8193,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "number",
                                                    "lValueRequested": false,
                                                    "nodeType": "Literal",
                                                    "src": "2575:2:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_rational_32_by_1",
                                                        "typeString": "int_const 32"
                                                    },
                                                    "value": "32"
                                                },
                                                "src": "2561:16:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "697354727573746564466f727761726465723a2062616420726573706f6e7365",
                                                "id": 8195,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2579:34:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_8de434f38be4084093951d99ef6ad881eb532d2fda93e085bee354124c9fe325",
                                                    "typeString": "literal_string \"isTrustedForwarder: bad response\""
                                                },
                                                "value": "isTrustedForwarder: bad response"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_8de434f38be4084093951d99ef6ad881eb532d2fda93e085bee354124c9fe325",
                                                    "typeString": "literal_string \"isTrustedForwarder: bad response\""
                                                }
                                            ],
                                            "id": 8190,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "2553:7:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 8196,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2553:61:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8197,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2553:61:38"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "id": 8201,
                                                        "name": "ret",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8169,
                                                        "src": "2643:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes_memory_ptr",
                                                            "typeString": "bytes memory"
                                                        }
                                                    },
                                                    {
                                                        "components": [
                                                            {
                                                                "id": 8203,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": true,
                                                                "lValueRequested": false,
                                                                "nodeType": "ElementaryTypeNameExpression",
                                                                "src": "2649:4:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_type$_t_bool_$",
                                                                    "typeString": "type(bool)"
                                                                },
                                                                "typeName": {
                                                                    "id": 8202,
                                                                    "name": "bool",
                                                                    "nodeType": "ElementaryTypeName",
                                                                    "src": "2649:4:38",
                                                                    "typeDescriptions": {}
                                                                }
                                                            }
                                                        ],
                                                        "id": 8204,
                                                        "isConstant": false,
                                                        "isInlineArray": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "TupleExpression",
                                                        "src": "2648:6:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_bool_$",
                                                            "typeString": "type(bool)"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_bytes_memory_ptr",
                                                            "typeString": "bytes memory"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_type$_t_bool_$",
                                                            "typeString": "type(bool)"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "id": 8199,
                                                        "name": "abi",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967295,
                                                        "src": "2632:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_abi",
                                                            "typeString": "abi"
                                                        }
                                                    },
                                                    "id": 8200,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "memberName": "decode",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2632:10:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                        "typeString": "function () pure"
                                                    }
                                                },
                                                "id": 8205,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "2632:23:38",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "696e76616c696420666f7277617264657220666f7220726563697069656e74",
                                                "id": 8206,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2657:33:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_18a22d77ec00a6a6e3ef02db4f7f7b9054ded7d3fa47898d59b46e9844b2acb4",
                                                    "typeString": "literal_string \"invalid forwarder for recipient\""
                                                },
                                                "value": "invalid forwarder for recipient"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_18a22d77ec00a6a6e3ef02db4f7f7b9054ded7d3fa47898d59b46e9844b2acb4",
                                                    "typeString": "literal_string \"invalid forwarder for recipient\""
                                                }
                                            ],
                                            "id": 8198,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "2624:7:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 8207,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2624:67:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8208,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2624:67:38"
                                }
                            ]
                        },
                        "id": 8210,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "verifyForwarderTrusted",
                        "nameLocation": "2167:22:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8164,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8163,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "2221:12:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8210,
                                    "src": "2190:43:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 8162,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8161,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "2190:21:38"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "2190:21:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2189:45:38"
                        },
                        "returnParameters": {
                            "id": 8165,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2249:0:38"
                        },
                        "scope": 8464,
                        "src": "2158:540:38",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8258,
                            "nodeType": "Block",
                            "src": "2879:377:38",
                            "statements": [
                                {
                                    "assignments": [
                                        8221
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 8221,
                                            "mutability": "mutable",
                                            "name": "suffixData",
                                            "nameLocation": "2903:10:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8258,
                                            "src": "2890:23:38",
                                            "stateVariable": false,
                                            "storageLocation": "memory",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes"
                                            },
                                            "typeName": {
                                                "id": 8220,
                                                "name": "bytes",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "2890:5:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_storage_ptr",
                                                    "typeString": "bytes"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 8225,
                                    "initialValue": {
                                        "arguments": [
                                            {
                                                "id": 8223,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8215,
                                                "src": "2930:12:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            ],
                                            "id": 8222,
                                            "name": "splitRequest",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8160,
                                            "src": "2917:12:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$_t_bytes_memory_ptr_$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) pure returns (bytes memory)"
                                            }
                                        },
                                        "id": 8224,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2917:26:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                        }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "2889:54:38"
                                },
                                {
                                    "assignments": [
                                        8227
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 8227,
                                            "mutability": "mutable",
                                            "name": "_domainSeparator",
                                            "nameLocation": "2961:16:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8258,
                                            "src": "2953:24:38",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes32",
                                                "typeString": "bytes32"
                                            },
                                            "typeName": {
                                                "id": 8226,
                                                "name": "bytes32",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "2953:7:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 8234,
                                    "initialValue": {
                                        "arguments": [
                                            {
                                                "id": 8229,
                                                "name": "domainSeparatorName",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8212,
                                                "src": "2996:19:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                }
                                            },
                                            {
                                                "expression": {
                                                    "expression": {
                                                        "id": 8230,
                                                        "name": "relayRequest",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8215,
                                                        "src": "3017:12:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                            "typeString": "struct GsnTypes.RelayRequest calldata"
                                                        }
                                                    },
                                                    "id": 8231,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "relayData",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 8490,
                                                    "src": "3017:22:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayData calldata"
                                                    }
                                                },
                                                "id": 8232,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "forwarder",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 8479,
                                                "src": "3017:32:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                },
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            ],
                                            "id": 8228,
                                            "name": "domainSeparator",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8388,
                                            "src": "2980:15:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$_t_address_$returns$_t_bytes32_$",
                                                "typeString": "function (string memory,address) view returns (bytes32)"
                                            }
                                        },
                                        "id": 8233,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2980:70:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "2953:97:38"
                                },
                                {
                                    "assignments": [
                                        8237
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 8237,
                                            "mutability": "mutable",
                                            "name": "forwarder",
                                            "nameLocation": "3071:9:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8258,
                                            "src": "3060:20:38",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IForwarder_$5129",
                                                "typeString": "contract IForwarder"
                                            },
                                            "typeName": {
                                                "id": 8236,
                                                "nodeType": "UserDefinedTypeName",
                                                "pathNode": {
                                                    "id": 8235,
                                                    "name": "IForwarder",
                                                    "nodeType": "IdentifierPath",
                                                    "referencedDeclaration": 5129,
                                                    "src": "3060:10:38"
                                                },
                                                "referencedDeclaration": 5129,
                                                "src": "3060:10:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_IForwarder_$5129",
                                                    "typeString": "contract IForwarder"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 8246,
                                    "initialValue": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "expression": {
                                                            "expression": {
                                                                "id": 8241,
                                                                "name": "relayRequest",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8215,
                                                                "src": "3102:12:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                                }
                                                            },
                                                            "id": 8242,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "memberName": "relayData",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": 8490,
                                                            "src": "3102:22:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8243,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "forwarder",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8479,
                                                        "src": "3102:32:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    ],
                                                    "id": 8240,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "nodeType": "ElementaryTypeNameExpression",
                                                    "src": "3094:8:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_address_payable_$",
                                                        "typeString": "type(address payable)"
                                                    },
                                                    "typeName": {
                                                        "id": 8239,
                                                        "name": "address",
                                                        "nodeType": "ElementaryTypeName",
                                                        "src": "3094:8:38",
                                                        "stateMutability": "payable",
                                                        "typeDescriptions": {}
                                                    }
                                                },
                                                "id": 8244,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "typeConversion",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "3094:41:38",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address_payable",
                                                    "typeString": "address payable"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_address_payable",
                                                    "typeString": "address payable"
                                                }
                                            ],
                                            "id": 8238,
                                            "name": "IForwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 5129,
                                            "src": "3083:10:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_contract$_IForwarder_$5129_$",
                                                "typeString": "type(contract IForwarder)"
                                            }
                                        },
                                        "id": 8245,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3083:53:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IForwarder_$5129",
                                            "typeString": "contract IForwarder"
                                        }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "3060:76:38"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "expression": {
                                                    "id": 8250,
                                                    "name": "relayRequest",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8215,
                                                    "src": "3163:12:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayRequest calldata"
                                                    }
                                                },
                                                "id": 8251,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "request",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 8487,
                                                "src": "3163:20:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                    "typeString": "struct IForwarder.ForwardRequest calldata"
                                                }
                                            },
                                            {
                                                "id": 8252,
                                                "name": "_domainSeparator",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8227,
                                                "src": "3185:16:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                }
                                            },
                                            {
                                                "id": 8253,
                                                "name": "RELAY_REQUEST_TYPEHASH",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8127,
                                                "src": "3203:22:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                }
                                            },
                                            {
                                                "id": 8254,
                                                "name": "suffixData",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8221,
                                                "src": "3227:10:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            },
                                            {
                                                "id": 8255,
                                                "name": "signature",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8217,
                                                "src": "3239:9:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                    "typeString": "struct IForwarder.ForwardRequest calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            ],
                                            "expression": {
                                                "id": 8247,
                                                "name": "forwarder",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8237,
                                                "src": "3146:9:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_IForwarder_$5129",
                                                    "typeString": "contract IForwarder"
                                                }
                                            },
                                            "id": 8249,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "verify",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 5093,
                                            "src": "3146:16:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_external_view$_t_struct$_ForwardRequest_$5058_memory_ptr_$_t_bytes32_$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$__$",
                                                "typeString": "function (struct IForwarder.ForwardRequest memory,bytes32,bytes32,bytes memory,bytes memory) view external"
                                            }
                                        },
                                        "id": 8256,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3146:103:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8257,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3146:103:38"
                                }
                            ]
                        },
                        "id": 8259,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "verifySignature",
                        "nameLocation": "2713:15:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8218,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8212,
                                    "mutability": "mutable",
                                    "name": "domainSeparatorName",
                                    "nameLocation": "2752:19:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8259,
                                    "src": "2738:33:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 8211,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2738:6:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8215,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "2812:12:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8259,
                                    "src": "2781:43:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 8214,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8213,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "2781:21:38"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "2781:21:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8217,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "2849:9:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8259,
                                    "src": "2834:24:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 8216,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2834:5:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2728:136:38"
                        },
                        "returnParameters": {
                            "id": 8219,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2879:0:38"
                        },
                        "scope": 8464,
                        "src": "2704:552:38",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8279,
                            "nodeType": "Block",
                            "src": "3428:124:38",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 8270,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8264,
                                                "src": "3461:12:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            ],
                                            "id": 8269,
                                            "name": "verifyForwarderTrusted",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8210,
                                            "src": "3438:22:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$__$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) view"
                                            }
                                        },
                                        "id": 8271,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3438:36:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8272,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3438:36:38"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 8274,
                                                "name": "domainSeparatorName",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8261,
                                                "src": "3500:19:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                }
                                            },
                                            {
                                                "id": 8275,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8264,
                                                "src": "3521:12:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            },
                                            {
                                                "id": 8276,
                                                "name": "signature",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8266,
                                                "src": "3535:9:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                },
                                                {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            ],
                                            "id": 8273,
                                            "name": "verifySignature",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8259,
                                            "src": "3484:15:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$_t_struct$_RelayRequest_$8491_calldata_ptr_$_t_bytes_calldata_ptr_$returns$__$",
                                                "typeString": "function (string memory,struct GsnTypes.RelayRequest calldata,bytes calldata) view"
                                            }
                                        },
                                        "id": 8277,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3484:61:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8278,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3484:61:38"
                                }
                            ]
                        },
                        "id": 8280,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "verify",
                        "nameLocation": "3271:6:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8267,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8261,
                                    "mutability": "mutable",
                                    "name": "domainSeparatorName",
                                    "nameLocation": "3301:19:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8280,
                                    "src": "3287:33:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 8260,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3287:6:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8264,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "3361:12:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8280,
                                    "src": "3330:43:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 8263,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8262,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "3330:21:38"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "3330:21:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8266,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "3398:9:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8280,
                                    "src": "3383:24:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 8265,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3383:5:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3277:136:38"
                        },
                        "returnParameters": {
                            "id": 8268,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "3428:0:38"
                        },
                        "scope": 8464,
                        "src": "3262:290:38",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8354,
                            "nodeType": "Block",
                            "src": "3818:669:38",
                            "statements": [
                                {
                                    "assignments": [
                                        8297
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 8297,
                                            "mutability": "mutable",
                                            "name": "suffixData",
                                            "nameLocation": "3842:10:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8354,
                                            "src": "3829:23:38",
                                            "stateVariable": false,
                                            "storageLocation": "memory",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes"
                                            },
                                            "typeName": {
                                                "id": 8296,
                                                "name": "bytes",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "3829:5:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_storage_ptr",
                                                    "typeString": "bytes"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 8301,
                                    "initialValue": {
                                        "arguments": [
                                            {
                                                "id": 8299,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8285,
                                                "src": "3869:12:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            ],
                                            "id": 8298,
                                            "name": "splitRequest",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8160,
                                            "src": "3856:12:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$_t_bytes_memory_ptr_$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) pure returns (bytes memory)"
                                            }
                                        },
                                        "id": 8300,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3856:26:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                        }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "3828:54:38"
                                },
                                {
                                    "assignments": [
                                        8303
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 8303,
                                            "mutability": "mutable",
                                            "name": "_domainSeparator",
                                            "nameLocation": "3900:16:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8354,
                                            "src": "3892:24:38",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes32",
                                                "typeString": "bytes32"
                                            },
                                            "typeName": {
                                                "id": 8302,
                                                "name": "bytes32",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "3892:7:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 8310,
                                    "initialValue": {
                                        "arguments": [
                                            {
                                                "id": 8305,
                                                "name": "domainSeparatorName",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8282,
                                                "src": "3935:19:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                }
                                            },
                                            {
                                                "expression": {
                                                    "expression": {
                                                        "id": 8306,
                                                        "name": "relayRequest",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8285,
                                                        "src": "3956:12:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                            "typeString": "struct GsnTypes.RelayRequest calldata"
                                                        }
                                                    },
                                                    "id": 8307,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "relayData",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 8490,
                                                    "src": "3956:22:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayData calldata"
                                                    }
                                                },
                                                "id": 8308,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "forwarder",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 8479,
                                                "src": "3956:32:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                },
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            ],
                                            "id": 8304,
                                            "name": "domainSeparator",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8388,
                                            "src": "3919:15:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$_t_address_$returns$_t_bytes32_$",
                                                "typeString": "function (string memory,address) view returns (bytes32)"
                                            }
                                        },
                                        "id": 8309,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3919:70:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "3892:97:38"
                                },
                                {
                                    "expression": {
                                        "id": 8331,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "components": [
                                                {
                                                    "id": 8311,
                                                    "name": "forwarderSuccess",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8290,
                                                    "src": "4062:16:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                    }
                                                },
                                                {
                                                    "id": 8312,
                                                    "name": "ret",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8294,
                                                    "src": "4080:3:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                }
                                            ],
                                            "id": 8313,
                                            "isConstant": false,
                                            "isInlineArray": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": true,
                                            "nodeType": "TupleExpression",
                                            "src": "4061:23:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                                "typeString": "tuple(bool,bytes memory)"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "arguments": [
                                                {
                                                    "arguments": [
                                                        {
                                                            "expression": {
                                                                "expression": {
                                                                    "id": 8320,
                                                                    "name": "IForwarder",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 5129,
                                                                    "src": "4161:10:38",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_type$_t_contract$_IForwarder_$5129_$",
                                                                        "typeString": "type(contract IForwarder)"
                                                                    }
                                                                },
                                                                "id": 8321,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": true,
                                                                "lValueRequested": false,
                                                                "memberName": "execute",
                                                                "nodeType": "MemberAccess",
                                                                "referencedDeclaration": 5112,
                                                                "src": "4161:18:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_function_declaration_payable$_t_struct$_ForwardRequest_$5058_calldata_ptr_$_t_bytes32_$_t_bytes32_$_t_bytes_calldata_ptr_$_t_bytes_calldata_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                                                    "typeString": "function IForwarder.execute(struct IForwarder.ForwardRequest calldata,bytes32,bytes32,bytes calldata,bytes calldata) payable returns (bool,bytes memory)"
                                                                }
                                                            },
                                                            "id": 8322,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "memberName": "selector",
                                                            "nodeType": "MemberAccess",
                                                            "src": "4161:27:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes4",
                                                                "typeString": "bytes4"
                                                            }
                                                        },
                                                        {
                                                            "expression": {
                                                                "id": 8323,
                                                                "name": "relayRequest",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8285,
                                                                "src": "4202:12:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                                }
                                                            },
                                                            "id": 8324,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "memberName": "request",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": 8487,
                                                            "src": "4202:20:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                                "typeString": "struct IForwarder.ForwardRequest calldata"
                                                            }
                                                        },
                                                        {
                                                            "id": 8325,
                                                            "name": "_domainSeparator",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8303,
                                                            "src": "4224:16:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            }
                                                        },
                                                        {
                                                            "id": 8326,
                                                            "name": "RELAY_REQUEST_TYPEHASH",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8127,
                                                            "src": "4242:22:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            }
                                                        },
                                                        {
                                                            "id": 8327,
                                                            "name": "suffixData",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8297,
                                                            "src": "4266:10:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                                "typeString": "bytes memory"
                                                            }
                                                        },
                                                        {
                                                            "id": 8328,
                                                            "name": "signature",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8287,
                                                            "src": "4278:9:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                            }
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_bytes4",
                                                                "typeString": "bytes4"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                                "typeString": "struct IForwarder.ForwardRequest calldata"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                                "typeString": "bytes memory"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                            }
                                                        ],
                                                        "expression": {
                                                            "id": 8318,
                                                            "name": "abi",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967295,
                                                            "src": "4138:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_magic_abi",
                                                                "typeString": "abi"
                                                            }
                                                        },
                                                        "id": 8319,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "memberName": "encodeWithSelector",
                                                        "nodeType": "MemberAccess",
                                                        "src": "4138:22:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                                            "typeString": "function (bytes4) pure returns (bytes memory)"
                                                        }
                                                    },
                                                    "id": 8329,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "4138:159:38",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                ],
                                                "expression": {
                                                    "expression": {
                                                        "expression": {
                                                            "id": 8314,
                                                            "name": "relayRequest",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8285,
                                                            "src": "4087:12:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayRequest calldata"
                                                            }
                                                        },
                                                        "id": 8315,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "relayData",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8490,
                                                        "src": "4087:22:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                            "typeString": "struct GsnTypes.RelayData calldata"
                                                        }
                                                    },
                                                    "id": 8316,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "forwarder",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 8479,
                                                    "src": "4087:32:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "id": 8317,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "call",
                                                "nodeType": "MemberAccess",
                                                "src": "4087:37:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                                    "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                                                }
                                            },
                                            "id": 8330,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "4087:211:38",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                                "typeString": "tuple(bool,bytes memory)"
                                            }
                                        },
                                        "src": "4061:237:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8332,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4061:237:38"
                                },
                                {
                                    "condition": {
                                        "id": 8333,
                                        "name": "forwarderSuccess",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 8290,
                                        "src": "4313:16:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "id": 8349,
                                    "nodeType": "IfStatement",
                                    "src": "4308:143:38",
                                    "trueBody": {
                                        "id": 8348,
                                        "nodeType": "Block",
                                        "src": "4332:119:38",
                                        "statements": [
                                            {
                                                "expression": {
                                                    "id": 8346,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "leftHandSide": {
                                                        "components": [
                                                            {
                                                                "id": 8334,
                                                                "name": "callSuccess",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8292,
                                                                "src": "4390:11:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bool",
                                                                    "typeString": "bool"
                                                                }
                                                            },
                                                            {
                                                                "id": 8335,
                                                                "name": "ret",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8294,
                                                                "src": "4403:3:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                }
                                                            }
                                                        ],
                                                        "id": 8336,
                                                        "isConstant": false,
                                                        "isInlineArray": false,
                                                        "isLValue": true,
                                                        "isPure": false,
                                                        "lValueRequested": true,
                                                        "nodeType": "TupleExpression",
                                                        "src": "4389:18:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                                            "typeString": "tuple(bool,bytes memory)"
                                                        }
                                                    },
                                                    "nodeType": "Assignment",
                                                    "operator": "=",
                                                    "rightHandSide": {
                                                        "arguments": [
                                                            {
                                                                "id": 8339,
                                                                "name": "ret",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8294,
                                                                "src": "4421:3:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                }
                                                            },
                                                            {
                                                                "components": [
                                                                    {
                                                                        "id": 8341,
                                                                        "isConstant": false,
                                                                        "isLValue": false,
                                                                        "isPure": true,
                                                                        "lValueRequested": false,
                                                                        "nodeType": "ElementaryTypeNameExpression",
                                                                        "src": "4427:4:38",
                                                                        "typeDescriptions": {
                                                                            "typeIdentifier": "t_type$_t_bool_$",
                                                                            "typeString": "type(bool)"
                                                                        },
                                                                        "typeName": {
                                                                            "id": 8340,
                                                                            "name": "bool",
                                                                            "nodeType": "ElementaryTypeName",
                                                                            "src": "4427:4:38",
                                                                            "typeDescriptions": {}
                                                                        }
                                                                    },
                                                                    {
                                                                        "id": 8343,
                                                                        "isConstant": false,
                                                                        "isLValue": false,
                                                                        "isPure": true,
                                                                        "lValueRequested": false,
                                                                        "nodeType": "ElementaryTypeNameExpression",
                                                                        "src": "4433:5:38",
                                                                        "typeDescriptions": {
                                                                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                                                            "typeString": "type(bytes storage pointer)"
                                                                        },
                                                                        "typeName": {
                                                                            "id": 8342,
                                                                            "name": "bytes",
                                                                            "nodeType": "ElementaryTypeName",
                                                                            "src": "4433:5:38",
                                                                            "typeDescriptions": {}
                                                                        }
                                                                    }
                                                                ],
                                                                "id": 8344,
                                                                "isConstant": false,
                                                                "isInlineArray": false,
                                                                "isLValue": false,
                                                                "isPure": true,
                                                                "lValueRequested": false,
                                                                "nodeType": "TupleExpression",
                                                                "src": "4426:13:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_tuple$_t_type$_t_bool_$_$_t_type$_t_bytes_storage_ptr_$_$",
                                                                    "typeString": "tuple(type(bool),type(bytes storage pointer))"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                },
                                                                {
                                                                    "typeIdentifier": "t_tuple$_t_type$_t_bool_$_$_t_type$_t_bytes_storage_ptr_$_$",
                                                                    "typeString": "tuple(type(bool),type(bytes storage pointer))"
                                                                }
                                                            ],
                                                            "expression": {
                                                                "id": 8337,
                                                                "name": "abi",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 4294967295,
                                                                "src": "4410:3:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_magic_abi",
                                                                    "typeString": "abi"
                                                                }
                                                            },
                                                            "id": 8338,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "memberName": "decode",
                                                            "nodeType": "MemberAccess",
                                                            "src": "4410:10:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                                "typeString": "function () pure"
                                                            }
                                                        },
                                                        "id": 8345,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "4410:30:38",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                                            "typeString": "tuple(bool,bytes memory)"
                                                        }
                                                    },
                                                    "src": "4389:51:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_tuple$__$",
                                                        "typeString": "tuple()"
                                                    }
                                                },
                                                "id": 8347,
                                                "nodeType": "ExpressionStatement",
                                                "src": "4389:51:38"
                                            }
                                        ]
                                    }
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 8351,
                                                "name": "ret",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8294,
                                                "src": "4476:3:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "id": 8350,
                                            "name": "truncateInPlace",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8368,
                                            "src": "4460:15:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$",
                                                "typeString": "function (bytes memory) pure"
                                            }
                                        },
                                        "id": 8352,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "4460:20:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8353,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4460:20:38"
                                }
                            ]
                        },
                        "id": 8355,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "execute",
                        "nameLocation": "3567:7:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8288,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8282,
                                    "mutability": "mutable",
                                    "name": "domainSeparatorName",
                                    "nameLocation": "3598:19:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8355,
                                    "src": "3584:33:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 8281,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3584:6:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8285,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "3658:12:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8355,
                                    "src": "3627:43:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 8284,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8283,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "3627:21:38"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "3627:21:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8287,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "3695:9:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8355,
                                    "src": "3680:24:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 8286,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3680:5:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3574:136:38"
                        },
                        "returnParameters": {
                            "id": 8295,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8290,
                                    "mutability": "mutable",
                                    "name": "forwarderSuccess",
                                    "nameLocation": "3743:16:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8355,
                                    "src": "3738:21:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 8289,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3738:4:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8292,
                                    "mutability": "mutable",
                                    "name": "callSuccess",
                                    "nameLocation": "3774:11:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8355,
                                    "src": "3769:16:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 8291,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3769:4:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8294,
                                    "mutability": "mutable",
                                    "name": "ret",
                                    "nameLocation": "3808:3:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8355,
                                    "src": "3795:16:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 8293,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3795:5:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3728:89:38"
                        },
                        "scope": 8464,
                        "src": "3558:929:38",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8367,
                            "nodeType": "Block",
                            "src": "4771:67:38",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 8363,
                                                "name": "data",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8357,
                                                "src": "4809:4:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            },
                                            {
                                                "id": 8364,
                                                "name": "MAX_RETURN_SIZE",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8088,
                                                "src": "4815:15:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            ],
                                            "expression": {
                                                "id": 8360,
                                                "name": "MinLibBytes",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8687,
                                                "src": "4781:11:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_MinLibBytes_$8687_$",
                                                    "typeString": "type(library MinLibBytes)"
                                                }
                                            },
                                            "id": 8362,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "truncateInPlace",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 8589,
                                            "src": "4781:27:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$__$",
                                                "typeString": "function (bytes memory,uint256) pure"
                                            }
                                        },
                                        "id": 8365,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "4781:50:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8366,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4781:50:38"
                                }
                            ]
                        },
                        "id": 8368,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "truncateInPlace",
                        "nameLocation": "4722:15:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8358,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8357,
                                    "mutability": "mutable",
                                    "name": "data",
                                    "nameLocation": "4751:4:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8368,
                                    "src": "4738:17:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 8356,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4738:5:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4737:19:38"
                        },
                        "returnParameters": {
                            "id": 8359,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4771:0:38"
                        },
                        "scope": 8464,
                        "src": "4713:125:38",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8387,
                            "nodeType": "Block",
                            "src": "4940:195:38",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "id": 8379,
                                                        "name": "name",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8370,
                                                        "src": "5002:4:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_string_memory_ptr",
                                                            "typeString": "string memory"
                                                        }
                                                    },
                                                    {
                                                        "hexValue": "33",
                                                        "id": 8380,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "kind": "string",
                                                        "lValueRequested": false,
                                                        "nodeType": "Literal",
                                                        "src": "5030:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_stringliteral_2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de",
                                                            "typeString": "literal_string \"3\""
                                                        },
                                                        "value": "3"
                                                    },
                                                    {
                                                        "arguments": [],
                                                        "expression": {
                                                            "argumentTypes": [],
                                                            "id": 8381,
                                                            "name": "getChainID",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8395,
                                                            "src": "5057:10:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                                                "typeString": "function () view returns (uint256)"
                                                            }
                                                        },
                                                        "id": 8382,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "5057:12:38",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    },
                                                    {
                                                        "id": 8383,
                                                        "name": "forwarder",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8372,
                                                        "src": "5103:9:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_string_memory_ptr",
                                                            "typeString": "string memory"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_stringliteral_2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de",
                                                            "typeString": "literal_string \"3\""
                                                        },
                                                        {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    ],
                                                    "id": 8378,
                                                    "name": "EIP712Domain",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8136,
                                                    "src": "4968:12:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_struct$_EIP712Domain_$8136_storage_ptr_$",
                                                        "typeString": "type(struct GsnEip712Library.EIP712Domain storage pointer)"
                                                    }
                                                },
                                                "id": 8384,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "structConstructorCall",
                                                "lValueRequested": false,
                                                "names": [
                                                    "name",
                                                    "version",
                                                    "chainId",
                                                    "verifyingContract"
                                                ],
                                                "nodeType": "FunctionCall",
                                                "src": "4968:159:38",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                                    "typeString": "struct GsnEip712Library.EIP712Domain memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                                    "typeString": "struct GsnEip712Library.EIP712Domain memory"
                                                }
                                            ],
                                            "id": 8377,
                                            "name": "hashDomain",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8429,
                                            "src": "4957:10:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_struct$_EIP712Domain_$8136_memory_ptr_$returns$_t_bytes32_$",
                                                "typeString": "function (struct GsnEip712Library.EIP712Domain memory) pure returns (bytes32)"
                                            }
                                        },
                                        "id": 8385,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "4957:171:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "functionReturnParameters": 8376,
                                    "id": 8386,
                                    "nodeType": "Return",
                                    "src": "4950:178:38"
                                }
                            ]
                        },
                        "id": 8388,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "domainSeparator",
                        "nameLocation": "4853:15:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8373,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8370,
                                    "mutability": "mutable",
                                    "name": "name",
                                    "nameLocation": "4883:4:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8388,
                                    "src": "4869:18:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 8369,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4869:6:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8372,
                                    "mutability": "mutable",
                                    "name": "forwarder",
                                    "nameLocation": "4897:9:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8388,
                                    "src": "4889:17:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 8371,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4889:7:38",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4868:39:38"
                        },
                        "returnParameters": {
                            "id": 8376,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8375,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8388,
                                    "src": "4931:7:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 8374,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4931:7:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4930:9:38"
                        },
                        "scope": 8464,
                        "src": "4844:291:38",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8394,
                            "nodeType": "Block",
                            "src": "5198:113:38",
                            "statements": [
                                {
                                    "AST": {
                                        "nodeType": "YulBlock",
                                        "src": "5266:39:38",
                                        "statements": [
                                            {
                                                "nodeType": "YulAssignment",
                                                "src": "5280:15:38",
                                                "value": {
                                                    "arguments": [],
                                                    "functionName": {
                                                        "name": "chainid",
                                                        "nodeType": "YulIdentifier",
                                                        "src": "5286:7:38"
                                                    },
                                                    "nodeType": "YulFunctionCall",
                                                    "src": "5286:9:38"
                                                },
                                                "variableNames": [
                                                    {
                                                        "name": "id",
                                                        "nodeType": "YulIdentifier",
                                                        "src": "5280:2:38"
                                                    }
                                                ]
                                            }
                                        ]
                                    },
                                    "evmVersion": "london",
                                    "externalReferences": [
                                        {
                                            "declaration": 8391,
                                            "isOffset": false,
                                            "isSlot": false,
                                            "src": "5280:2:38",
                                            "valueSize": 1
                                        }
                                    ],
                                    "id": 8393,
                                    "nodeType": "InlineAssembly",
                                    "src": "5257:48:38"
                                }
                            ]
                        },
                        "id": 8395,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "getChainID",
                        "nameLocation": "5150:10:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8389,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "5160:2:38"
                        },
                        "returnParameters": {
                            "id": 8392,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8391,
                                    "mutability": "mutable",
                                    "name": "id",
                                    "nameLocation": "5194:2:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8395,
                                    "src": "5186:10:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 8390,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5186:7:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5185:12:38"
                        },
                        "scope": 8464,
                        "src": "5141:170:38",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8428,
                            "nodeType": "Block",
                            "src": "5394:244:38",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "id": 8406,
                                                        "name": "EIP712DOMAIN_TYPEHASH",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8141,
                                                        "src": "5449:21:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        }
                                                    },
                                                    {
                                                        "arguments": [
                                                            {
                                                                "arguments": [
                                                                    {
                                                                        "expression": {
                                                                            "id": 8410,
                                                                            "name": "req",
                                                                            "nodeType": "Identifier",
                                                                            "overloadedDeclarations": [],
                                                                            "referencedDeclaration": 8398,
                                                                            "src": "5504:3:38",
                                                                            "typeDescriptions": {
                                                                                "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                                                                "typeString": "struct GsnEip712Library.EIP712Domain memory"
                                                                            }
                                                                        },
                                                                        "id": 8411,
                                                                        "isConstant": false,
                                                                        "isLValue": true,
                                                                        "isPure": false,
                                                                        "lValueRequested": false,
                                                                        "memberName": "name",
                                                                        "nodeType": "MemberAccess",
                                                                        "referencedDeclaration": 8129,
                                                                        "src": "5504:8:38",
                                                                        "typeDescriptions": {
                                                                            "typeIdentifier": "t_string_memory_ptr",
                                                                            "typeString": "string memory"
                                                                        }
                                                                    }
                                                                ],
                                                                "expression": {
                                                                    "argumentTypes": [
                                                                        {
                                                                            "typeIdentifier": "t_string_memory_ptr",
                                                                            "typeString": "string memory"
                                                                        }
                                                                    ],
                                                                    "id": 8409,
                                                                    "isConstant": false,
                                                                    "isLValue": false,
                                                                    "isPure": true,
                                                                    "lValueRequested": false,
                                                                    "nodeType": "ElementaryTypeNameExpression",
                                                                    "src": "5498:5:38",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                                                        "typeString": "type(bytes storage pointer)"
                                                                    },
                                                                    "typeName": {
                                                                        "id": 8408,
                                                                        "name": "bytes",
                                                                        "nodeType": "ElementaryTypeName",
                                                                        "src": "5498:5:38",
                                                                        "typeDescriptions": {}
                                                                    }
                                                                },
                                                                "id": 8412,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "kind": "typeConversion",
                                                                "lValueRequested": false,
                                                                "names": [],
                                                                "nodeType": "FunctionCall",
                                                                "src": "5498:15:38",
                                                                "tryCall": false,
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                }
                                                            ],
                                                            "id": 8407,
                                                            "name": "keccak256",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967288,
                                                            "src": "5488:9:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                                "typeString": "function (bytes memory) pure returns (bytes32)"
                                                            }
                                                        },
                                                        "id": 8413,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "5488:26:38",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        }
                                                    },
                                                    {
                                                        "arguments": [
                                                            {
                                                                "arguments": [
                                                                    {
                                                                        "expression": {
                                                                            "id": 8417,
                                                                            "name": "req",
                                                                            "nodeType": "Identifier",
                                                                            "overloadedDeclarations": [],
                                                                            "referencedDeclaration": 8398,
                                                                            "src": "5548:3:38",
                                                                            "typeDescriptions": {
                                                                                "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                                                                "typeString": "struct GsnEip712Library.EIP712Domain memory"
                                                                            }
                                                                        },
                                                                        "id": 8418,
                                                                        "isConstant": false,
                                                                        "isLValue": true,
                                                                        "isPure": false,
                                                                        "lValueRequested": false,
                                                                        "memberName": "version",
                                                                        "nodeType": "MemberAccess",
                                                                        "referencedDeclaration": 8131,
                                                                        "src": "5548:11:38",
                                                                        "typeDescriptions": {
                                                                            "typeIdentifier": "t_string_memory_ptr",
                                                                            "typeString": "string memory"
                                                                        }
                                                                    }
                                                                ],
                                                                "expression": {
                                                                    "argumentTypes": [
                                                                        {
                                                                            "typeIdentifier": "t_string_memory_ptr",
                                                                            "typeString": "string memory"
                                                                        }
                                                                    ],
                                                                    "id": 8416,
                                                                    "isConstant": false,
                                                                    "isLValue": false,
                                                                    "isPure": true,
                                                                    "lValueRequested": false,
                                                                    "nodeType": "ElementaryTypeNameExpression",
                                                                    "src": "5542:5:38",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                                                        "typeString": "type(bytes storage pointer)"
                                                                    },
                                                                    "typeName": {
                                                                        "id": 8415,
                                                                        "name": "bytes",
                                                                        "nodeType": "ElementaryTypeName",
                                                                        "src": "5542:5:38",
                                                                        "typeDescriptions": {}
                                                                    }
                                                                },
                                                                "id": 8419,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "kind": "typeConversion",
                                                                "lValueRequested": false,
                                                                "names": [],
                                                                "nodeType": "FunctionCall",
                                                                "src": "5542:18:38",
                                                                "tryCall": false,
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                }
                                                            ],
                                                            "id": 8414,
                                                            "name": "keccak256",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967288,
                                                            "src": "5532:9:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                                "typeString": "function (bytes memory) pure returns (bytes32)"
                                                            }
                                                        },
                                                        "id": 8420,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "5532:29:38",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8421,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8398,
                                                            "src": "5579:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                                                "typeString": "struct GsnEip712Library.EIP712Domain memory"
                                                            }
                                                        },
                                                        "id": 8422,
                                                        "isConstant": false,
                                                        "isLValue": true,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "chainId",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8133,
                                                        "src": "5579:11:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8423,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8398,
                                                            "src": "5608:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                                                "typeString": "struct GsnEip712Library.EIP712Domain memory"
                                                            }
                                                        },
                                                        "id": 8424,
                                                        "isConstant": false,
                                                        "isLValue": true,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "verifyingContract",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8135,
                                                        "src": "5608:21:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "id": 8404,
                                                        "name": "abi",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967295,
                                                        "src": "5421:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_abi",
                                                            "typeString": "abi"
                                                        }
                                                    },
                                                    "id": 8405,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "memberName": "encode",
                                                    "nodeType": "MemberAccess",
                                                    "src": "5421:10:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                                        "typeString": "function () pure returns (bytes memory)"
                                                    }
                                                },
                                                "id": 8425,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "5421:209:38",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "id": 8403,
                                            "name": "keccak256",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4294967288,
                                            "src": "5411:9:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                "typeString": "function (bytes memory) pure returns (bytes32)"
                                            }
                                        },
                                        "id": 8426,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5411:220:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "functionReturnParameters": 8402,
                                    "id": 8427,
                                    "nodeType": "Return",
                                    "src": "5404:227:38"
                                }
                            ]
                        },
                        "id": 8429,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "hashDomain",
                        "nameLocation": "5326:10:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8399,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8398,
                                    "mutability": "mutable",
                                    "name": "req",
                                    "nameLocation": "5357:3:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8429,
                                    "src": "5337:23:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                        "typeString": "struct GsnEip712Library.EIP712Domain"
                                    },
                                    "typeName": {
                                        "id": 8397,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8396,
                                            "name": "EIP712Domain",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8136,
                                            "src": "5337:12:38"
                                        },
                                        "referencedDeclaration": 8136,
                                        "src": "5337:12:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_EIP712Domain_$8136_storage_ptr",
                                            "typeString": "struct GsnEip712Library.EIP712Domain"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5336:25:38"
                        },
                        "returnParameters": {
                            "id": 8402,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8401,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8429,
                                    "src": "5385:7:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 8400,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5385:7:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5384:9:38"
                        },
                        "scope": 8464,
                        "src": "5317:321:38",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8462,
                            "nodeType": "Block",
                            "src": "5732:390:38",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "id": 8440,
                                                        "name": "RELAYDATA_TYPEHASH",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8122,
                                                        "src": "5787:18:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8441,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "5823:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8442,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "maxFeePerGas",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8469,
                                                        "src": "5823:16:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8443,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "5857:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8444,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "maxPriorityFeePerGas",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8471,
                                                        "src": "5857:24:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8445,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "5899:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8446,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "transactionCalldataGasUsed",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8473,
                                                        "src": "5899:30:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8447,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "5947:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8448,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "relayWorker",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8475,
                                                        "src": "5947:15:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8449,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "5980:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8450,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "paymaster",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8477,
                                                        "src": "5980:13:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8451,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "6011:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8452,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "forwarder",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8479,
                                                        "src": "6011:13:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    {
                                                        "arguments": [
                                                            {
                                                                "expression": {
                                                                    "id": 8454,
                                                                    "name": "req",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 8432,
                                                                    "src": "6052:3:38",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                        "typeString": "struct GsnTypes.RelayData calldata"
                                                                    }
                                                                },
                                                                "id": 8455,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "lValueRequested": false,
                                                                "memberName": "paymasterData",
                                                                "nodeType": "MemberAccess",
                                                                "referencedDeclaration": 8481,
                                                                "src": "6052:17:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                                    "typeString": "bytes calldata"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                                    "typeString": "bytes calldata"
                                                                }
                                                            ],
                                                            "id": 8453,
                                                            "name": "keccak256",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967288,
                                                            "src": "6042:9:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                                "typeString": "function (bytes memory) pure returns (bytes32)"
                                                            }
                                                        },
                                                        "id": 8456,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "6042:28:38",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8457,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "6088:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8458,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "clientId",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8483,
                                                        "src": "6088:12:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        },
                                                        {
                                                            "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"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "id": 8438,
                                                        "name": "abi",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967295,
                                                        "src": "5759:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_abi",
                                                            "typeString": "abi"
                                                        }
                                                    },
                                                    "id": 8439,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "memberName": "encode",
                                                    "nodeType": "MemberAccess",
                                                    "src": "5759:10:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                                        "typeString": "function () pure returns (bytes memory)"
                                                    }
                                                },
                                                "id": 8459,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "5759:355:38",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "id": 8437,
                                            "name": "keccak256",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4294967288,
                                            "src": "5749:9:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                "typeString": "function (bytes memory) pure returns (bytes32)"
                                            }
                                        },
                                        "id": 8460,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5749:366:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "functionReturnParameters": 8436,
                                    "id": 8461,
                                    "nodeType": "Return",
                                    "src": "5742:373:38"
                                }
                            ]
                        },
                        "id": 8463,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "hashRelayData",
                        "nameLocation": "5653:13:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8433,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8432,
                                    "mutability": "mutable",
                                    "name": "req",
                                    "nameLocation": "5695:3:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8463,
                                    "src": "5667:31:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayData"
                                    },
                                    "typeName": {
                                        "id": 8431,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8430,
                                            "name": "GsnTypes.RelayData",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8484,
                                            "src": "5667:18:38"
                                        },
                                        "referencedDeclaration": 8484,
                                        "src": "5667:18:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayData_$8484_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayData"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5666:33:38"
                        },
                        "returnParameters": {
                            "id": 8436,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8435,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8463,
                                    "src": "5723:7:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 8434,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5723:7:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5722:9:38"
                        },
                        "scope": 8464,
                        "src": "5644:478:38",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "internal"
                    }
                ],
                "scope": 8465,
                "src": "381:5743:38",
                "usedErrors": []
            }
        ],
        "src": "0:6124:38"
    },
    "legacyAST": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnEip712Library.sol",
        "exportedSymbols": {
            "GsnEip712Library": [
                8464
            ],
            "GsnTypes": [
                8492
            ],
            "GsnUtils": [
                8572
            ],
            "IERC165": [
                12352
            ],
            "IERC2771Recipient": [
                5374
            ],
            "IForwarder": [
                5129
            ],
            "MinLibBytes": [
                8687
            ]
        },
        "id": 8465,
        "license": "GPL-3.0-only",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 8079,
                "literals": [
                    "solidity",
                    "^",
                    "0.8",
                    ".0"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:23:38"
            },
            {
                "id": 8080,
                "literals": [
                    "abicoder",
                    "v2"
                ],
                "nodeType": "PragmaDirective",
                "src": "24:19:38"
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnTypes.sol",
                "file": "../utils/GsnTypes.sol",
                "id": 8081,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8465,
                "sourceUnit": 8493,
                "src": "87:31:38",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/interfaces/IERC2771Recipient.sol",
                "file": "../interfaces/IERC2771Recipient.sol",
                "id": 8082,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8465,
                "sourceUnit": 5375,
                "src": "119:45:38",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/forwarder/IForwarder.sol",
                "file": "../forwarder/IForwarder.sol",
                "id": 8083,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8465,
                "sourceUnit": 5130,
                "src": "165:37:38",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnUtils.sol",
                "file": "./GsnUtils.sol",
                "id": 8084,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8465,
                "sourceUnit": 8573,
                "src": "204:24:38",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": false,
                "baseContracts": [],
                "contractDependencies": [],
                "contractKind": "library",
                "documentation": {
                    "id": 8085,
                    "nodeType": "StructuredDocumentation",
                    "src": "230:150:38",
                    "text": " @title The ERC-712 Library for GSN\n @notice Bridge Library to convert a GSN RelayRequest into a valid `ForwardRequest` for a `Forwarder`."
                },
                "fullyImplemented": true,
                "id": 8464,
                "linearizedBaseContracts": [
                    8464
                ],
                "name": "GsnEip712Library",
                "nameLocation": "389:16:38",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "constant": true,
                        "id": 8088,
                        "mutability": "constant",
                        "name": "MAX_RETURN_SIZE",
                        "nameLocation": "545:15:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "520:47:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                        },
                        "typeName": {
                            "id": 8086,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "520:7:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "value": {
                            "hexValue": "31303234",
                            "id": 8087,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "563:4:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_rational_1024_by_1",
                                "typeString": "int_const 1024"
                            },
                            "value": "1024"
                        },
                        "visibility": "private"
                    },
                    {
                        "constant": true,
                        "functionSelector": "066a310c",
                        "id": 8091,
                        "mutability": "constant",
                        "name": "GENERIC_PARAMS",
                        "nameLocation": "686:14:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "663:139:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string"
                        },
                        "typeName": {
                            "id": 8089,
                            "name": "string",
                            "nodeType": "ElementaryTypeName",
                            "src": "663:6:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_string_storage_ptr",
                                "typeString": "string"
                            }
                        },
                        "value": {
                            "hexValue": "616464726573732066726f6d2c6164647265737320746f2c75696e743235362076616c75652c75696e74323536206761732c75696e74323536206e6f6e63652c627974657320646174612c75696e743235362076616c6964556e74696c54696d65",
                            "id": 8090,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "703:99:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_33f12fe95872be7be9c474c0e99a56a1b0cad386a14d26df2bb11622e5368f9b",
                                "typeString": "literal_string \"address from,address to,uint256 value,uint256 gas,uint256 nonce,bytes data,uint256 validUntilTime\""
                            },
                            "value": "address from,address to,uint256 value,uint256 gas,uint256 nonce,bytes data,uint256 validUntilTime"
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "c46cf83f",
                        "id": 8094,
                        "mutability": "constant",
                        "name": "RELAYDATA_TYPE",
                        "nameLocation": "831:14:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "809:229:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes"
                        },
                        "typeName": {
                            "id": 8092,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "809:5:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                            }
                        },
                        "value": {
                            "hexValue": "52656c6179446174612875696e74323536206d61784665655065724761732c75696e74323536206d61785072696f726974794665655065724761732c75696e74323536207472616e73616374696f6e43616c6c64617461476173557365642c616464726573732072656c6179576f726b65722c61646472657373207061796d61737465722c6164647265737320666f727761726465722c6279746573207061796d6173746572446174612c75696e7432353620636c69656e74496429",
                            "id": 8093,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "848:190:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c5ea90dda9219120f9d08877180c718e673bc3e452715c45f7d7c9bd6548dacf",
                                "typeString": "literal_string \"RelayData(uint256 maxFeePerGas,uint256 maxPriorityFeePerGas,uint256 transactionCalldataGasUsed,address relayWorker,address paymaster,address forwarder,bytes paymasterData,uint256 clientId)\""
                            },
                            "value": "RelayData(uint256 maxFeePerGas,uint256 maxPriorityFeePerGas,uint256 transactionCalldataGasUsed,address relayWorker,address paymaster,address forwarder,bytes paymasterData,uint256 clientId)"
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "987673f7",
                        "id": 8097,
                        "mutability": "constant",
                        "name": "RELAY_REQUEST_NAME",
                        "nameLocation": "1068:18:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "1045:58:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string"
                        },
                        "typeName": {
                            "id": 8095,
                            "name": "string",
                            "nodeType": "ElementaryTypeName",
                            "src": "1045:6:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_string_storage_ptr",
                                "typeString": "string"
                            }
                        },
                        "value": {
                            "hexValue": "52656c617952657175657374",
                            "id": 8096,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1089:14:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9474f9de570f8c3456d0ad4af045975f85d14cb683a1e7b73535cecf52ff41f8",
                                "typeString": "literal_string \"RelayRequest\""
                            },
                            "value": "RelayRequest"
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "931cd38f",
                        "id": 8107,
                        "mutability": "constant",
                        "name": "RELAY_REQUEST_SUFFIX",
                        "nameLocation": "1132:20:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "1109:110:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string"
                        },
                        "typeName": {
                            "id": 8098,
                            "name": "string",
                            "nodeType": "ElementaryTypeName",
                            "src": "1109:6:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_string_storage_ptr",
                                "typeString": "string"
                            }
                        },
                        "value": {
                            "arguments": [
                                {
                                    "arguments": [
                                        {
                                            "hexValue": "52656c6179446174612072656c61794461746129",
                                            "id": 8103,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "string",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "1179:22:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_stringliteral_3fadbea26dd302bcc6197cc8afc00cbc86899723a86835ca1f1216f26949bb7f",
                                                "typeString": "literal_string \"RelayData relayData)\""
                                            },
                                            "value": "RelayData relayData)"
                                        },
                                        {
                                            "id": 8104,
                                            "name": "RELAYDATA_TYPE",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8094,
                                            "src": "1203:14:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                            }
                                        }
                                    ],
                                    "expression": {
                                        "argumentTypes": [
                                            {
                                                "typeIdentifier": "t_stringliteral_3fadbea26dd302bcc6197cc8afc00cbc86899723a86835ca1f1216f26949bb7f",
                                                "typeString": "literal_string \"RelayData relayData)\""
                                            },
                                            {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                            }
                                        ],
                                        "expression": {
                                            "id": 8101,
                                            "name": "abi",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4294967295,
                                            "src": "1162:3:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_magic_abi",
                                                "typeString": "abi"
                                            }
                                        },
                                        "id": 8102,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "memberName": "encodePacked",
                                        "nodeType": "MemberAccess",
                                        "src": "1162:16:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                            "typeString": "function () pure returns (bytes memory)"
                                        }
                                    },
                                    "id": 8105,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "1162:56:38",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                    }
                                }
                            ],
                            "expression": {
                                "argumentTypes": [
                                    {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                    }
                                ],
                                "id": 8100,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1155:6:38",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                    "typeString": "type(string storage pointer)"
                                },
                                "typeName": {
                                    "id": 8099,
                                    "name": "string",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1155:6:38",
                                    "typeDescriptions": {}
                                }
                            },
                            "id": 8106,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1155:64:38",
                            "tryCall": false,
                            "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "6225e61b",
                        "id": 8117,
                        "mutability": "constant",
                        "name": "RELAY_REQUEST_TYPE",
                        "nameLocation": "1248:18:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "1226:133:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes"
                        },
                        "typeName": {
                            "id": 8108,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "1226:5:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                            }
                        },
                        "value": {
                            "arguments": [
                                {
                                    "id": 8111,
                                    "name": "RELAY_REQUEST_NAME",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8097,
                                    "src": "1295:18:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                    }
                                },
                                {
                                    "hexValue": "28",
                                    "id": 8112,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1314:3:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_stringliteral_484bf06f3118ce360605f902ef526c45207bc469c2b056352f14b8408f9f6f9a",
                                        "typeString": "literal_string \"(\""
                                    },
                                    "value": "("
                                },
                                {
                                    "id": 8113,
                                    "name": "GENERIC_PARAMS",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8091,
                                    "src": "1318:14:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                    }
                                },
                                {
                                    "hexValue": "2c",
                                    "id": 8114,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1333:3:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_stringliteral_3e7a35b97029f9e0cf6effd71c1a7958822e9a217d3a3aec886668a7dd8231cb",
                                        "typeString": "literal_string \",\""
                                    },
                                    "value": ","
                                },
                                {
                                    "id": 8115,
                                    "name": "RELAY_REQUEST_SUFFIX",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8107,
                                    "src": "1338:20:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                    }
                                }
                            ],
                            "expression": {
                                "argumentTypes": [
                                    {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                    },
                                    {
                                        "typeIdentifier": "t_stringliteral_484bf06f3118ce360605f902ef526c45207bc469c2b056352f14b8408f9f6f9a",
                                        "typeString": "literal_string \"(\""
                                    },
                                    {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                    },
                                    {
                                        "typeIdentifier": "t_stringliteral_3e7a35b97029f9e0cf6effd71c1a7958822e9a217d3a3aec886668a7dd8231cb",
                                        "typeString": "literal_string \",\""
                                    },
                                    {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string memory"
                                    }
                                ],
                                "expression": {
                                    "id": 8109,
                                    "name": "abi",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4294967295,
                                    "src": "1269:3:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_magic_abi",
                                        "typeString": "abi"
                                    }
                                },
                                "id": 8110,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodePacked",
                                "nodeType": "MemberAccess",
                                "src": "1269:16:38",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                    "typeString": "function () pure returns (bytes memory)"
                                }
                            },
                            "id": 8116,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1269:90:38",
                            "tryCall": false,
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "cc0c62b2",
                        "id": 8122,
                        "mutability": "constant",
                        "name": "RELAYDATA_TYPEHASH",
                        "nameLocation": "1390:18:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "1366:70:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                        },
                        "typeName": {
                            "id": 8118,
                            "name": "bytes32",
                            "nodeType": "ElementaryTypeName",
                            "src": "1366:7:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        },
                        "value": {
                            "arguments": [
                                {
                                    "id": 8120,
                                    "name": "RELAYDATA_TYPE",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8094,
                                    "src": "1421:14:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                    }
                                }
                            ],
                            "expression": {
                                "argumentTypes": [
                                    {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                    }
                                ],
                                "id": 8119,
                                "name": "keccak256",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4294967288,
                                "src": "1411:9:38",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                    "typeString": "function (bytes memory) pure returns (bytes32)"
                                }
                            },
                            "id": 8121,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1411:25:38",
                            "tryCall": false,
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "abf0d3f4",
                        "id": 8127,
                        "mutability": "constant",
                        "name": "RELAY_REQUEST_TYPEHASH",
                        "nameLocation": "1466:22:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "1442:78:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                        },
                        "typeName": {
                            "id": 8123,
                            "name": "bytes32",
                            "nodeType": "ElementaryTypeName",
                            "src": "1442:7:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        },
                        "value": {
                            "arguments": [
                                {
                                    "id": 8125,
                                    "name": "RELAY_REQUEST_TYPE",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8117,
                                    "src": "1501:18:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                    }
                                }
                            ],
                            "expression": {
                                "argumentTypes": [
                                    {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                    }
                                ],
                                "id": 8124,
                                "name": "keccak256",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4294967288,
                                "src": "1491:9:38",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                    "typeString": "function (bytes memory) pure returns (bytes32)"
                                }
                            },
                            "id": 8126,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1491:29:38",
                            "tryCall": false,
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "canonicalName": "GsnEip712Library.EIP712Domain",
                        "id": 8136,
                        "members": [
                            {
                                "constant": false,
                                "id": 8129,
                                "mutability": "mutable",
                                "name": "name",
                                "nameLocation": "1564:4:38",
                                "nodeType": "VariableDeclaration",
                                "scope": 8136,
                                "src": "1557:11:38",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_string_storage_ptr",
                                    "typeString": "string"
                                },
                                "typeName": {
                                    "id": 8128,
                                    "name": "string",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1557:6:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_storage_ptr",
                                        "typeString": "string"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 8131,
                                "mutability": "mutable",
                                "name": "version",
                                "nameLocation": "1585:7:38",
                                "nodeType": "VariableDeclaration",
                                "scope": 8136,
                                "src": "1578:14:38",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_string_storage_ptr",
                                    "typeString": "string"
                                },
                                "typeName": {
                                    "id": 8130,
                                    "name": "string",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1578:6:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_storage_ptr",
                                        "typeString": "string"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 8133,
                                "mutability": "mutable",
                                "name": "chainId",
                                "nameLocation": "1610:7:38",
                                "nodeType": "VariableDeclaration",
                                "scope": 8136,
                                "src": "1602:15:38",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                },
                                "typeName": {
                                    "id": 8132,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1602:7:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 8135,
                                "mutability": "mutable",
                                "name": "verifyingContract",
                                "nameLocation": "1635:17:38",
                                "nodeType": "VariableDeclaration",
                                "scope": 8136,
                                "src": "1627:25:38",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                },
                                "typeName": {
                                    "id": 8134,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1627:7:38",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    }
                                },
                                "visibility": "internal"
                            }
                        ],
                        "name": "EIP712Domain",
                        "nameLocation": "1534:12:38",
                        "nodeType": "StructDefinition",
                        "scope": 8464,
                        "src": "1527:132:38",
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "c49f91d3",
                        "id": 8141,
                        "mutability": "constant",
                        "name": "EIP712DOMAIN_TYPEHASH",
                        "nameLocation": "1689:21:38",
                        "nodeType": "VariableDeclaration",
                        "scope": 8464,
                        "src": "1665:157:38",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                        },
                        "typeName": {
                            "id": 8137,
                            "name": "bytes32",
                            "nodeType": "ElementaryTypeName",
                            "src": "1665:7:38",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        },
                        "value": {
                            "arguments": [
                                {
                                    "hexValue": "454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429",
                                    "id": 8139,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1732:84:38",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
                                        "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""
                                    },
                                    "value": "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
                                }
                            ],
                            "expression": {
                                "argumentTypes": [
                                    {
                                        "typeIdentifier": "t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
                                        "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""
                                    }
                                ],
                                "id": 8138,
                                "name": "keccak256",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4294967288,
                                "src": "1713:9:38",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                    "typeString": "function (bytes memory) pure returns (bytes32)"
                                }
                            },
                            "id": 8140,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1713:109:38",
                            "tryCall": false,
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 8159,
                            "nodeType": "Block",
                            "src": "1975:83:38",
                            "statements": [
                                {
                                    "expression": {
                                        "id": 8157,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "id": 8149,
                                            "name": "suffixData",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8147,
                                            "src": "1985:10:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "arguments": [
                                                {
                                                    "arguments": [
                                                        {
                                                            "expression": {
                                                                "id": 8153,
                                                                "name": "req",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8144,
                                                                "src": "2036:3:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                                }
                                                            },
                                                            "id": 8154,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "memberName": "relayData",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": 8490,
                                                            "src": "2036:13:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        ],
                                                        "id": 8152,
                                                        "name": "hashRelayData",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8463,
                                                        "src": "2022:13:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_function_internal_pure$_t_struct$_RelayData_$8484_calldata_ptr_$returns$_t_bytes32_$",
                                                            "typeString": "function (struct GsnTypes.RelayData calldata) pure returns (bytes32)"
                                                        }
                                                    },
                                                    "id": 8155,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "2022:28:38",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes32",
                                                        "typeString": "bytes32"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_bytes32",
                                                        "typeString": "bytes32"
                                                    }
                                                ],
                                                "expression": {
                                                    "id": 8150,
                                                    "name": "abi",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 4294967295,
                                                    "src": "1998:3:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_magic_abi",
                                                        "typeString": "abi"
                                                    }
                                                },
                                                "id": 8151,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "memberName": "encode",
                                                "nodeType": "MemberAccess",
                                                "src": "1998:10:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                                    "typeString": "function () pure returns (bytes memory)"
                                                }
                                            },
                                            "id": 8156,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "1998:53:38",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                            }
                                        },
                                        "src": "1985:66:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                        }
                                    },
                                    "id": 8158,
                                    "nodeType": "ExpressionStatement",
                                    "src": "1985:66:38"
                                }
                            ]
                        },
                        "id": 8160,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "splitRequest",
                        "nameLocation": "1838:12:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8145,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8144,
                                    "mutability": "mutable",
                                    "name": "req",
                                    "nameLocation": "1891:3:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8160,
                                    "src": "1860:34:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 8143,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8142,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "1860:21:38"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "1860:21:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1850:50:38"
                        },
                        "returnParameters": {
                            "id": 8148,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8147,
                                    "mutability": "mutable",
                                    "name": "suffixData",
                                    "nameLocation": "1958:10:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8160,
                                    "src": "1945:23:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 8146,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1945:5:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1935:39:38"
                        },
                        "scope": 8464,
                        "src": "1829:229:38",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8209,
                            "nodeType": "Block",
                            "src": "2249:449:38",
                            "statements": [
                                {
                                    "assignments": [
                                        8167,
                                        8169
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 8167,
                                            "mutability": "mutable",
                                            "name": "success",
                                            "nameLocation": "2265:7:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8209,
                                            "src": "2260:12:38",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            },
                                            "typeName": {
                                                "id": 8166,
                                                "name": "bool",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "2260:4:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            "visibility": "internal"
                                        },
                                        {
                                            "constant": false,
                                            "id": 8169,
                                            "mutability": "mutable",
                                            "name": "ret",
                                            "nameLocation": "2287:3:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8209,
                                            "src": "2274:16:38",
                                            "stateVariable": false,
                                            "storageLocation": "memory",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes"
                                            },
                                            "typeName": {
                                                "id": 8168,
                                                "name": "bytes",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "2274:5:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_storage_ptr",
                                                    "typeString": "bytes"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 8184,
                                    "initialValue": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "expression": {
                                                            "expression": {
                                                                "id": 8176,
                                                                "name": "IERC2771Recipient",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 5374,
                                                                "src": "2382:17:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_type$_t_contract$_IERC2771Recipient_$5374_$",
                                                                    "typeString": "type(contract IERC2771Recipient)"
                                                                }
                                                            },
                                                            "id": 8177,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "memberName": "isTrustedForwarder",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": 5361,
                                                            "src": "2382:36:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_declaration_view$_t_address_$returns$_t_bool_$",
                                                                "typeString": "function IERC2771Recipient.isTrustedForwarder(address) view returns (bool)"
                                                            }
                                                        },
                                                        "id": 8178,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "memberName": "selector",
                                                        "nodeType": "MemberAccess",
                                                        "src": "2382:45:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes4",
                                                            "typeString": "bytes4"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "expression": {
                                                                "id": 8179,
                                                                "name": "relayRequest",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8163,
                                                                "src": "2429:12:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                                }
                                                            },
                                                            "id": 8180,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "memberName": "relayData",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": 8490,
                                                            "src": "2429:22:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8181,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "forwarder",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8479,
                                                        "src": "2429:32:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_bytes4",
                                                            "typeString": "bytes4"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "id": 8174,
                                                        "name": "abi",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967295,
                                                        "src": "2342:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_abi",
                                                            "typeString": "abi"
                                                        }
                                                    },
                                                    "id": 8175,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "memberName": "encodeWithSelector",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2342:22:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                                        "typeString": "function (bytes4) pure returns (bytes memory)"
                                                    }
                                                },
                                                "id": 8182,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "2342:133:38",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "expression": {
                                                "expression": {
                                                    "expression": {
                                                        "id": 8170,
                                                        "name": "relayRequest",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8163,
                                                        "src": "2294:12:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                            "typeString": "struct GsnTypes.RelayRequest calldata"
                                                        }
                                                    },
                                                    "id": 8171,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "request",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 8487,
                                                    "src": "2294:20:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                        "typeString": "struct IForwarder.ForwardRequest calldata"
                                                    }
                                                },
                                                "id": 8172,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "to",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 5047,
                                                "src": "2294:23:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            },
                                            "id": 8173,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "staticcall",
                                            "nodeType": "MemberAccess",
                                            "src": "2294:34:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                                "typeString": "function (bytes memory) view returns (bool,bytes memory)"
                                            }
                                        },
                                        "id": 8183,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2294:191:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                            "typeString": "tuple(bool,bytes memory)"
                                        }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "2259:226:38"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 8186,
                                                "name": "success",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8167,
                                                "src": "2503:7:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "697354727573746564466f727761726465723a207265766572746564",
                                                "id": 8187,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2512:30:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_29871498aacc097c93f180e11ad1fc7bbe7fd0af33ce4f55cda39c1be559cc5e",
                                                    "typeString": "literal_string \"isTrustedForwarder: reverted\""
                                                },
                                                "value": "isTrustedForwarder: reverted"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_29871498aacc097c93f180e11ad1fc7bbe7fd0af33ce4f55cda39c1be559cc5e",
                                                    "typeString": "literal_string \"isTrustedForwarder: reverted\""
                                                }
                                            ],
                                            "id": 8185,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "2495:7:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 8188,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2495:48:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8189,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2495:48:38"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                "id": 8194,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "expression": {
                                                        "id": 8191,
                                                        "name": "ret",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8169,
                                                        "src": "2561:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes_memory_ptr",
                                                            "typeString": "bytes memory"
                                                        }
                                                    },
                                                    "id": 8192,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "length",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2561:10:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "hexValue": "3332",
                                                    "id": 8193,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "number",
                                                    "lValueRequested": false,
                                                    "nodeType": "Literal",
                                                    "src": "2575:2:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_rational_32_by_1",
                                                        "typeString": "int_const 32"
                                                    },
                                                    "value": "32"
                                                },
                                                "src": "2561:16:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "697354727573746564466f727761726465723a2062616420726573706f6e7365",
                                                "id": 8195,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2579:34:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_8de434f38be4084093951d99ef6ad881eb532d2fda93e085bee354124c9fe325",
                                                    "typeString": "literal_string \"isTrustedForwarder: bad response\""
                                                },
                                                "value": "isTrustedForwarder: bad response"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_8de434f38be4084093951d99ef6ad881eb532d2fda93e085bee354124c9fe325",
                                                    "typeString": "literal_string \"isTrustedForwarder: bad response\""
                                                }
                                            ],
                                            "id": 8190,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "2553:7:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 8196,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2553:61:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8197,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2553:61:38"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "id": 8201,
                                                        "name": "ret",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8169,
                                                        "src": "2643:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes_memory_ptr",
                                                            "typeString": "bytes memory"
                                                        }
                                                    },
                                                    {
                                                        "components": [
                                                            {
                                                                "id": 8203,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": true,
                                                                "lValueRequested": false,
                                                                "nodeType": "ElementaryTypeNameExpression",
                                                                "src": "2649:4:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_type$_t_bool_$",
                                                                    "typeString": "type(bool)"
                                                                },
                                                                "typeName": {
                                                                    "id": 8202,
                                                                    "name": "bool",
                                                                    "nodeType": "ElementaryTypeName",
                                                                    "src": "2649:4:38",
                                                                    "typeDescriptions": {}
                                                                }
                                                            }
                                                        ],
                                                        "id": 8204,
                                                        "isConstant": false,
                                                        "isInlineArray": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "TupleExpression",
                                                        "src": "2648:6:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_bool_$",
                                                            "typeString": "type(bool)"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_bytes_memory_ptr",
                                                            "typeString": "bytes memory"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_type$_t_bool_$",
                                                            "typeString": "type(bool)"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "id": 8199,
                                                        "name": "abi",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967295,
                                                        "src": "2632:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_abi",
                                                            "typeString": "abi"
                                                        }
                                                    },
                                                    "id": 8200,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "memberName": "decode",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2632:10:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                        "typeString": "function () pure"
                                                    }
                                                },
                                                "id": 8205,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "2632:23:38",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "696e76616c696420666f7277617264657220666f7220726563697069656e74",
                                                "id": 8206,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2657:33:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_18a22d77ec00a6a6e3ef02db4f7f7b9054ded7d3fa47898d59b46e9844b2acb4",
                                                    "typeString": "literal_string \"invalid forwarder for recipient\""
                                                },
                                                "value": "invalid forwarder for recipient"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_18a22d77ec00a6a6e3ef02db4f7f7b9054ded7d3fa47898d59b46e9844b2acb4",
                                                    "typeString": "literal_string \"invalid forwarder for recipient\""
                                                }
                                            ],
                                            "id": 8198,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "2624:7:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 8207,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2624:67:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8208,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2624:67:38"
                                }
                            ]
                        },
                        "id": 8210,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "verifyForwarderTrusted",
                        "nameLocation": "2167:22:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8164,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8163,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "2221:12:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8210,
                                    "src": "2190:43:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 8162,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8161,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "2190:21:38"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "2190:21:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2189:45:38"
                        },
                        "returnParameters": {
                            "id": 8165,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2249:0:38"
                        },
                        "scope": 8464,
                        "src": "2158:540:38",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8258,
                            "nodeType": "Block",
                            "src": "2879:377:38",
                            "statements": [
                                {
                                    "assignments": [
                                        8221
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 8221,
                                            "mutability": "mutable",
                                            "name": "suffixData",
                                            "nameLocation": "2903:10:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8258,
                                            "src": "2890:23:38",
                                            "stateVariable": false,
                                            "storageLocation": "memory",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes"
                                            },
                                            "typeName": {
                                                "id": 8220,
                                                "name": "bytes",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "2890:5:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_storage_ptr",
                                                    "typeString": "bytes"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 8225,
                                    "initialValue": {
                                        "arguments": [
                                            {
                                                "id": 8223,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8215,
                                                "src": "2930:12:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            ],
                                            "id": 8222,
                                            "name": "splitRequest",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8160,
                                            "src": "2917:12:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$_t_bytes_memory_ptr_$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) pure returns (bytes memory)"
                                            }
                                        },
                                        "id": 8224,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2917:26:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                        }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "2889:54:38"
                                },
                                {
                                    "assignments": [
                                        8227
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 8227,
                                            "mutability": "mutable",
                                            "name": "_domainSeparator",
                                            "nameLocation": "2961:16:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8258,
                                            "src": "2953:24:38",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes32",
                                                "typeString": "bytes32"
                                            },
                                            "typeName": {
                                                "id": 8226,
                                                "name": "bytes32",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "2953:7:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 8234,
                                    "initialValue": {
                                        "arguments": [
                                            {
                                                "id": 8229,
                                                "name": "domainSeparatorName",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8212,
                                                "src": "2996:19:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                }
                                            },
                                            {
                                                "expression": {
                                                    "expression": {
                                                        "id": 8230,
                                                        "name": "relayRequest",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8215,
                                                        "src": "3017:12:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                            "typeString": "struct GsnTypes.RelayRequest calldata"
                                                        }
                                                    },
                                                    "id": 8231,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "relayData",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 8490,
                                                    "src": "3017:22:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayData calldata"
                                                    }
                                                },
                                                "id": 8232,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "forwarder",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 8479,
                                                "src": "3017:32:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                },
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            ],
                                            "id": 8228,
                                            "name": "domainSeparator",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8388,
                                            "src": "2980:15:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$_t_address_$returns$_t_bytes32_$",
                                                "typeString": "function (string memory,address) view returns (bytes32)"
                                            }
                                        },
                                        "id": 8233,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2980:70:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "2953:97:38"
                                },
                                {
                                    "assignments": [
                                        8237
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 8237,
                                            "mutability": "mutable",
                                            "name": "forwarder",
                                            "nameLocation": "3071:9:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8258,
                                            "src": "3060:20:38",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IForwarder_$5129",
                                                "typeString": "contract IForwarder"
                                            },
                                            "typeName": {
                                                "id": 8236,
                                                "nodeType": "UserDefinedTypeName",
                                                "pathNode": {
                                                    "id": 8235,
                                                    "name": "IForwarder",
                                                    "nodeType": "IdentifierPath",
                                                    "referencedDeclaration": 5129,
                                                    "src": "3060:10:38"
                                                },
                                                "referencedDeclaration": 5129,
                                                "src": "3060:10:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_IForwarder_$5129",
                                                    "typeString": "contract IForwarder"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 8246,
                                    "initialValue": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "expression": {
                                                            "expression": {
                                                                "id": 8241,
                                                                "name": "relayRequest",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8215,
                                                                "src": "3102:12:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                                }
                                                            },
                                                            "id": 8242,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "memberName": "relayData",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": 8490,
                                                            "src": "3102:22:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8243,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "forwarder",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8479,
                                                        "src": "3102:32:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    ],
                                                    "id": 8240,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "nodeType": "ElementaryTypeNameExpression",
                                                    "src": "3094:8:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_address_payable_$",
                                                        "typeString": "type(address payable)"
                                                    },
                                                    "typeName": {
                                                        "id": 8239,
                                                        "name": "address",
                                                        "nodeType": "ElementaryTypeName",
                                                        "src": "3094:8:38",
                                                        "stateMutability": "payable",
                                                        "typeDescriptions": {}
                                                    }
                                                },
                                                "id": 8244,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "typeConversion",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "3094:41:38",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address_payable",
                                                    "typeString": "address payable"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_address_payable",
                                                    "typeString": "address payable"
                                                }
                                            ],
                                            "id": 8238,
                                            "name": "IForwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 5129,
                                            "src": "3083:10:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_contract$_IForwarder_$5129_$",
                                                "typeString": "type(contract IForwarder)"
                                            }
                                        },
                                        "id": 8245,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3083:53:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IForwarder_$5129",
                                            "typeString": "contract IForwarder"
                                        }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "3060:76:38"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "expression": {
                                                    "id": 8250,
                                                    "name": "relayRequest",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8215,
                                                    "src": "3163:12:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayRequest calldata"
                                                    }
                                                },
                                                "id": 8251,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "request",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 8487,
                                                "src": "3163:20:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                    "typeString": "struct IForwarder.ForwardRequest calldata"
                                                }
                                            },
                                            {
                                                "id": 8252,
                                                "name": "_domainSeparator",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8227,
                                                "src": "3185:16:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                }
                                            },
                                            {
                                                "id": 8253,
                                                "name": "RELAY_REQUEST_TYPEHASH",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8127,
                                                "src": "3203:22:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                }
                                            },
                                            {
                                                "id": 8254,
                                                "name": "suffixData",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8221,
                                                "src": "3227:10:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            },
                                            {
                                                "id": 8255,
                                                "name": "signature",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8217,
                                                "src": "3239:9:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                    "typeString": "struct IForwarder.ForwardRequest calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            ],
                                            "expression": {
                                                "id": 8247,
                                                "name": "forwarder",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8237,
                                                "src": "3146:9:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_IForwarder_$5129",
                                                    "typeString": "contract IForwarder"
                                                }
                                            },
                                            "id": 8249,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "verify",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 5093,
                                            "src": "3146:16:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_external_view$_t_struct$_ForwardRequest_$5058_memory_ptr_$_t_bytes32_$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$returns$__$",
                                                "typeString": "function (struct IForwarder.ForwardRequest memory,bytes32,bytes32,bytes memory,bytes memory) view external"
                                            }
                                        },
                                        "id": 8256,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3146:103:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8257,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3146:103:38"
                                }
                            ]
                        },
                        "id": 8259,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "verifySignature",
                        "nameLocation": "2713:15:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8218,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8212,
                                    "mutability": "mutable",
                                    "name": "domainSeparatorName",
                                    "nameLocation": "2752:19:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8259,
                                    "src": "2738:33:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 8211,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2738:6:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8215,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "2812:12:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8259,
                                    "src": "2781:43:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 8214,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8213,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "2781:21:38"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "2781:21:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8217,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "2849:9:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8259,
                                    "src": "2834:24:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 8216,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2834:5:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2728:136:38"
                        },
                        "returnParameters": {
                            "id": 8219,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2879:0:38"
                        },
                        "scope": 8464,
                        "src": "2704:552:38",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8279,
                            "nodeType": "Block",
                            "src": "3428:124:38",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 8270,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8264,
                                                "src": "3461:12:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            ],
                                            "id": 8269,
                                            "name": "verifyForwarderTrusted",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8210,
                                            "src": "3438:22:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$__$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) view"
                                            }
                                        },
                                        "id": 8271,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3438:36:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8272,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3438:36:38"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 8274,
                                                "name": "domainSeparatorName",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8261,
                                                "src": "3500:19:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                }
                                            },
                                            {
                                                "id": 8275,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8264,
                                                "src": "3521:12:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            },
                                            {
                                                "id": 8276,
                                                "name": "signature",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8266,
                                                "src": "3535:9:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                },
                                                {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            ],
                                            "id": 8273,
                                            "name": "verifySignature",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8259,
                                            "src": "3484:15:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$_t_struct$_RelayRequest_$8491_calldata_ptr_$_t_bytes_calldata_ptr_$returns$__$",
                                                "typeString": "function (string memory,struct GsnTypes.RelayRequest calldata,bytes calldata) view"
                                            }
                                        },
                                        "id": 8277,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3484:61:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8278,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3484:61:38"
                                }
                            ]
                        },
                        "id": 8280,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "verify",
                        "nameLocation": "3271:6:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8267,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8261,
                                    "mutability": "mutable",
                                    "name": "domainSeparatorName",
                                    "nameLocation": "3301:19:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8280,
                                    "src": "3287:33:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 8260,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3287:6:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8264,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "3361:12:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8280,
                                    "src": "3330:43:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 8263,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8262,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "3330:21:38"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "3330:21:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8266,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "3398:9:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8280,
                                    "src": "3383:24:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 8265,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3383:5:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3277:136:38"
                        },
                        "returnParameters": {
                            "id": 8268,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "3428:0:38"
                        },
                        "scope": 8464,
                        "src": "3262:290:38",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8354,
                            "nodeType": "Block",
                            "src": "3818:669:38",
                            "statements": [
                                {
                                    "assignments": [
                                        8297
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 8297,
                                            "mutability": "mutable",
                                            "name": "suffixData",
                                            "nameLocation": "3842:10:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8354,
                                            "src": "3829:23:38",
                                            "stateVariable": false,
                                            "storageLocation": "memory",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes"
                                            },
                                            "typeName": {
                                                "id": 8296,
                                                "name": "bytes",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "3829:5:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_storage_ptr",
                                                    "typeString": "bytes"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 8301,
                                    "initialValue": {
                                        "arguments": [
                                            {
                                                "id": 8299,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8285,
                                                "src": "3869:12:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            ],
                                            "id": 8298,
                                            "name": "splitRequest",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8160,
                                            "src": "3856:12:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$_t_bytes_memory_ptr_$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) pure returns (bytes memory)"
                                            }
                                        },
                                        "id": 8300,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3856:26:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                        }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "3828:54:38"
                                },
                                {
                                    "assignments": [
                                        8303
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 8303,
                                            "mutability": "mutable",
                                            "name": "_domainSeparator",
                                            "nameLocation": "3900:16:38",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 8354,
                                            "src": "3892:24:38",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes32",
                                                "typeString": "bytes32"
                                            },
                                            "typeName": {
                                                "id": 8302,
                                                "name": "bytes32",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "3892:7:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 8310,
                                    "initialValue": {
                                        "arguments": [
                                            {
                                                "id": 8305,
                                                "name": "domainSeparatorName",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8282,
                                                "src": "3935:19:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                }
                                            },
                                            {
                                                "expression": {
                                                    "expression": {
                                                        "id": 8306,
                                                        "name": "relayRequest",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8285,
                                                        "src": "3956:12:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                            "typeString": "struct GsnTypes.RelayRequest calldata"
                                                        }
                                                    },
                                                    "id": 8307,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "relayData",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 8490,
                                                    "src": "3956:22:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayData calldata"
                                                    }
                                                },
                                                "id": 8308,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "forwarder",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 8479,
                                                "src": "3956:32:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                },
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            ],
                                            "id": 8304,
                                            "name": "domainSeparator",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8388,
                                            "src": "3919:15:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$_t_address_$returns$_t_bytes32_$",
                                                "typeString": "function (string memory,address) view returns (bytes32)"
                                            }
                                        },
                                        "id": 8309,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3919:70:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "3892:97:38"
                                },
                                {
                                    "expression": {
                                        "id": 8331,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "components": [
                                                {
                                                    "id": 8311,
                                                    "name": "forwarderSuccess",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8290,
                                                    "src": "4062:16:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                    }
                                                },
                                                {
                                                    "id": 8312,
                                                    "name": "ret",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8294,
                                                    "src": "4080:3:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                }
                                            ],
                                            "id": 8313,
                                            "isConstant": false,
                                            "isInlineArray": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": true,
                                            "nodeType": "TupleExpression",
                                            "src": "4061:23:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                                "typeString": "tuple(bool,bytes memory)"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "arguments": [
                                                {
                                                    "arguments": [
                                                        {
                                                            "expression": {
                                                                "expression": {
                                                                    "id": 8320,
                                                                    "name": "IForwarder",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 5129,
                                                                    "src": "4161:10:38",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_type$_t_contract$_IForwarder_$5129_$",
                                                                        "typeString": "type(contract IForwarder)"
                                                                    }
                                                                },
                                                                "id": 8321,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": true,
                                                                "lValueRequested": false,
                                                                "memberName": "execute",
                                                                "nodeType": "MemberAccess",
                                                                "referencedDeclaration": 5112,
                                                                "src": "4161:18:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_function_declaration_payable$_t_struct$_ForwardRequest_$5058_calldata_ptr_$_t_bytes32_$_t_bytes32_$_t_bytes_calldata_ptr_$_t_bytes_calldata_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                                                    "typeString": "function IForwarder.execute(struct IForwarder.ForwardRequest calldata,bytes32,bytes32,bytes calldata,bytes calldata) payable returns (bool,bytes memory)"
                                                                }
                                                            },
                                                            "id": 8322,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "memberName": "selector",
                                                            "nodeType": "MemberAccess",
                                                            "src": "4161:27:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes4",
                                                                "typeString": "bytes4"
                                                            }
                                                        },
                                                        {
                                                            "expression": {
                                                                "id": 8323,
                                                                "name": "relayRequest",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8285,
                                                                "src": "4202:12:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                                }
                                                            },
                                                            "id": 8324,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "memberName": "request",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": 8487,
                                                            "src": "4202:20:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                                "typeString": "struct IForwarder.ForwardRequest calldata"
                                                            }
                                                        },
                                                        {
                                                            "id": 8325,
                                                            "name": "_domainSeparator",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8303,
                                                            "src": "4224:16:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            }
                                                        },
                                                        {
                                                            "id": 8326,
                                                            "name": "RELAY_REQUEST_TYPEHASH",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8127,
                                                            "src": "4242:22:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            }
                                                        },
                                                        {
                                                            "id": 8327,
                                                            "name": "suffixData",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8297,
                                                            "src": "4266:10:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                                "typeString": "bytes memory"
                                                            }
                                                        },
                                                        {
                                                            "id": 8328,
                                                            "name": "signature",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8287,
                                                            "src": "4278:9:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                            }
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_bytes4",
                                                                "typeString": "bytes4"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                                "typeString": "struct IForwarder.ForwardRequest calldata"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                                "typeString": "bytes memory"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                            }
                                                        ],
                                                        "expression": {
                                                            "id": 8318,
                                                            "name": "abi",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967295,
                                                            "src": "4138:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_magic_abi",
                                                                "typeString": "abi"
                                                            }
                                                        },
                                                        "id": 8319,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "memberName": "encodeWithSelector",
                                                        "nodeType": "MemberAccess",
                                                        "src": "4138:22:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                                            "typeString": "function (bytes4) pure returns (bytes memory)"
                                                        }
                                                    },
                                                    "id": 8329,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "4138:159:38",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                ],
                                                "expression": {
                                                    "expression": {
                                                        "expression": {
                                                            "id": 8314,
                                                            "name": "relayRequest",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8285,
                                                            "src": "4087:12:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayRequest calldata"
                                                            }
                                                        },
                                                        "id": 8315,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "relayData",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8490,
                                                        "src": "4087:22:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                            "typeString": "struct GsnTypes.RelayData calldata"
                                                        }
                                                    },
                                                    "id": 8316,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "forwarder",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 8479,
                                                    "src": "4087:32:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "id": 8317,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "call",
                                                "nodeType": "MemberAccess",
                                                "src": "4087:37:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                                    "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                                                }
                                            },
                                            "id": 8330,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "4087:211:38",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                                "typeString": "tuple(bool,bytes memory)"
                                            }
                                        },
                                        "src": "4061:237:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8332,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4061:237:38"
                                },
                                {
                                    "condition": {
                                        "id": 8333,
                                        "name": "forwarderSuccess",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 8290,
                                        "src": "4313:16:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "id": 8349,
                                    "nodeType": "IfStatement",
                                    "src": "4308:143:38",
                                    "trueBody": {
                                        "id": 8348,
                                        "nodeType": "Block",
                                        "src": "4332:119:38",
                                        "statements": [
                                            {
                                                "expression": {
                                                    "id": 8346,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "leftHandSide": {
                                                        "components": [
                                                            {
                                                                "id": 8334,
                                                                "name": "callSuccess",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8292,
                                                                "src": "4390:11:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bool",
                                                                    "typeString": "bool"
                                                                }
                                                            },
                                                            {
                                                                "id": 8335,
                                                                "name": "ret",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8294,
                                                                "src": "4403:3:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                }
                                                            }
                                                        ],
                                                        "id": 8336,
                                                        "isConstant": false,
                                                        "isInlineArray": false,
                                                        "isLValue": true,
                                                        "isPure": false,
                                                        "lValueRequested": true,
                                                        "nodeType": "TupleExpression",
                                                        "src": "4389:18:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                                            "typeString": "tuple(bool,bytes memory)"
                                                        }
                                                    },
                                                    "nodeType": "Assignment",
                                                    "operator": "=",
                                                    "rightHandSide": {
                                                        "arguments": [
                                                            {
                                                                "id": 8339,
                                                                "name": "ret",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 8294,
                                                                "src": "4421:3:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                }
                                                            },
                                                            {
                                                                "components": [
                                                                    {
                                                                        "id": 8341,
                                                                        "isConstant": false,
                                                                        "isLValue": false,
                                                                        "isPure": true,
                                                                        "lValueRequested": false,
                                                                        "nodeType": "ElementaryTypeNameExpression",
                                                                        "src": "4427:4:38",
                                                                        "typeDescriptions": {
                                                                            "typeIdentifier": "t_type$_t_bool_$",
                                                                            "typeString": "type(bool)"
                                                                        },
                                                                        "typeName": {
                                                                            "id": 8340,
                                                                            "name": "bool",
                                                                            "nodeType": "ElementaryTypeName",
                                                                            "src": "4427:4:38",
                                                                            "typeDescriptions": {}
                                                                        }
                                                                    },
                                                                    {
                                                                        "id": 8343,
                                                                        "isConstant": false,
                                                                        "isLValue": false,
                                                                        "isPure": true,
                                                                        "lValueRequested": false,
                                                                        "nodeType": "ElementaryTypeNameExpression",
                                                                        "src": "4433:5:38",
                                                                        "typeDescriptions": {
                                                                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                                                            "typeString": "type(bytes storage pointer)"
                                                                        },
                                                                        "typeName": {
                                                                            "id": 8342,
                                                                            "name": "bytes",
                                                                            "nodeType": "ElementaryTypeName",
                                                                            "src": "4433:5:38",
                                                                            "typeDescriptions": {}
                                                                        }
                                                                    }
                                                                ],
                                                                "id": 8344,
                                                                "isConstant": false,
                                                                "isInlineArray": false,
                                                                "isLValue": false,
                                                                "isPure": true,
                                                                "lValueRequested": false,
                                                                "nodeType": "TupleExpression",
                                                                "src": "4426:13:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_tuple$_t_type$_t_bool_$_$_t_type$_t_bytes_storage_ptr_$_$",
                                                                    "typeString": "tuple(type(bool),type(bytes storage pointer))"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                },
                                                                {
                                                                    "typeIdentifier": "t_tuple$_t_type$_t_bool_$_$_t_type$_t_bytes_storage_ptr_$_$",
                                                                    "typeString": "tuple(type(bool),type(bytes storage pointer))"
                                                                }
                                                            ],
                                                            "expression": {
                                                                "id": 8337,
                                                                "name": "abi",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 4294967295,
                                                                "src": "4410:3:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_magic_abi",
                                                                    "typeString": "abi"
                                                                }
                                                            },
                                                            "id": 8338,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "memberName": "decode",
                                                            "nodeType": "MemberAccess",
                                                            "src": "4410:10:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                                "typeString": "function () pure"
                                                            }
                                                        },
                                                        "id": 8345,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "4410:30:38",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                                            "typeString": "tuple(bool,bytes memory)"
                                                        }
                                                    },
                                                    "src": "4389:51:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_tuple$__$",
                                                        "typeString": "tuple()"
                                                    }
                                                },
                                                "id": 8347,
                                                "nodeType": "ExpressionStatement",
                                                "src": "4389:51:38"
                                            }
                                        ]
                                    }
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 8351,
                                                "name": "ret",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8294,
                                                "src": "4476:3:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "id": 8350,
                                            "name": "truncateInPlace",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8368,
                                            "src": "4460:15:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$",
                                                "typeString": "function (bytes memory) pure"
                                            }
                                        },
                                        "id": 8352,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "4460:20:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8353,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4460:20:38"
                                }
                            ]
                        },
                        "id": 8355,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "execute",
                        "nameLocation": "3567:7:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8288,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8282,
                                    "mutability": "mutable",
                                    "name": "domainSeparatorName",
                                    "nameLocation": "3598:19:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8355,
                                    "src": "3584:33:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 8281,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3584:6:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8285,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "3658:12:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8355,
                                    "src": "3627:43:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 8284,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8283,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "3627:21:38"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "3627:21:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8287,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "3695:9:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8355,
                                    "src": "3680:24:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 8286,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3680:5:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3574:136:38"
                        },
                        "returnParameters": {
                            "id": 8295,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8290,
                                    "mutability": "mutable",
                                    "name": "forwarderSuccess",
                                    "nameLocation": "3743:16:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8355,
                                    "src": "3738:21:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 8289,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3738:4:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8292,
                                    "mutability": "mutable",
                                    "name": "callSuccess",
                                    "nameLocation": "3774:11:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8355,
                                    "src": "3769:16:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 8291,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3769:4:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8294,
                                    "mutability": "mutable",
                                    "name": "ret",
                                    "nameLocation": "3808:3:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8355,
                                    "src": "3795:16:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 8293,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3795:5:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3728:89:38"
                        },
                        "scope": 8464,
                        "src": "3558:929:38",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8367,
                            "nodeType": "Block",
                            "src": "4771:67:38",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 8363,
                                                "name": "data",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8357,
                                                "src": "4809:4:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            },
                                            {
                                                "id": 8364,
                                                "name": "MAX_RETURN_SIZE",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8088,
                                                "src": "4815:15:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            ],
                                            "expression": {
                                                "id": 8360,
                                                "name": "MinLibBytes",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8687,
                                                "src": "4781:11:38",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_MinLibBytes_$8687_$",
                                                    "typeString": "type(library MinLibBytes)"
                                                }
                                            },
                                            "id": 8362,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "truncateInPlace",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 8589,
                                            "src": "4781:27:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$__$",
                                                "typeString": "function (bytes memory,uint256) pure"
                                            }
                                        },
                                        "id": 8365,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "4781:50:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 8366,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4781:50:38"
                                }
                            ]
                        },
                        "id": 8368,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "truncateInPlace",
                        "nameLocation": "4722:15:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8358,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8357,
                                    "mutability": "mutable",
                                    "name": "data",
                                    "nameLocation": "4751:4:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8368,
                                    "src": "4738:17:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 8356,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4738:5:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4737:19:38"
                        },
                        "returnParameters": {
                            "id": 8359,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4771:0:38"
                        },
                        "scope": 8464,
                        "src": "4713:125:38",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8387,
                            "nodeType": "Block",
                            "src": "4940:195:38",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "id": 8379,
                                                        "name": "name",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8370,
                                                        "src": "5002:4:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_string_memory_ptr",
                                                            "typeString": "string memory"
                                                        }
                                                    },
                                                    {
                                                        "hexValue": "33",
                                                        "id": 8380,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "kind": "string",
                                                        "lValueRequested": false,
                                                        "nodeType": "Literal",
                                                        "src": "5030:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_stringliteral_2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de",
                                                            "typeString": "literal_string \"3\""
                                                        },
                                                        "value": "3"
                                                    },
                                                    {
                                                        "arguments": [],
                                                        "expression": {
                                                            "argumentTypes": [],
                                                            "id": 8381,
                                                            "name": "getChainID",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8395,
                                                            "src": "5057:10:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                                                "typeString": "function () view returns (uint256)"
                                                            }
                                                        },
                                                        "id": 8382,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "5057:12:38",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    },
                                                    {
                                                        "id": 8383,
                                                        "name": "forwarder",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8372,
                                                        "src": "5103:9:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_string_memory_ptr",
                                                            "typeString": "string memory"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_stringliteral_2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de",
                                                            "typeString": "literal_string \"3\""
                                                        },
                                                        {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    ],
                                                    "id": 8378,
                                                    "name": "EIP712Domain",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8136,
                                                    "src": "4968:12:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_struct$_EIP712Domain_$8136_storage_ptr_$",
                                                        "typeString": "type(struct GsnEip712Library.EIP712Domain storage pointer)"
                                                    }
                                                },
                                                "id": 8384,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "structConstructorCall",
                                                "lValueRequested": false,
                                                "names": [
                                                    "name",
                                                    "version",
                                                    "chainId",
                                                    "verifyingContract"
                                                ],
                                                "nodeType": "FunctionCall",
                                                "src": "4968:159:38",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                                    "typeString": "struct GsnEip712Library.EIP712Domain memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                                    "typeString": "struct GsnEip712Library.EIP712Domain memory"
                                                }
                                            ],
                                            "id": 8377,
                                            "name": "hashDomain",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8429,
                                            "src": "4957:10:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_struct$_EIP712Domain_$8136_memory_ptr_$returns$_t_bytes32_$",
                                                "typeString": "function (struct GsnEip712Library.EIP712Domain memory) pure returns (bytes32)"
                                            }
                                        },
                                        "id": 8385,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "4957:171:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "functionReturnParameters": 8376,
                                    "id": 8386,
                                    "nodeType": "Return",
                                    "src": "4950:178:38"
                                }
                            ]
                        },
                        "id": 8388,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "domainSeparator",
                        "nameLocation": "4853:15:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8373,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8370,
                                    "mutability": "mutable",
                                    "name": "name",
                                    "nameLocation": "4883:4:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8388,
                                    "src": "4869:18:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 8369,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4869:6:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 8372,
                                    "mutability": "mutable",
                                    "name": "forwarder",
                                    "nameLocation": "4897:9:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8388,
                                    "src": "4889:17:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 8371,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4889:7:38",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4868:39:38"
                        },
                        "returnParameters": {
                            "id": 8376,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8375,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8388,
                                    "src": "4931:7:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 8374,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4931:7:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4930:9:38"
                        },
                        "scope": 8464,
                        "src": "4844:291:38",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8394,
                            "nodeType": "Block",
                            "src": "5198:113:38",
                            "statements": [
                                {
                                    "AST": {
                                        "nodeType": "YulBlock",
                                        "src": "5266:39:38",
                                        "statements": [
                                            {
                                                "nodeType": "YulAssignment",
                                                "src": "5280:15:38",
                                                "value": {
                                                    "arguments": [],
                                                    "functionName": {
                                                        "name": "chainid",
                                                        "nodeType": "YulIdentifier",
                                                        "src": "5286:7:38"
                                                    },
                                                    "nodeType": "YulFunctionCall",
                                                    "src": "5286:9:38"
                                                },
                                                "variableNames": [
                                                    {
                                                        "name": "id",
                                                        "nodeType": "YulIdentifier",
                                                        "src": "5280:2:38"
                                                    }
                                                ]
                                            }
                                        ]
                                    },
                                    "evmVersion": "london",
                                    "externalReferences": [
                                        {
                                            "declaration": 8391,
                                            "isOffset": false,
                                            "isSlot": false,
                                            "src": "5280:2:38",
                                            "valueSize": 1
                                        }
                                    ],
                                    "id": 8393,
                                    "nodeType": "InlineAssembly",
                                    "src": "5257:48:38"
                                }
                            ]
                        },
                        "id": 8395,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "getChainID",
                        "nameLocation": "5150:10:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8389,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "5160:2:38"
                        },
                        "returnParameters": {
                            "id": 8392,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8391,
                                    "mutability": "mutable",
                                    "name": "id",
                                    "nameLocation": "5194:2:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8395,
                                    "src": "5186:10:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 8390,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5186:7:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5185:12:38"
                        },
                        "scope": 8464,
                        "src": "5141:170:38",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8428,
                            "nodeType": "Block",
                            "src": "5394:244:38",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "id": 8406,
                                                        "name": "EIP712DOMAIN_TYPEHASH",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8141,
                                                        "src": "5449:21:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        }
                                                    },
                                                    {
                                                        "arguments": [
                                                            {
                                                                "arguments": [
                                                                    {
                                                                        "expression": {
                                                                            "id": 8410,
                                                                            "name": "req",
                                                                            "nodeType": "Identifier",
                                                                            "overloadedDeclarations": [],
                                                                            "referencedDeclaration": 8398,
                                                                            "src": "5504:3:38",
                                                                            "typeDescriptions": {
                                                                                "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                                                                "typeString": "struct GsnEip712Library.EIP712Domain memory"
                                                                            }
                                                                        },
                                                                        "id": 8411,
                                                                        "isConstant": false,
                                                                        "isLValue": true,
                                                                        "isPure": false,
                                                                        "lValueRequested": false,
                                                                        "memberName": "name",
                                                                        "nodeType": "MemberAccess",
                                                                        "referencedDeclaration": 8129,
                                                                        "src": "5504:8:38",
                                                                        "typeDescriptions": {
                                                                            "typeIdentifier": "t_string_memory_ptr",
                                                                            "typeString": "string memory"
                                                                        }
                                                                    }
                                                                ],
                                                                "expression": {
                                                                    "argumentTypes": [
                                                                        {
                                                                            "typeIdentifier": "t_string_memory_ptr",
                                                                            "typeString": "string memory"
                                                                        }
                                                                    ],
                                                                    "id": 8409,
                                                                    "isConstant": false,
                                                                    "isLValue": false,
                                                                    "isPure": true,
                                                                    "lValueRequested": false,
                                                                    "nodeType": "ElementaryTypeNameExpression",
                                                                    "src": "5498:5:38",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                                                        "typeString": "type(bytes storage pointer)"
                                                                    },
                                                                    "typeName": {
                                                                        "id": 8408,
                                                                        "name": "bytes",
                                                                        "nodeType": "ElementaryTypeName",
                                                                        "src": "5498:5:38",
                                                                        "typeDescriptions": {}
                                                                    }
                                                                },
                                                                "id": 8412,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "kind": "typeConversion",
                                                                "lValueRequested": false,
                                                                "names": [],
                                                                "nodeType": "FunctionCall",
                                                                "src": "5498:15:38",
                                                                "tryCall": false,
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                }
                                                            ],
                                                            "id": 8407,
                                                            "name": "keccak256",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967288,
                                                            "src": "5488:9:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                                "typeString": "function (bytes memory) pure returns (bytes32)"
                                                            }
                                                        },
                                                        "id": 8413,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "5488:26:38",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        }
                                                    },
                                                    {
                                                        "arguments": [
                                                            {
                                                                "arguments": [
                                                                    {
                                                                        "expression": {
                                                                            "id": 8417,
                                                                            "name": "req",
                                                                            "nodeType": "Identifier",
                                                                            "overloadedDeclarations": [],
                                                                            "referencedDeclaration": 8398,
                                                                            "src": "5548:3:38",
                                                                            "typeDescriptions": {
                                                                                "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                                                                "typeString": "struct GsnEip712Library.EIP712Domain memory"
                                                                            }
                                                                        },
                                                                        "id": 8418,
                                                                        "isConstant": false,
                                                                        "isLValue": true,
                                                                        "isPure": false,
                                                                        "lValueRequested": false,
                                                                        "memberName": "version",
                                                                        "nodeType": "MemberAccess",
                                                                        "referencedDeclaration": 8131,
                                                                        "src": "5548:11:38",
                                                                        "typeDescriptions": {
                                                                            "typeIdentifier": "t_string_memory_ptr",
                                                                            "typeString": "string memory"
                                                                        }
                                                                    }
                                                                ],
                                                                "expression": {
                                                                    "argumentTypes": [
                                                                        {
                                                                            "typeIdentifier": "t_string_memory_ptr",
                                                                            "typeString": "string memory"
                                                                        }
                                                                    ],
                                                                    "id": 8416,
                                                                    "isConstant": false,
                                                                    "isLValue": false,
                                                                    "isPure": true,
                                                                    "lValueRequested": false,
                                                                    "nodeType": "ElementaryTypeNameExpression",
                                                                    "src": "5542:5:38",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                                                        "typeString": "type(bytes storage pointer)"
                                                                    },
                                                                    "typeName": {
                                                                        "id": 8415,
                                                                        "name": "bytes",
                                                                        "nodeType": "ElementaryTypeName",
                                                                        "src": "5542:5:38",
                                                                        "typeDescriptions": {}
                                                                    }
                                                                },
                                                                "id": 8419,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "kind": "typeConversion",
                                                                "lValueRequested": false,
                                                                "names": [],
                                                                "nodeType": "FunctionCall",
                                                                "src": "5542:18:38",
                                                                "tryCall": false,
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                                    "typeString": "bytes memory"
                                                                }
                                                            ],
                                                            "id": 8414,
                                                            "name": "keccak256",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967288,
                                                            "src": "5532:9:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                                "typeString": "function (bytes memory) pure returns (bytes32)"
                                                            }
                                                        },
                                                        "id": 8420,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "5532:29:38",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8421,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8398,
                                                            "src": "5579:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                                                "typeString": "struct GsnEip712Library.EIP712Domain memory"
                                                            }
                                                        },
                                                        "id": 8422,
                                                        "isConstant": false,
                                                        "isLValue": true,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "chainId",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8133,
                                                        "src": "5579:11:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8423,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8398,
                                                            "src": "5608:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                                                "typeString": "struct GsnEip712Library.EIP712Domain memory"
                                                            }
                                                        },
                                                        "id": 8424,
                                                        "isConstant": false,
                                                        "isLValue": true,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "verifyingContract",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8135,
                                                        "src": "5608:21:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "id": 8404,
                                                        "name": "abi",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967295,
                                                        "src": "5421:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_abi",
                                                            "typeString": "abi"
                                                        }
                                                    },
                                                    "id": 8405,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "memberName": "encode",
                                                    "nodeType": "MemberAccess",
                                                    "src": "5421:10:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                                        "typeString": "function () pure returns (bytes memory)"
                                                    }
                                                },
                                                "id": 8425,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "5421:209:38",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "id": 8403,
                                            "name": "keccak256",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4294967288,
                                            "src": "5411:9:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                "typeString": "function (bytes memory) pure returns (bytes32)"
                                            }
                                        },
                                        "id": 8426,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5411:220:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "functionReturnParameters": 8402,
                                    "id": 8427,
                                    "nodeType": "Return",
                                    "src": "5404:227:38"
                                }
                            ]
                        },
                        "id": 8429,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "hashDomain",
                        "nameLocation": "5326:10:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8399,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8398,
                                    "mutability": "mutable",
                                    "name": "req",
                                    "nameLocation": "5357:3:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8429,
                                    "src": "5337:23:38",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_EIP712Domain_$8136_memory_ptr",
                                        "typeString": "struct GsnEip712Library.EIP712Domain"
                                    },
                                    "typeName": {
                                        "id": 8397,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8396,
                                            "name": "EIP712Domain",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8136,
                                            "src": "5337:12:38"
                                        },
                                        "referencedDeclaration": 8136,
                                        "src": "5337:12:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_EIP712Domain_$8136_storage_ptr",
                                            "typeString": "struct GsnEip712Library.EIP712Domain"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5336:25:38"
                        },
                        "returnParameters": {
                            "id": 8402,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8401,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8429,
                                    "src": "5385:7:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 8400,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5385:7:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5384:9:38"
                        },
                        "scope": 8464,
                        "src": "5317:321:38",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 8462,
                            "nodeType": "Block",
                            "src": "5732:390:38",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "id": 8440,
                                                        "name": "RELAYDATA_TYPEHASH",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 8122,
                                                        "src": "5787:18:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8441,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "5823:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8442,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "maxFeePerGas",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8469,
                                                        "src": "5823:16:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8443,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "5857:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8444,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "maxPriorityFeePerGas",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8471,
                                                        "src": "5857:24:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8445,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "5899:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8446,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "transactionCalldataGasUsed",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8473,
                                                        "src": "5899:30:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8447,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "5947:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8448,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "relayWorker",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8475,
                                                        "src": "5947:15:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8449,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "5980:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8450,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "paymaster",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8477,
                                                        "src": "5980:13:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8451,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "6011:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8452,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "forwarder",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8479,
                                                        "src": "6011:13:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    {
                                                        "arguments": [
                                                            {
                                                                "expression": {
                                                                    "id": 8454,
                                                                    "name": "req",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 8432,
                                                                    "src": "6052:3:38",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                        "typeString": "struct GsnTypes.RelayData calldata"
                                                                    }
                                                                },
                                                                "id": 8455,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "lValueRequested": false,
                                                                "memberName": "paymasterData",
                                                                "nodeType": "MemberAccess",
                                                                "referencedDeclaration": 8481,
                                                                "src": "6052:17:38",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                                    "typeString": "bytes calldata"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                                    "typeString": "bytes calldata"
                                                                }
                                                            ],
                                                            "id": 8453,
                                                            "name": "keccak256",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967288,
                                                            "src": "6042:9:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                                "typeString": "function (bytes memory) pure returns (bytes32)"
                                                            }
                                                        },
                                                        "id": 8456,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "6042:28:38",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        }
                                                    },
                                                    {
                                                        "expression": {
                                                            "id": 8457,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8432,
                                                            "src": "6088:3:38",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 8458,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "clientId",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8483,
                                                        "src": "6088:12:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        },
                                                        {
                                                            "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"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_bytes32",
                                                            "typeString": "bytes32"
                                                        },
                                                        {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "id": 8438,
                                                        "name": "abi",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967295,
                                                        "src": "5759:3:38",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_abi",
                                                            "typeString": "abi"
                                                        }
                                                    },
                                                    "id": 8439,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "memberName": "encode",
                                                    "nodeType": "MemberAccess",
                                                    "src": "5759:10:38",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                                        "typeString": "function () pure returns (bytes memory)"
                                                    }
                                                },
                                                "id": 8459,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "5759:355:38",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "id": 8437,
                                            "name": "keccak256",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4294967288,
                                            "src": "5749:9:38",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                                "typeString": "function (bytes memory) pure returns (bytes32)"
                                            }
                                        },
                                        "id": 8460,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5749:366:38",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "functionReturnParameters": 8436,
                                    "id": 8461,
                                    "nodeType": "Return",
                                    "src": "5742:373:38"
                                }
                            ]
                        },
                        "id": 8463,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "hashRelayData",
                        "nameLocation": "5653:13:38",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 8433,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8432,
                                    "mutability": "mutable",
                                    "name": "req",
                                    "nameLocation": "5695:3:38",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8463,
                                    "src": "5667:31:38",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayData"
                                    },
                                    "typeName": {
                                        "id": 8431,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 8430,
                                            "name": "GsnTypes.RelayData",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8484,
                                            "src": "5667:18:38"
                                        },
                                        "referencedDeclaration": 8484,
                                        "src": "5667:18:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayData_$8484_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayData"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5666:33:38"
                        },
                        "returnParameters": {
                            "id": 8436,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 8435,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8463,
                                    "src": "5723:7:38",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 8434,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5723:7:38",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5722:9:38"
                        },
                        "scope": 8464,
                        "src": "5644:478:38",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "internal"
                    }
                ],
                "scope": 8465,
                "src": "381:5743:38",
                "usedErrors": []
            }
        ],
        "src": "0:6124:38"
    },
    "compiler": {
        "name": "solc",
        "version": "0.8.7+commit.e28d00a7.Emscripten.clang"
    },
    "networks": {},
    "schemaVersion": "3.1.0",
    "updatedAt": "2023-03-16T16:54:15.244Z",
    "devdoc": {
        "kind": "dev",
        "methods": {},
        "title": "The ERC-712 Library for GSN",
        "version": 1
    },
    "userdoc": {
        "kind": "user",
        "methods": {},
        "notice": "Bridge Library to convert a GSN RelayRequest into a valid `ForwardRequest` for a `Forwarder`.",
        "version": 1
    }
}
