{
    "contractName": "BasePaymaster",
    "abi": [
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": true,
                    "internalType": "address",
                    "name": "previousOwner",
                    "type": "address"
                },
                {
                    "indexed": true,
                    "internalType": "address",
                    "name": "newOwner",
                    "type": "address"
                }
            ],
            "name": "OwnershipTransferred",
            "type": "event"
        },
        {
            "inputs": [],
            "name": "CALLDATA_SIZE_LIMIT",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "FORWARDER_HUB_OVERHEAD",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "PAYMASTER_ACCEPTANCE_BUDGET",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "POST_RELAYED_CALL_GAS_LIMIT",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "PRE_RELAYED_CALL_GAS_LIMIT",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "owner",
            "outputs": [
                {
                    "internalType": "address",
                    "name": "",
                    "type": "address"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "renounceOwnership",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "newOwner",
                    "type": "address"
                }
            ],
            "name": "transferOwnership",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "versionPaymaster",
            "outputs": [
                {
                    "internalType": "string",
                    "name": "",
                    "type": "string"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "stateMutability": "payable",
            "type": "receive"
        },
        {
            "inputs": [],
            "name": "getRelayHub",
            "outputs": [
                {
                    "internalType": "address",
                    "name": "",
                    "type": "address"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "bytes4",
                    "name": "interfaceId",
                    "type": "bytes4"
                }
            ],
            "name": "supportsInterface",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "getGasAndDataLimits",
            "outputs": [
                {
                    "components": [
                        {
                            "internalType": "uint256",
                            "name": "acceptanceBudget",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "preRelayedCallGasLimit",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "postRelayedCallGasLimit",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "calldataSizeLimit",
                            "type": "uint256"
                        }
                    ],
                    "internalType": "struct IPaymaster.GasAndDataLimits",
                    "name": "limits",
                    "type": "tuple"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "contract IRelayHub",
                    "name": "hub",
                    "type": "address"
                }
            ],
            "name": "setRelayHub",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "forwarder",
                    "type": "address"
                }
            ],
            "name": "setTrustedForwarder",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "getTrustedForwarder",
            "outputs": [
                {
                    "internalType": "address",
                    "name": "",
                    "type": "address"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "uint256",
                    "name": "amount",
                    "type": "uint256"
                },
                {
                    "internalType": "address payable",
                    "name": "target",
                    "type": "address"
                }
            ],
            "name": "withdrawRelayHubDepositTo",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "components": [
                                {
                                    "internalType": "address",
                                    "name": "from",
                                    "type": "address"
                                },
                                {
                                    "internalType": "address",
                                    "name": "to",
                                    "type": "address"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "value",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "gas",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "nonce",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "bytes",
                                    "name": "data",
                                    "type": "bytes"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "validUntilTime",
                                    "type": "uint256"
                                }
                            ],
                            "internalType": "struct IForwarder.ForwardRequest",
                            "name": "request",
                            "type": "tuple"
                        },
                        {
                            "components": [
                                {
                                    "internalType": "uint256",
                                    "name": "maxFeePerGas",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "maxPriorityFeePerGas",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "transactionCalldataGasUsed",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "address",
                                    "name": "relayWorker",
                                    "type": "address"
                                },
                                {
                                    "internalType": "address",
                                    "name": "paymaster",
                                    "type": "address"
                                },
                                {
                                    "internalType": "address",
                                    "name": "forwarder",
                                    "type": "address"
                                },
                                {
                                    "internalType": "bytes",
                                    "name": "paymasterData",
                                    "type": "bytes"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "clientId",
                                    "type": "uint256"
                                }
                            ],
                            "internalType": "struct GsnTypes.RelayData",
                            "name": "relayData",
                            "type": "tuple"
                        }
                    ],
                    "internalType": "struct GsnTypes.RelayRequest",
                    "name": "relayRequest",
                    "type": "tuple"
                },
                {
                    "internalType": "bytes",
                    "name": "signature",
                    "type": "bytes"
                },
                {
                    "internalType": "bytes",
                    "name": "approvalData",
                    "type": "bytes"
                },
                {
                    "internalType": "uint256",
                    "name": "maxPossibleGas",
                    "type": "uint256"
                }
            ],
            "name": "preRelayedCall",
            "outputs": [
                {
                    "internalType": "bytes",
                    "name": "",
                    "type": "bytes"
                },
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                }
            ],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "bytes",
                    "name": "context",
                    "type": "bytes"
                },
                {
                    "internalType": "bool",
                    "name": "success",
                    "type": "bool"
                },
                {
                    "internalType": "uint256",
                    "name": "gasUseWithoutPost",
                    "type": "uint256"
                },
                {
                    "components": [
                        {
                            "internalType": "uint256",
                            "name": "maxFeePerGas",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "maxPriorityFeePerGas",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "transactionCalldataGasUsed",
                            "type": "uint256"
                        },
                        {
                            "internalType": "address",
                            "name": "relayWorker",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "paymaster",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "forwarder",
                            "type": "address"
                        },
                        {
                            "internalType": "bytes",
                            "name": "paymasterData",
                            "type": "bytes"
                        },
                        {
                            "internalType": "uint256",
                            "name": "clientId",
                            "type": "uint256"
                        }
                    ],
                    "internalType": "struct GsnTypes.RelayData",
                    "name": "relayData",
                    "type": "tuple"
                }
            ],
            "name": "postRelayedCall",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        }
    ],
    "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CALLDATA_SIZE_LIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FORWARDER_HUB_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PAYMASTER_ACCEPTANCE_BUDGET\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"POST_RELAYED_CALL_GAS_LIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PRE_RELAYED_CALL_GAS_LIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGasAndDataLimits\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"acceptanceBudget\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"preRelayedCallGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"postRelayedCallGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"calldataSizeLimit\",\"type\":\"uint256\"}],\"internalType\":\"struct IPaymaster.GasAndDataLimits\",\"name\":\"limits\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRelayHub\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTrustedForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"context\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"gasUseWithoutPost\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"transactionCalldataGasUsed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"relayWorker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"clientId\",\"type\":\"uint256\"}],\"internalType\":\"struct GsnTypes.RelayData\",\"name\":\"relayData\",\"type\":\"tuple\"}],\"name\":\"postRelayedCall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validUntilTime\",\"type\":\"uint256\"}],\"internalType\":\"struct IForwarder.ForwardRequest\",\"name\":\"request\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"transactionCalldataGasUsed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"relayWorker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"clientId\",\"type\":\"uint256\"}],\"internalType\":\"struct GsnTypes.RelayData\",\"name\":\"relayData\",\"type\":\"tuple\"}],\"internalType\":\"struct GsnTypes.RelayRequest\",\"name\":\"relayRequest\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"approvalData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"maxPossibleGas\",\"type\":\"uint256\"}],\"name\":\"preRelayedCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRelayHub\",\"name\":\"hub\",\"type\":\"address\"}],\"name\":\"setRelayHub\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"setTrustedForwarder\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"versionPaymaster\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"withdrawRelayHubDepositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getGasAndDataLimits()\":{\"returns\":{\"limits\":\"An instance of the `GasAndDataLimits` struct ##### `acceptanceBudget` If the transactions consumes more than `acceptanceBudget` this Paymaster will be charged for gas no matter what. Transaction that gets rejected after consuming more than `acceptanceBudget` gas is on this Paymaster's expense. Should be set to an amount gas this Paymaster expects to spend deciding whether to accept or reject a request. This includes gas consumed by calculations in the `preRelayedCall`, `Forwarder` and the recipient contract. :warning: **Warning** :warning: As long this value is above `preRelayedCallGasLimit` (see defaults in `BasePaymaster`), the Paymaster is guaranteed it will never pay for rejected transactions. If this value is below `preRelayedCallGasLimit`, it might might make Paymaster open to a \\\"griefing\\\" attack. The relayers should prefer lower `acceptanceBudget`, as it improves their chances of being compensated. From a Relay's point of view, this is the highest gas value a bad Paymaster may cost the relay, since the paymaster will pay anything above that value regardless of whether the transaction succeeds or reverts. Specifying value too high might make the call rejected by relayers (see `maxAcceptanceBudget` in server config). ##### `preRelayedCallGasLimit` The max gas usage of preRelayedCall. Any revert of the `preRelayedCall` is a request rejection by the paymaster. As long as `acceptanceBudget` is above `preRelayedCallGasLimit`, any such revert is not payed by the paymaster. ##### `postRelayedCallGasLimit` The max gas usage of postRelayedCall. The Paymaster is not charged for the maximum, only for actually used gas. Note that an OOG will revert the inner transaction, but the paymaster will be charged for it anyway.\"}},\"getRelayHub()\":{\"returns\":{\"_0\":\"The address of the `RelayHub` that is trusted by this Paymaster to execute the requests.\"}},\"getTrustedForwarder()\":{\"returns\":{\"_0\":\"The address of the `Forwarder` that is trusted by this Paymaster to execute the requests.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"postRelayedCall(bytes,bool,uint256,(uint256,uint256,uint256,address,address,address,bytes,uint256))\":{\"params\":{\"context\":\"The call context, as returned by the preRelayedCall\",\"gasUseWithoutPost\":\"The actual amount of gas used by the entire transaction, EXCEPT        the gas used by the postRelayedCall itself.\",\"relayData\":\"The relay params of the request. can be used by relayHub.calculateCharge()\",\"success\":\"`true` if the relayed call succeeded, false if it reverted\"}},\"preRelayedCall(((address,address,uint256,uint256,uint256,bytes,uint256),(uint256,uint256,uint256,address,address,address,bytes,uint256)),bytes,bytes,uint256)\":{\"params\":{\"approvalData\":\"- extra dapp-specific data (e.g. signature from trusted party)\",\"maxPossibleGas\":\"- based on values returned from `getGasAndDataLimits` the RelayHub will calculate the maximum possible amount of gas the user may be charged for. In order to convert this value to wei, the Paymaster has to call \\\"relayHub.calculateCharge()\\\"\",\"relayRequest\":\"- the full relay request structure\",\"signature\":\"- user's EIP712-compatible signature of the `relayRequest`. Note that in most cases the paymaster shouldn't try use it at all. It is always checked by the forwarder immediately after preRelayedCall returns.\"},\"returns\":{\"_0\":\"A byte array to be passed to postRelayedCall. Can contain any data needed by this Paymaster in any form or be empty if no extra data is needed.\",\"_1\":\"The flag that allows a Paymaster to \\\"delegate\\\" the rejection to the recipient code. It also means the Paymaster trust the recipient to reject fast: both preRelayedCall, forwarder check and recipient checks must fit into the GasLimits.acceptanceBudget, otherwise the TX is paid by the Paymaster. `true` if the Paymaster wants to reject the TX if the recipient reverts. `false` if the Paymaster wants rejects by the recipient to be completed on chain and paid by the Paymaster.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"versionPaymaster()\":{\"returns\":{\"_0\":\"version The SemVer string of this Paymaster's version.\"}},\"withdrawRelayHubDepositTo(uint256,address)\":{\"params\":{\"amount\":\"The amount to be subtracted from the sender.\",\"target\":\"The target to which the amount will be transferred.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getGasAndDataLimits()\":{\"notice\":\"Return the Gas Limits for Paymaster's functions and maximum msg.data length values for this Paymaster. This function allows different paymasters to have different properties without changes to the RelayHub.\"},\"getTrustedForwarder()\":{\"notice\":\":warning: **Warning** :warning: using incorrect Forwarder may cause the Paymaster to agreeing to pay for invalid transactions.\"},\"postRelayedCall(bytes,bool,uint256,(uint256,uint256,uint256,address,address,address,bytes,uint256))\":{\"notice\":\"This method is called after the actual relayed function call. It may be used to record the transaction (e.g. charge the caller by some contract logic) for this call. Revert in this functions causes a revert of the client's relayed call (and preRelayedCall(), but the Paymaster is still committed to pay the relay for the entire transaction.\"},\"preRelayedCall(((address,address,uint256,uint256,uint256,bytes,uint256),(uint256,uint256,uint256,address,address,address,bytes,uint256)),bytes,bytes,uint256)\":{\"notice\":\"Called by the Relay in view mode and later by the `RelayHub` on-chain to validate that the Paymaster agrees to pay for this call. The request is considered to be rejected by the Paymaster in one of the following conditions:  - `preRelayedCall()` method reverts  - the `Forwarder` reverts because of nonce or signature error  - the `Paymaster` returned `rejectOnRecipientRevert: true` and the recipient contract reverted    (and all that did not consume more than `acceptanceBudget` gas). In any of the above cases, all Paymaster calls and the recipient call are reverted. In any other case the Paymaster will pay for the gas cost of the transaction. Note that even if `postRelayedCall` is reverted the Paymaster will be charged.\"},\"setRelayHub(address)\":{\"notice\":\"The owner of the Paymaster can change the instance of the RelayHub this Paymaster works with. :warning: **Warning** :warning: The deposit on the previous RelayHub must be withdrawn first.\"},\"setTrustedForwarder(address)\":{\"notice\":\"The owner of the Paymaster can change the instance of the Forwarder this Paymaster works with.the Recipients must trust this Forwarder as well in order for the configuration to remain functional.\"},\"withdrawRelayHubDepositTo(uint256,address)\":{\"notice\":\"Withdraw deposit from the RelayHub.\"}},\"notice\":\"An abstract base class to be inherited by a concrete Paymaster. A subclass must implement:  - preRelayedCall  - postRelayedCall\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/alexf/gsn2/packages/contracts/solpp/BasePaymaster.sol\":\"BasePaymaster\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/alexf/gsn2/packages/contracts/solpp/BasePaymaster.sol\":{\"keccak256\":\"0x89c669597c94431753f0e043015677d0a2261121d8dee5db04baa9e0bd60506e\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://195cad8f002b5fd930f007f6f582a8d2193574422c74d65fc556ae58d4227f76\",\"dweb:/ipfs/QmPxDaWYdZfB1kwKCxVMFw92h59RarKXkyadcVT5LT5avd\"]},\"/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/interfaces/IPaymaster.sol\":{\"keccak256\":\"0x205617108fad6f3543fc12773e9d25998e944852e8ed9d71f79cb799ae299246\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://4903018f63b15211f2714edcf1c56f5c0bee6fea07efaaf908d3a78d07fb6d84\",\"dweb:/ipfs/Qmezexeh6GszFUHW2dgTGWTfb613Ni3tfjLqAtdAYAxCpQ\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/interfaces/IRelayHub.sol\":{\"keccak256\":\"0x19dcbf5e1bfaa413b6800ad84ffedd2989b401cede299f009ff62c33e03ccfae\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://bb5cb7bee7de97770e374b4cad1265c636a740dc7a2013d686a89d9398ba3098\",\"dweb:/ipfs/QmSqhNkFwDtS1EnupbQWduDm78N6s8c1zqXf5aLqZF69Xx\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/interfaces/IStakeManager.sol\":{\"keccak256\":\"0x27535f3677a2c373862d8672725632fdcabdf5d0e784f80c158063f55be68b5a\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://904ad156bf1cac29f9e13619ee0ee41e602b6cf1fafedea0a1d3be7a7accc654\",\"dweb:/ipfs/QmXVy5gfYXSWYFrkmL2u9jctZDXupiNWbif5tFVpVZMPww\"]},\"/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/access/Ownable.sol\":{\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2\",\"dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y\"]},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0xd04b0f06e0666f29cf7cccc82894de541e19bb30a765b107b1e40bb7fe5f7d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7b652499d098e88d8d878374616bb58434301061cae2253298b3f374044e0ddb\",\"dweb:/ipfs/QmbhAzctqo5jrSKU6idHdVyqfmzCcDbNUPvmx4GiXxfA6q\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fb0048dee081f6fffa5f74afc3fb328483c2a30504e94a0ddd2a5114d731ec4d\",\"dweb:/ipfs/QmZptt1nmYoA5SgjwnSgWqgUSDgm4q52Yos3xhnMv3MV43\"]},\"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\":{\"keccak256\":\"0xc65c83c1039508fa7a42a09a3c6a32babd1c438ba4dbb23581255e784b5d5eed\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1b3b38db0f76429db899909025e534c366415e9ea8b5ddc4c8901e6a7fc1461\",\"dweb:/ipfs/QmYv1KxyHjLEky9JWNSsSfpGJbiCxFyzVFgTwQKpiqYGUg\"]},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]}},\"version\":1}",
    "bytecode": "0x",
    "deployedBytecode": "0x",
    "immutableReferences": {},
    "sourceMap": "",
    "deployedSourceMap": "",
    "source": "pragma solidity >=0.7.6;\npragma abicoder v2;\n\n// SPDX-License-Identifier: GPL-3.0-only\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts/utils/introspection/ERC165.sol\";\nimport \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\nimport \"./utils/GsnTypes.sol\";\nimport \"./interfaces/IPaymaster.sol\";\nimport \"./interfaces/IRelayHub.sol\";\nimport \"./utils/GsnEip712Library.sol\";\nimport \"./forwarder/IForwarder.sol\";\n\n/**\n * @notice An abstract base class to be inherited by a concrete Paymaster.\n * A subclass must implement:\n *  - preRelayedCall\n *  - postRelayedCall\n */\nabstract contract BasePaymaster is IPaymaster, Ownable, ERC165 {\n    using ERC165Checker for address;\n\n    IRelayHub internal relayHub;\n    address private _trustedForwarder;\n\n    /// @inheritdoc IPaymaster\n    function getRelayHub() public override view returns (address) {\n        return address(relayHub);\n    }\n\n    //overhead of forwarder verify+signature, plus hub overhead.\n    uint256 constant public FORWARDER_HUB_OVERHEAD = 50000;\n\n    //These parameters are documented in IPaymaster.GasAndDataLimits\n    uint256 constant public PRE_RELAYED_CALL_GAS_LIMIT = 100000;\n    uint256 constant public POST_RELAYED_CALL_GAS_LIMIT = 110000;\n    uint256 constant public PAYMASTER_ACCEPTANCE_BUDGET = PRE_RELAYED_CALL_GAS_LIMIT + FORWARDER_HUB_OVERHEAD;\n    uint256 constant public CALLDATA_SIZE_LIMIT = 10500;\n\n    /// @inheritdoc IERC165\n    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n        return interfaceId == type(IPaymaster).interfaceId ||\n            interfaceId == type(Ownable).interfaceId ||\n            super.supportsInterface(interfaceId);\n    }\n\n    /// @inheritdoc IPaymaster\n    function getGasAndDataLimits()\n    public\n    override\n    virtual\n    view\n    returns (\n        IPaymaster.GasAndDataLimits memory limits\n    ) {\n        return IPaymaster.GasAndDataLimits(\n            PAYMASTER_ACCEPTANCE_BUDGET,\n            PRE_RELAYED_CALL_GAS_LIMIT,\n            POST_RELAYED_CALL_GAS_LIMIT,\n            CALLDATA_SIZE_LIMIT\n        );\n    }\n\n    /**\n     * @notice this method must be called from preRelayedCall to validate that the forwarder\n     * is approved by the paymaster as well as by the recipient contract.\n     */\n    function _verifyForwarder(GsnTypes.RelayRequest calldata relayRequest)\n    internal\n    virtual\n    view\n    {\n        require(getTrustedForwarder() == relayRequest.relayData.forwarder, \"Forwarder is not trusted\");\n        GsnEip712Library.verifyForwarderTrusted(relayRequest);\n    }\n\n    function _verifyRelayHubOnly() internal virtual view {\n        require(msg.sender == getRelayHub(), \"can only be called by RelayHub\");\n    }\n\n    function _verifyValue(GsnTypes.RelayRequest calldata relayRequest) internal virtual view{\n        require(relayRequest.request.value == 0, \"value transfer not supported\");\n    }\n\n    function _verifyPaymasterData(GsnTypes.RelayRequest calldata relayRequest) internal virtual view {\n        require(relayRequest.relayData.paymasterData.length == 0, \"should have no paymasterData\");\n    }\n\n    function _verifyApprovalData(bytes calldata approvalData) internal virtual view{\n        require(approvalData.length == 0, \"should have no approvalData\");\n    }\n\n    /**\n     * @notice The owner of the Paymaster can change the instance of the RelayHub this Paymaster works with.\n     * :warning: **Warning** :warning: The deposit on the previous RelayHub must be withdrawn first.\n     */\n    function setRelayHub(IRelayHub hub) public onlyOwner {\n        require(address(hub).supportsInterface(type(IRelayHub).interfaceId), \"target is not a valid IRelayHub\");\n        relayHub = hub;\n    }\n\n    /**\n     * @notice The owner of the Paymaster can change the instance of the Forwarder this Paymaster works with.\n     * @notice the Recipients must trust this Forwarder as well in order for the configuration to remain functional.\n     */\n    function setTrustedForwarder(address forwarder) public virtual onlyOwner {\n        require(forwarder.supportsInterface(type(IForwarder).interfaceId), \"target is not a valid IForwarder\");\n        _trustedForwarder = forwarder;\n    }\n\n    function getTrustedForwarder() public virtual view override returns (address){\n        return _trustedForwarder;\n    }\n\n    /**\n     * @notice Any native Ether transferred into the paymaster is transferred as a deposit to the RelayHub.\n     * This way, we don't need to understand the RelayHub API in order to replenish the paymaster.\n     */\n    receive() external virtual payable {\n        require(address(relayHub) != address(0), \"relay hub address not set\");\n        relayHub.depositFor{value:msg.value}(address(this));\n    }\n\n    /**\n     * @notice Withdraw deposit from the RelayHub.\n     * @param amount The amount to be subtracted from the sender.\n     * @param target The target to which the amount will be transferred.\n     */\n    function withdrawRelayHubDepositTo(uint256 amount, address payable target) public onlyOwner {\n        relayHub.withdraw(target, amount);\n    }\n\n    /// @inheritdoc IPaymaster\n    function preRelayedCall(\n        GsnTypes.RelayRequest calldata relayRequest,\n        bytes calldata signature,\n        bytes calldata approvalData,\n        uint256 maxPossibleGas\n    )\n    external\n    override\n    returns (bytes memory, bool) {\n        _verifyRelayHubOnly();\n        _verifyForwarder(relayRequest);\n        _verifyValue(relayRequest);\n        _verifyPaymasterData(relayRequest);\n        _verifyApprovalData(approvalData);\n        return _preRelayedCall(relayRequest, signature, approvalData, maxPossibleGas);\n    }\n\n    /**\n     * @notice internal logic the paymasters need to provide to select which transactions they are willing to pay for\n     * @notice see the documentation for `IPaymaster::preRelayedCall` for details\n     */\n    function _preRelayedCall(\n        GsnTypes.RelayRequest calldata,\n        bytes calldata,\n        bytes calldata,\n        uint256\n    )\n    internal\n    virtual\n    returns (bytes memory, bool);\n\n    /// @inheritdoc IPaymaster\n    function postRelayedCall(\n        bytes calldata context,\n        bool success,\n        uint256 gasUseWithoutPost,\n        GsnTypes.RelayData calldata relayData\n    )\n    external\n    override\n    {\n        _verifyRelayHubOnly();\n        _postRelayedCall(context, success, gasUseWithoutPost, relayData);\n    }\n\n    /**\n     * @notice internal logic the paymasters need to provide if they need to take some action after the transaction\n     * @notice see the documentation for `IPaymaster::postRelayedCall` for details\n     */\n    function _postRelayedCall(\n        bytes calldata,\n        bool,\n        uint256,\n        GsnTypes.RelayData calldata\n    )\n    internal\n    virtual;\n}",
    "sourcePath": "/Users/alexf/gsn2/packages/contracts/solpp/BasePaymaster.sol",
    "ast": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/BasePaymaster.sol",
        "exportedSymbols": {
            "BasePaymaster": [
                397
            ],
            "Context": [
                11508
            ],
            "ERC165": [
                12146
            ],
            "ERC165Checker": [
                12340
            ],
            "GsnEip712Library": [
                8464
            ],
            "GsnTypes": [
                8492
            ],
            "GsnUtils": [
                8572
            ],
            "IERC165": [
                12352
            ],
            "IERC20": [
                10849
            ],
            "IERC2771Recipient": [
                5374
            ],
            "IForwarder": [
                5129
            ],
            "IPaymaster": [
                5447
            ],
            "IRelayHub": [
                5896
            ],
            "IStakeManager": [
                6284
            ],
            "MinLibBytes": [
                8687
            ],
            "Ownable": [
                10182
            ]
        },
        "id": 398,
        "license": "GPL-3.0-only",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 1,
                "literals": [
                    "solidity",
                    ">=",
                    "0.7",
                    ".6"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:24:0"
            },
            {
                "id": 2,
                "literals": [
                    "abicoder",
                    "v2"
                ],
                "nodeType": "PragmaDirective",
                "src": "25:19:0"
            },
            {
                "absolutePath": "@openzeppelin/contracts/access/Ownable.sol",
                "file": "@openzeppelin/contracts/access/Ownable.sol",
                "id": 3,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 10183,
                "src": "88:52:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "@openzeppelin/contracts/utils/introspection/ERC165.sol",
                "file": "@openzeppelin/contracts/utils/introspection/ERC165.sol",
                "id": 4,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 12147,
                "src": "141:64:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol",
                "file": "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol",
                "id": 5,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 12341,
                "src": "206:71:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnTypes.sol",
                "file": "./utils/GsnTypes.sol",
                "id": 6,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 8493,
                "src": "279:30:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/interfaces/IPaymaster.sol",
                "file": "./interfaces/IPaymaster.sol",
                "id": 7,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 5448,
                "src": "310:37:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/interfaces/IRelayHub.sol",
                "file": "./interfaces/IRelayHub.sol",
                "id": 8,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 5897,
                "src": "348:36:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnEip712Library.sol",
                "file": "./utils/GsnEip712Library.sol",
                "id": 9,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 8465,
                "src": "385:38:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/forwarder/IForwarder.sol",
                "file": "./forwarder/IForwarder.sol",
                "id": 10,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 5130,
                "src": "424:36:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": true,
                "baseContracts": [
                    {
                        "baseName": {
                            "id": 12,
                            "name": "IPaymaster",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 5447,
                            "src": "653:10:0"
                        },
                        "id": 13,
                        "nodeType": "InheritanceSpecifier",
                        "src": "653:10:0"
                    },
                    {
                        "baseName": {
                            "id": 14,
                            "name": "Ownable",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 10182,
                            "src": "665:7:0"
                        },
                        "id": 15,
                        "nodeType": "InheritanceSpecifier",
                        "src": "665:7:0"
                    },
                    {
                        "baseName": {
                            "id": 16,
                            "name": "ERC165",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 12146,
                            "src": "674:6:0"
                        },
                        "id": 17,
                        "nodeType": "InheritanceSpecifier",
                        "src": "674:6:0"
                    }
                ],
                "contractDependencies": [],
                "contractKind": "contract",
                "documentation": {
                    "id": 11,
                    "nodeType": "StructuredDocumentation",
                    "src": "462:155:0",
                    "text": " @notice An abstract base class to be inherited by a concrete Paymaster.\n A subclass must implement:\n  - preRelayedCall\n  - postRelayedCall"
                },
                "fullyImplemented": false,
                "id": 397,
                "linearizedBaseContracts": [
                    397,
                    12146,
                    10182,
                    11508,
                    5447,
                    12352
                ],
                "name": "BasePaymaster",
                "nameLocation": "636:13:0",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "id": 20,
                        "libraryName": {
                            "id": 18,
                            "name": "ERC165Checker",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 12340,
                            "src": "693:13:0"
                        },
                        "nodeType": "UsingForDirective",
                        "src": "687:32:0",
                        "typeName": {
                            "id": 19,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "711:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                            }
                        }
                    },
                    {
                        "constant": false,
                        "id": 23,
                        "mutability": "mutable",
                        "name": "relayHub",
                        "nameLocation": "744:8:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "725:27:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IRelayHub_$5896",
                            "typeString": "contract IRelayHub"
                        },
                        "typeName": {
                            "id": 22,
                            "nodeType": "UserDefinedTypeName",
                            "pathNode": {
                                "id": 21,
                                "name": "IRelayHub",
                                "nodeType": "IdentifierPath",
                                "referencedDeclaration": 5896,
                                "src": "725:9:0"
                            },
                            "referencedDeclaration": 5896,
                            "src": "725:9:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                "typeString": "contract IRelayHub"
                            }
                        },
                        "visibility": "internal"
                    },
                    {
                        "constant": false,
                        "id": 25,
                        "mutability": "mutable",
                        "name": "_trustedForwarder",
                        "nameLocation": "774:17:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "758:33:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                        },
                        "typeName": {
                            "id": 24,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "758:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                            }
                        },
                        "visibility": "private"
                    },
                    {
                        "baseFunctions": [
                            5410
                        ],
                        "body": {
                            "id": 37,
                            "nodeType": "Block",
                            "src": "891:41:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 34,
                                                "name": "relayHub",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 23,
                                                "src": "916:8:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                    "typeString": "contract IRelayHub"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                    "typeString": "contract IRelayHub"
                                                }
                                            ],
                                            "id": 33,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "908:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_address_$",
                                                "typeString": "type(address)"
                                            },
                                            "typeName": {
                                                "id": 32,
                                                "name": "address",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "908:7:0",
                                                "typeDescriptions": {}
                                            }
                                        },
                                        "id": 35,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "908:17:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "functionReturnParameters": 31,
                                    "id": 36,
                                    "nodeType": "Return",
                                    "src": "901:24:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 26,
                            "nodeType": "StructuredDocumentation",
                            "src": "798:26:0",
                            "text": "@inheritdoc IPaymaster"
                        },
                        "functionSelector": "7bdf2ec7",
                        "id": 38,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "getRelayHub",
                        "nameLocation": "838:11:0",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 28,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "859:8:0"
                        },
                        "parameters": {
                            "id": 27,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "849:2:0"
                        },
                        "returnParameters": {
                            "id": 31,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 30,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 38,
                                    "src": "882:7:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 29,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "882:7:0",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "881:9:0"
                        },
                        "scope": 397,
                        "src": "829:103:0",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "b90b41cf",
                        "id": 41,
                        "mutability": "constant",
                        "name": "FORWARDER_HUB_OVERHEAD",
                        "nameLocation": "1027:22:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "1003:54:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                        },
                        "typeName": {
                            "id": 39,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "1003:7:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "value": {
                            "hexValue": "3530303030",
                            "id": 40,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1052:5:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_rational_50000_by_1",
                                "typeString": "int_const 50000"
                            },
                            "value": "50000"
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "f9c002f7",
                        "id": 44,
                        "mutability": "constant",
                        "name": "PRE_RELAYED_CALL_GAS_LIMIT",
                        "nameLocation": "1157:26:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "1133:59:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                        },
                        "typeName": {
                            "id": 42,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "1133:7:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "value": {
                            "hexValue": "313030303030",
                            "id": 43,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1186:6:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_rational_100000_by_1",
                                "typeString": "int_const 100000"
                            },
                            "value": "100000"
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "bbdaa3c9",
                        "id": 47,
                        "mutability": "constant",
                        "name": "POST_RELAYED_CALL_GAS_LIMIT",
                        "nameLocation": "1222:27:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "1198:60:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                        },
                        "typeName": {
                            "id": 45,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "1198:7:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "value": {
                            "hexValue": "313130303030",
                            "id": 46,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1252:6:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_rational_110000_by_1",
                                "typeString": "int_const 110000"
                            },
                            "value": "110000"
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "df463a66",
                        "id": 52,
                        "mutability": "constant",
                        "name": "PAYMASTER_ACCEPTANCE_BUDGET",
                        "nameLocation": "1288:27:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "1264:105:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                        },
                        "typeName": {
                            "id": 48,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "1264:7:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "value": {
                            "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            },
                            "id": 51,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "leftExpression": {
                                "id": 49,
                                "name": "PRE_RELAYED_CALL_GAS_LIMIT",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 44,
                                "src": "1318:26:0",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "+",
                            "rightExpression": {
                                "id": 50,
                                "name": "FORWARDER_HUB_OVERHEAD",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 41,
                                "src": "1347:22:0",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                }
                            },
                            "src": "1318:51:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "5c5e3db1",
                        "id": 55,
                        "mutability": "constant",
                        "name": "CALLDATA_SIZE_LIMIT",
                        "nameLocation": "1399:19:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "1375:51:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                        },
                        "typeName": {
                            "id": 53,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "1375:7:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "value": {
                            "hexValue": "3130353030",
                            "id": 54,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1421:5:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_rational_10500_by_1",
                                "typeString": "int_const 10500"
                            },
                            "value": "10500"
                        },
                        "visibility": "public"
                    },
                    {
                        "baseFunctions": [
                            12145,
                            12351
                        ],
                        "body": {
                            "id": 85,
                            "nodeType": "Block",
                            "src": "1569:175:0",
                            "statements": [
                                {
                                    "expression": {
                                        "commonType": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        },
                                        "id": 83,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                            "commonType": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            },
                                            "id": 78,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                                "commonType": {
                                                    "typeIdentifier": "t_bytes4",
                                                    "typeString": "bytes4"
                                                },
                                                "id": 71,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "id": 66,
                                                    "name": "interfaceId",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 58,
                                                    "src": "1586:11:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes4",
                                                        "typeString": "bytes4"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "expression": {
                                                        "arguments": [
                                                            {
                                                                "id": 68,
                                                                "name": "IPaymaster",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 5447,
                                                                "src": "1606:10:0",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_type$_t_contract$_IPaymaster_$5447_$",
                                                                    "typeString": "type(contract IPaymaster)"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_type$_t_contract$_IPaymaster_$5447_$",
                                                                    "typeString": "type(contract IPaymaster)"
                                                                }
                                                            ],
                                                            "id": 67,
                                                            "name": "type",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967269,
                                                            "src": "1601:4:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                                                                "typeString": "function () pure"
                                                            }
                                                        },
                                                        "id": 69,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "1601:16:0",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_meta_type_t_contract$_IPaymaster_$5447",
                                                            "typeString": "type(contract IPaymaster)"
                                                        }
                                                    },
                                                    "id": 70,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "memberName": "interfaceId",
                                                    "nodeType": "MemberAccess",
                                                    "src": "1601:28:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes4",
                                                        "typeString": "bytes4"
                                                    }
                                                },
                                                "src": "1586:43:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "||",
                                            "rightExpression": {
                                                "commonType": {
                                                    "typeIdentifier": "t_bytes4",
                                                    "typeString": "bytes4"
                                                },
                                                "id": 77,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "id": 72,
                                                    "name": "interfaceId",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 58,
                                                    "src": "1645:11:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes4",
                                                        "typeString": "bytes4"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "expression": {
                                                        "arguments": [
                                                            {
                                                                "id": 74,
                                                                "name": "Ownable",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 10182,
                                                                "src": "1665:7:0",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_type$_t_contract$_Ownable_$10182_$",
                                                                    "typeString": "type(contract Ownable)"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_type$_t_contract$_Ownable_$10182_$",
                                                                    "typeString": "type(contract Ownable)"
                                                                }
                                                            ],
                                                            "id": 73,
                                                            "name": "type",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967269,
                                                            "src": "1660:4:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                                                                "typeString": "function () pure"
                                                            }
                                                        },
                                                        "id": 75,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "1660:13:0",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_meta_type_t_contract$_Ownable_$10182",
                                                            "typeString": "type(contract Ownable)"
                                                        }
                                                    },
                                                    "id": 76,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "memberName": "interfaceId",
                                                    "nodeType": "MemberAccess",
                                                    "src": "1660:25:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes4",
                                                        "typeString": "bytes4"
                                                    }
                                                },
                                                "src": "1645:40:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            "src": "1586:99:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "||",
                                        "rightExpression": {
                                            "arguments": [
                                                {
                                                    "id": 81,
                                                    "name": "interfaceId",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 58,
                                                    "src": "1725:11:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes4",
                                                        "typeString": "bytes4"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_bytes4",
                                                        "typeString": "bytes4"
                                                    }
                                                ],
                                                "expression": {
                                                    "id": 79,
                                                    "name": "super",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 4294967271,
                                                    "src": "1701:5:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_super$_BasePaymaster_$397_$",
                                                        "typeString": "type(contract super BasePaymaster)"
                                                    }
                                                },
                                                "id": 80,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "supportsInterface",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 12145,
                                                "src": "1701:23:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_internal_view$_t_bytes4_$returns$_t_bool_$",
                                                    "typeString": "function (bytes4) view returns (bool)"
                                                }
                                            },
                                            "id": 82,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "1701:36:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "src": "1586:151:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "functionReturnParameters": 65,
                                    "id": 84,
                                    "nodeType": "Return",
                                    "src": "1579:158:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 56,
                            "nodeType": "StructuredDocumentation",
                            "src": "1433:23:0",
                            "text": "@inheritdoc IERC165"
                        },
                        "functionSelector": "01ffc9a7",
                        "id": 86,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "supportsInterface",
                        "nameLocation": "1470:17:0",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 62,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [
                                {
                                    "id": 60,
                                    "name": "IERC165",
                                    "nodeType": "IdentifierPath",
                                    "referencedDeclaration": 12352,
                                    "src": "1537:7:0"
                                },
                                {
                                    "id": 61,
                                    "name": "ERC165",
                                    "nodeType": "IdentifierPath",
                                    "referencedDeclaration": 12146,
                                    "src": "1546:6:0"
                                }
                            ],
                            "src": "1528:25:0"
                        },
                        "parameters": {
                            "id": 59,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 58,
                                    "mutability": "mutable",
                                    "name": "interfaceId",
                                    "nameLocation": "1495:11:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 86,
                                    "src": "1488:18:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes4",
                                        "typeString": "bytes4"
                                    },
                                    "typeName": {
                                        "id": 57,
                                        "name": "bytes4",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1488:6:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes4",
                                            "typeString": "bytes4"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1487:20:0"
                        },
                        "returnParameters": {
                            "id": 65,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 64,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 86,
                                    "src": "1563:4:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 63,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1563:4:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1562:6:0"
                        },
                        "scope": 397,
                        "src": "1461:283:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "public"
                    },
                    {
                        "baseFunctions": [
                            5398
                        ],
                        "body": {
                            "id": 102,
                            "nodeType": "Block",
                            "src": "1927:216:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 96,
                                                "name": "PAYMASTER_ACCEPTANCE_BUDGET",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 52,
                                                "src": "1985:27:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            {
                                                "id": 97,
                                                "name": "PRE_RELAYED_CALL_GAS_LIMIT",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 44,
                                                "src": "2026:26:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            {
                                                "id": 98,
                                                "name": "POST_RELAYED_CALL_GAS_LIMIT",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 47,
                                                "src": "2066:27:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            {
                                                "id": 99,
                                                "name": "CALLDATA_SIZE_LIMIT",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 55,
                                                "src": "2107:19:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            ],
                                            "expression": {
                                                "id": 94,
                                                "name": "IPaymaster",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 5447,
                                                "src": "1944:10:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_IPaymaster_$5447_$",
                                                    "typeString": "type(contract IPaymaster)"
                                                }
                                            },
                                            "id": 95,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "GasAndDataLimits",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 5391,
                                            "src": "1944:27:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_struct$_GasAndDataLimits_$5391_storage_ptr_$",
                                                "typeString": "type(struct IPaymaster.GasAndDataLimits storage pointer)"
                                            }
                                        },
                                        "id": 100,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "structConstructorCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "1944:192:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_GasAndDataLimits_$5391_memory_ptr",
                                            "typeString": "struct IPaymaster.GasAndDataLimits memory"
                                        }
                                    },
                                    "functionReturnParameters": 93,
                                    "id": 101,
                                    "nodeType": "Return",
                                    "src": "1937:199:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 87,
                            "nodeType": "StructuredDocumentation",
                            "src": "1750:26:0",
                            "text": "@inheritdoc IPaymaster"
                        },
                        "functionSelector": "b039a88f",
                        "id": 103,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "getGasAndDataLimits",
                        "nameLocation": "1790:19:0",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 89,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "1827:8:0"
                        },
                        "parameters": {
                            "id": 88,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1809:2:0"
                        },
                        "returnParameters": {
                            "id": 93,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 92,
                                    "mutability": "mutable",
                                    "name": "limits",
                                    "nameLocation": "1914:6:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 103,
                                    "src": "1879:41:0",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_GasAndDataLimits_$5391_memory_ptr",
                                        "typeString": "struct IPaymaster.GasAndDataLimits"
                                    },
                                    "typeName": {
                                        "id": 91,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 90,
                                            "name": "IPaymaster.GasAndDataLimits",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 5391,
                                            "src": "1879:27:0"
                                        },
                                        "referencedDeclaration": 5391,
                                        "src": "1879:27:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_GasAndDataLimits_$5391_storage_ptr",
                                            "typeString": "struct IPaymaster.GasAndDataLimits"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1869:57:0"
                        },
                        "scope": 397,
                        "src": "1781:362:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 126,
                            "nodeType": "Block",
                            "src": "2441:174:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                "id": 116,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "arguments": [],
                                                    "expression": {
                                                        "argumentTypes": [],
                                                        "id": 111,
                                                        "name": "getTrustedForwarder",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 248,
                                                        "src": "2459:19:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                                            "typeString": "function () view returns (address)"
                                                        }
                                                    },
                                                    "id": 112,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "2459:21:0",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "expression": {
                                                        "expression": {
                                                            "id": 113,
                                                            "name": "relayRequest",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 107,
                                                            "src": "2484:12:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayRequest calldata"
                                                            }
                                                        },
                                                        "id": 114,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "relayData",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8490,
                                                        "src": "2484:22:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                            "typeString": "struct GsnTypes.RelayData calldata"
                                                        }
                                                    },
                                                    "id": 115,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "forwarder",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 8479,
                                                    "src": "2484:32:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "src": "2459:57:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "466f72776172646572206973206e6f742074727573746564",
                                                "id": 117,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2518:26:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_3a2fca03255f31860c82d52f1191f77065f7ff670c017cd47e3568fc231bf429",
                                                    "typeString": "literal_string \"Forwarder is not trusted\""
                                                },
                                                "value": "Forwarder is not trusted"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_3a2fca03255f31860c82d52f1191f77065f7ff670c017cd47e3568fc231bf429",
                                                    "typeString": "literal_string \"Forwarder is not trusted\""
                                                }
                                            ],
                                            "id": 110,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "2451:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 118,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2451:94:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 119,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2451:94:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 123,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 107,
                                                "src": "2595:12:0",
                                                "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"
                                                }
                                            ],
                                            "expression": {
                                                "id": 120,
                                                "name": "GsnEip712Library",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8464,
                                                "src": "2555:16:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                    "typeString": "type(library GsnEip712Library)"
                                                }
                                            },
                                            "id": 122,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "verifyForwarderTrusted",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 8210,
                                            "src": "2555:39:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$__$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) view"
                                            }
                                        },
                                        "id": 124,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2555:53:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 125,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2555:53:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 104,
                            "nodeType": "StructuredDocumentation",
                            "src": "2149:178:0",
                            "text": " @notice this method must be called from preRelayedCall to validate that the forwarder\n is approved by the paymaster as well as by the recipient contract."
                        },
                        "id": 127,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_verifyForwarder",
                        "nameLocation": "2341:16:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 108,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 107,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "2389:12:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 127,
                                    "src": "2358:43:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 106,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 105,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "2358:21:0"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "2358:21:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2357:45:0"
                        },
                        "returnParameters": {
                            "id": 109,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2441:0:0"
                        },
                        "scope": 397,
                        "src": "2332:283:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 139,
                            "nodeType": "Block",
                            "src": "2674:87:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                "id": 135,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "expression": {
                                                        "id": 131,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "2692:3:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 132,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "sender",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2692:10:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "arguments": [],
                                                    "expression": {
                                                        "argumentTypes": [],
                                                        "id": 133,
                                                        "name": "getRelayHub",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 38,
                                                        "src": "2706:11:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                                            "typeString": "function () view returns (address)"
                                                        }
                                                    },
                                                    "id": 134,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "2706:13:0",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "src": "2692:27:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "63616e206f6e6c792062652063616c6c65642062792052656c6179487562",
                                                "id": 136,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2721:32:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_d169f51e5e283c8c890697eb898c30495d34dbb12b80eb91ce172a0d9c75ebfb",
                                                    "typeString": "literal_string \"can only be called by RelayHub\""
                                                },
                                                "value": "can only be called by RelayHub"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_d169f51e5e283c8c890697eb898c30495d34dbb12b80eb91ce172a0d9c75ebfb",
                                                    "typeString": "literal_string \"can only be called by RelayHub\""
                                                }
                                            ],
                                            "id": 130,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "2684:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 137,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2684:70:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 138,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2684:70:0"
                                }
                            ]
                        },
                        "id": 140,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_verifyRelayHubOnly",
                        "nameLocation": "2630:19:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 128,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2649:2:0"
                        },
                        "returnParameters": {
                            "id": 129,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2674:0:0"
                        },
                        "scope": 397,
                        "src": "2621:140:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 155,
                            "nodeType": "Block",
                            "src": "2855:89:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                "id": 151,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "expression": {
                                                        "expression": {
                                                            "id": 147,
                                                            "name": "relayRequest",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 143,
                                                            "src": "2873:12:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayRequest calldata"
                                                            }
                                                        },
                                                        "id": 148,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "request",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8487,
                                                        "src": "2873:20:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                            "typeString": "struct IForwarder.ForwardRequest calldata"
                                                        }
                                                    },
                                                    "id": 149,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "value",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 5049,
                                                    "src": "2873:26:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "hexValue": "30",
                                                    "id": 150,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "number",
                                                    "lValueRequested": false,
                                                    "nodeType": "Literal",
                                                    "src": "2903:1:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_rational_0_by_1",
                                                        "typeString": "int_const 0"
                                                    },
                                                    "value": "0"
                                                },
                                                "src": "2873:31:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "76616c7565207472616e73666572206e6f7420737570706f72746564",
                                                "id": 152,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2906:30:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_e16e7b15b3ab333edb68f7b1a990600092795acc5fc3b3a41ef443557f01e8e8",
                                                    "typeString": "literal_string \"value transfer not supported\""
                                                },
                                                "value": "value transfer not supported"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_e16e7b15b3ab333edb68f7b1a990600092795acc5fc3b3a41ef443557f01e8e8",
                                                    "typeString": "literal_string \"value transfer not supported\""
                                                }
                                            ],
                                            "id": 146,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "2865:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 153,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2865:72:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 154,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2865:72:0"
                                }
                            ]
                        },
                        "id": 156,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_verifyValue",
                        "nameLocation": "2776:12:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 144,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 143,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "2820:12:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 156,
                                    "src": "2789:43:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 142,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 141,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "2789:21:0"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "2789:21:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2788:45:0"
                        },
                        "returnParameters": {
                            "id": 145,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2855:0:0"
                        },
                        "scope": 397,
                        "src": "2767:177:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 172,
                            "nodeType": "Block",
                            "src": "3047:106:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                "id": 168,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "expression": {
                                                        "expression": {
                                                            "expression": {
                                                                "id": 163,
                                                                "name": "relayRequest",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 159,
                                                                "src": "3065:12:0",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                                }
                                                            },
                                                            "id": 164,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "memberName": "relayData",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": 8490,
                                                            "src": "3065:22:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 165,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "paymasterData",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8481,
                                                        "src": "3065:36:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes_calldata_ptr",
                                                            "typeString": "bytes calldata"
                                                        }
                                                    },
                                                    "id": 166,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "length",
                                                    "nodeType": "MemberAccess",
                                                    "src": "3065:43:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "hexValue": "30",
                                                    "id": 167,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "number",
                                                    "lValueRequested": false,
                                                    "nodeType": "Literal",
                                                    "src": "3112:1:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_rational_0_by_1",
                                                        "typeString": "int_const 0"
                                                    },
                                                    "value": "0"
                                                },
                                                "src": "3065:48:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "73686f756c642068617665206e6f207061796d617374657244617461",
                                                "id": 169,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "3115:30:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_182b40eb1561ed39a86edc754bf2a5f045daef24c145773d4b18340a470251b6",
                                                    "typeString": "literal_string \"should have no paymasterData\""
                                                },
                                                "value": "should have no paymasterData"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_182b40eb1561ed39a86edc754bf2a5f045daef24c145773d4b18340a470251b6",
                                                    "typeString": "literal_string \"should have no paymasterData\""
                                                }
                                            ],
                                            "id": 162,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "3057:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 170,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3057:89:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 171,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3057:89:0"
                                }
                            ]
                        },
                        "id": 173,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_verifyPaymasterData",
                        "nameLocation": "2959:20:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 160,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 159,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "3011:12:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 173,
                                    "src": "2980:43:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 158,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 157,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "2980:21:0"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "2980:21:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2979:45:0"
                        },
                        "returnParameters": {
                            "id": 161,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "3047:0:0"
                        },
                        "scope": 397,
                        "src": "2950:203:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 186,
                            "nodeType": "Block",
                            "src": "3238:81:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                "id": 182,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "expression": {
                                                        "id": 179,
                                                        "name": "approvalData",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 175,
                                                        "src": "3256:12:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes_calldata_ptr",
                                                            "typeString": "bytes calldata"
                                                        }
                                                    },
                                                    "id": 180,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "length",
                                                    "nodeType": "MemberAccess",
                                                    "src": "3256:19:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "hexValue": "30",
                                                    "id": 181,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "number",
                                                    "lValueRequested": false,
                                                    "nodeType": "Literal",
                                                    "src": "3279:1:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_rational_0_by_1",
                                                        "typeString": "int_const 0"
                                                    },
                                                    "value": "0"
                                                },
                                                "src": "3256:24:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "73686f756c642068617665206e6f20617070726f76616c44617461",
                                                "id": 183,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "3282:29:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_fccc4b6995a94cdc6e6e9a1b088f6ad31bd641a326f5e5ddcc3773886206aa37",
                                                    "typeString": "literal_string \"should have no approvalData\""
                                                },
                                                "value": "should have no approvalData"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_fccc4b6995a94cdc6e6e9a1b088f6ad31bd641a326f5e5ddcc3773886206aa37",
                                                    "typeString": "literal_string \"should have no approvalData\""
                                                }
                                            ],
                                            "id": 178,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "3248:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 184,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3248:64:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 185,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3248:64:0"
                                }
                            ]
                        },
                        "id": 187,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_verifyApprovalData",
                        "nameLocation": "3168:19:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 176,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 175,
                                    "mutability": "mutable",
                                    "name": "approvalData",
                                    "nameLocation": "3203:12:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 187,
                                    "src": "3188:27:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 174,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3188:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3187:29:0"
                        },
                        "returnParameters": {
                            "id": 177,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "3238:0:0"
                        },
                        "scope": 397,
                        "src": "3159:160:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 214,
                            "nodeType": "Block",
                            "src": "3604:144:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "expression": {
                                                            "arguments": [
                                                                {
                                                                    "id": 203,
                                                                    "name": "IRelayHub",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 5896,
                                                                    "src": "3658:9:0",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_type$_t_contract$_IRelayHub_$5896_$",
                                                                        "typeString": "type(contract IRelayHub)"
                                                                    }
                                                                }
                                                            ],
                                                            "expression": {
                                                                "argumentTypes": [
                                                                    {
                                                                        "typeIdentifier": "t_type$_t_contract$_IRelayHub_$5896_$",
                                                                        "typeString": "type(contract IRelayHub)"
                                                                    }
                                                                ],
                                                                "id": 202,
                                                                "name": "type",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 4294967269,
                                                                "src": "3653:4:0",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                                                                    "typeString": "function () pure"
                                                                }
                                                            },
                                                            "id": 204,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "kind": "functionCall",
                                                            "lValueRequested": false,
                                                            "names": [],
                                                            "nodeType": "FunctionCall",
                                                            "src": "3653:15:0",
                                                            "tryCall": false,
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_magic_meta_type_t_contract$_IRelayHub_$5896",
                                                                "typeString": "type(contract IRelayHub)"
                                                            }
                                                        },
                                                        "id": 205,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "memberName": "interfaceId",
                                                        "nodeType": "MemberAccess",
                                                        "src": "3653:27:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes4",
                                                            "typeString": "bytes4"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_bytes4",
                                                            "typeString": "bytes4"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "arguments": [
                                                            {
                                                                "id": 199,
                                                                "name": "hub",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 191,
                                                                "src": "3630:3:0",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                                    "typeString": "contract IRelayHub"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                                    "typeString": "contract IRelayHub"
                                                                }
                                                            ],
                                                            "id": 198,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "nodeType": "ElementaryTypeNameExpression",
                                                            "src": "3622:7:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_type$_t_address_$",
                                                                "typeString": "type(address)"
                                                            },
                                                            "typeName": {
                                                                "id": 197,
                                                                "name": "address",
                                                                "nodeType": "ElementaryTypeName",
                                                                "src": "3622:7:0",
                                                                "typeDescriptions": {}
                                                            }
                                                        },
                                                        "id": 200,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "typeConversion",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "3622:12:0",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    "id": 201,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "supportsInterface",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 12196,
                                                    "src": "3622:30:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$bound_to$_t_address_$",
                                                        "typeString": "function (address,bytes4) view returns (bool)"
                                                    }
                                                },
                                                "id": 206,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "3622:59:0",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "746172676574206973206e6f7420612076616c6964204952656c6179487562",
                                                "id": 207,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "3683:33:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_b62b61dba941996cba530085b5313ea27667d0ee2b85e1209b8aedd3e5e9398e",
                                                    "typeString": "literal_string \"target is not a valid IRelayHub\""
                                                },
                                                "value": "target is not a valid IRelayHub"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_b62b61dba941996cba530085b5313ea27667d0ee2b85e1209b8aedd3e5e9398e",
                                                    "typeString": "literal_string \"target is not a valid IRelayHub\""
                                                }
                                            ],
                                            "id": 196,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "3614:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 208,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3614:103:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 209,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3614:103:0"
                                },
                                {
                                    "expression": {
                                        "id": 212,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "id": 210,
                                            "name": "relayHub",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 23,
                                            "src": "3727:8:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                "typeString": "contract IRelayHub"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "id": 211,
                                            "name": "hub",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 191,
                                            "src": "3738:3:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                "typeString": "contract IRelayHub"
                                            }
                                        },
                                        "src": "3727:14:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                            "typeString": "contract IRelayHub"
                                        }
                                    },
                                    "id": 213,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3727:14:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 188,
                            "nodeType": "StructuredDocumentation",
                            "src": "3325:221:0",
                            "text": " @notice The owner of the Paymaster can change the instance of the RelayHub this Paymaster works with.\n :warning: **Warning** :warning: The deposit on the previous RelayHub must be withdrawn first."
                        },
                        "functionSelector": "7bb05264",
                        "id": 215,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [
                            {
                                "id": 194,
                                "kind": "modifierInvocation",
                                "modifierName": {
                                    "id": 193,
                                    "name": "onlyOwner",
                                    "nodeType": "IdentifierPath",
                                    "referencedDeclaration": 10101,
                                    "src": "3594:9:0"
                                },
                                "nodeType": "ModifierInvocation",
                                "src": "3594:9:0"
                            }
                        ],
                        "name": "setRelayHub",
                        "nameLocation": "3560:11:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 192,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 191,
                                    "mutability": "mutable",
                                    "name": "hub",
                                    "nameLocation": "3582:3:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 215,
                                    "src": "3572:13:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                        "typeString": "contract IRelayHub"
                                    },
                                    "typeName": {
                                        "id": 190,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 189,
                                            "name": "IRelayHub",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 5896,
                                            "src": "3572:9:0"
                                        },
                                        "referencedDeclaration": 5896,
                                        "src": "3572:9:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                            "typeString": "contract IRelayHub"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3571:15:0"
                        },
                        "returnParameters": {
                            "id": 195,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "3604:0:0"
                        },
                        "scope": 397,
                        "src": "3551:197:0",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 238,
                            "nodeType": "Block",
                            "src": "4070:158:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "expression": {
                                                            "arguments": [
                                                                {
                                                                    "id": 227,
                                                                    "name": "IForwarder",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 5129,
                                                                    "src": "4121:10:0",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_type$_t_contract$_IForwarder_$5129_$",
                                                                        "typeString": "type(contract IForwarder)"
                                                                    }
                                                                }
                                                            ],
                                                            "expression": {
                                                                "argumentTypes": [
                                                                    {
                                                                        "typeIdentifier": "t_type$_t_contract$_IForwarder_$5129_$",
                                                                        "typeString": "type(contract IForwarder)"
                                                                    }
                                                                ],
                                                                "id": 226,
                                                                "name": "type",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 4294967269,
                                                                "src": "4116:4:0",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                                                                    "typeString": "function () pure"
                                                                }
                                                            },
                                                            "id": 228,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "kind": "functionCall",
                                                            "lValueRequested": false,
                                                            "names": [],
                                                            "nodeType": "FunctionCall",
                                                            "src": "4116:16:0",
                                                            "tryCall": false,
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_magic_meta_type_t_contract$_IForwarder_$5129",
                                                                "typeString": "type(contract IForwarder)"
                                                            }
                                                        },
                                                        "id": 229,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "memberName": "interfaceId",
                                                        "nodeType": "MemberAccess",
                                                        "src": "4116:28:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes4",
                                                            "typeString": "bytes4"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_bytes4",
                                                            "typeString": "bytes4"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "id": 224,
                                                        "name": "forwarder",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 218,
                                                        "src": "4088:9:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    "id": 225,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "supportsInterface",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 12196,
                                                    "src": "4088:27:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$bound_to$_t_address_$",
                                                        "typeString": "function (address,bytes4) view returns (bool)"
                                                    }
                                                },
                                                "id": 230,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "4088:57:0",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "746172676574206973206e6f7420612076616c69642049466f72776172646572",
                                                "id": 231,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "4147:34:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_4f35ce95c64a40a715e95a1b7d3fe84cf613d64347e430eb5f35903ecdb7e24d",
                                                    "typeString": "literal_string \"target is not a valid IForwarder\""
                                                },
                                                "value": "target is not a valid IForwarder"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_4f35ce95c64a40a715e95a1b7d3fe84cf613d64347e430eb5f35903ecdb7e24d",
                                                    "typeString": "literal_string \"target is not a valid IForwarder\""
                                                }
                                            ],
                                            "id": 223,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "4080:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 232,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "4080:102:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 233,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4080:102:0"
                                },
                                {
                                    "expression": {
                                        "id": 236,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "id": 234,
                                            "name": "_trustedForwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25,
                                            "src": "4192:17:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "id": 235,
                                            "name": "forwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 218,
                                            "src": "4212:9:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "src": "4192:29:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "id": 237,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4192:29:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 216,
                            "nodeType": "StructuredDocumentation",
                            "src": "3754:238:0",
                            "text": " @notice The owner of the Paymaster can change the instance of the Forwarder this Paymaster works with.\n @notice the Recipients must trust this Forwarder as well in order for the configuration to remain functional."
                        },
                        "functionSelector": "da742228",
                        "id": 239,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [
                            {
                                "id": 221,
                                "kind": "modifierInvocation",
                                "modifierName": {
                                    "id": 220,
                                    "name": "onlyOwner",
                                    "nodeType": "IdentifierPath",
                                    "referencedDeclaration": 10101,
                                    "src": "4060:9:0"
                                },
                                "nodeType": "ModifierInvocation",
                                "src": "4060:9:0"
                            }
                        ],
                        "name": "setTrustedForwarder",
                        "nameLocation": "4006:19:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 219,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 218,
                                    "mutability": "mutable",
                                    "name": "forwarder",
                                    "nameLocation": "4034:9:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 239,
                                    "src": "4026:17:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 217,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4026:7:0",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4025:19:0"
                        },
                        "returnParameters": {
                            "id": 222,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4070:0:0"
                        },
                        "scope": 397,
                        "src": "3997:231:0",
                        "stateMutability": "nonpayable",
                        "virtual": true,
                        "visibility": "public"
                    },
                    {
                        "baseFunctions": [
                            5404
                        ],
                        "body": {
                            "id": 247,
                            "nodeType": "Block",
                            "src": "4311:41:0",
                            "statements": [
                                {
                                    "expression": {
                                        "id": 245,
                                        "name": "_trustedForwarder",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25,
                                        "src": "4328:17:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "functionReturnParameters": 244,
                                    "id": 246,
                                    "nodeType": "Return",
                                    "src": "4321:24:0"
                                }
                            ]
                        },
                        "functionSelector": "ce1b815f",
                        "id": 248,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "getTrustedForwarder",
                        "nameLocation": "4243:19:0",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 241,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "4285:8:0"
                        },
                        "parameters": {
                            "id": 240,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4262:2:0"
                        },
                        "returnParameters": {
                            "id": 244,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 243,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 248,
                                    "src": "4303:7:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 242,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4303:7:0",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4302:9:0"
                        },
                        "scope": 397,
                        "src": "4234:118:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 277,
                            "nodeType": "Block",
                            "src": "4616:147:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                "id": 261,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "arguments": [
                                                        {
                                                            "id": 255,
                                                            "name": "relayHub",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 23,
                                                            "src": "4642:8:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                                "typeString": "contract IRelayHub"
                                                            }
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                                "typeString": "contract IRelayHub"
                                                            }
                                                        ],
                                                        "id": 254,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "ElementaryTypeNameExpression",
                                                        "src": "4634:7:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_address_$",
                                                            "typeString": "type(address)"
                                                        },
                                                        "typeName": {
                                                            "id": 253,
                                                            "name": "address",
                                                            "nodeType": "ElementaryTypeName",
                                                            "src": "4634:7:0",
                                                            "typeDescriptions": {}
                                                        }
                                                    },
                                                    "id": 256,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "typeConversion",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "4634:17:0",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "!=",
                                                "rightExpression": {
                                                    "arguments": [
                                                        {
                                                            "hexValue": "30",
                                                            "id": 259,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "kind": "number",
                                                            "lValueRequested": false,
                                                            "nodeType": "Literal",
                                                            "src": "4663:1:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_rational_0_by_1",
                                                                "typeString": "int_const 0"
                                                            },
                                                            "value": "0"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_rational_0_by_1",
                                                                "typeString": "int_const 0"
                                                            }
                                                        ],
                                                        "id": 258,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "ElementaryTypeNameExpression",
                                                        "src": "4655:7:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_address_$",
                                                            "typeString": "type(address)"
                                                        },
                                                        "typeName": {
                                                            "id": 257,
                                                            "name": "address",
                                                            "nodeType": "ElementaryTypeName",
                                                            "src": "4655:7:0",
                                                            "typeDescriptions": {}
                                                        }
                                                    },
                                                    "id": 260,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "typeConversion",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "4655:10:0",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "src": "4634:31:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "72656c6179206875622061646472657373206e6f7420736574",
                                                "id": 262,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "4667:27:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_2e4bcc216326d2d371e2433ec8e1af9c54827701515af7cd10f9acc79120d313",
                                                    "typeString": "literal_string \"relay hub address not set\""
                                                },
                                                "value": "relay hub address not set"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_2e4bcc216326d2d371e2433ec8e1af9c54827701515af7cd10f9acc79120d313",
                                                    "typeString": "literal_string \"relay hub address not set\""
                                                }
                                            ],
                                            "id": 252,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "4626:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 263,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "4626:69:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 264,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4626:69:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "id": 273,
                                                        "name": "this",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967268,
                                                        "src": "4750:4:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_contract$_BasePaymaster_$397",
                                                            "typeString": "contract BasePaymaster"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_contract$_BasePaymaster_$397",
                                                            "typeString": "contract BasePaymaster"
                                                        }
                                                    ],
                                                    "id": 272,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "nodeType": "ElementaryTypeNameExpression",
                                                    "src": "4742:7:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_address_$",
                                                        "typeString": "type(address)"
                                                    },
                                                    "typeName": {
                                                        "id": 271,
                                                        "name": "address",
                                                        "nodeType": "ElementaryTypeName",
                                                        "src": "4742:7:0",
                                                        "typeDescriptions": {}
                                                    }
                                                },
                                                "id": 274,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "typeConversion",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "4742:13:0",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                ],
                                                "expression": {
                                                    "id": 265,
                                                    "name": "relayHub",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 23,
                                                    "src": "4705:8:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                        "typeString": "contract IRelayHub"
                                                    }
                                                },
                                                "id": 267,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "depositFor",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 5687,
                                                "src": "4705:19:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_external_payable$_t_address_$returns$__$",
                                                    "typeString": "function (address) payable external"
                                                }
                                            },
                                            "id": 270,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "names": [
                                                "value"
                                            ],
                                            "nodeType": "FunctionCallOptions",
                                            "options": [
                                                {
                                                    "expression": {
                                                        "id": 268,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "4731:3:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 269,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "value",
                                                    "nodeType": "MemberAccess",
                                                    "src": "4731:9:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                }
                                            ],
                                            "src": "4705:36:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_external_payable$_t_address_$returns$__$value",
                                                "typeString": "function (address) payable external"
                                            }
                                        },
                                        "id": 275,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "4705:51:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 276,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4705:51:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 249,
                            "nodeType": "StructuredDocumentation",
                            "src": "4358:218:0",
                            "text": " @notice Any native Ether transferred into the paymaster is transferred as a deposit to the RelayHub.\n This way, we don't need to understand the RelayHub API in order to replenish the paymaster."
                        },
                        "id": 278,
                        "implemented": true,
                        "kind": "receive",
                        "modifiers": [],
                        "name": "",
                        "nameLocation": "-1:-1:-1",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 250,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4588:2:0"
                        },
                        "returnParameters": {
                            "id": 251,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4616:0:0"
                        },
                        "scope": 397,
                        "src": "4581:182:0",
                        "stateMutability": "payable",
                        "virtual": true,
                        "visibility": "external"
                    },
                    {
                        "body": {
                            "id": 295,
                            "nodeType": "Block",
                            "src": "5067:50:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 291,
                                                "name": "target",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 283,
                                                "src": "5095:6:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address_payable",
                                                    "typeString": "address payable"
                                                }
                                            },
                                            {
                                                "id": 292,
                                                "name": "amount",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 281,
                                                "src": "5103:6:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_address_payable",
                                                    "typeString": "address payable"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            ],
                                            "expression": {
                                                "id": 288,
                                                "name": "relayHub",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 23,
                                                "src": "5077:8:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                    "typeString": "contract IRelayHub"
                                                }
                                            },
                                            "id": 290,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "withdraw",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 5695,
                                            "src": "5077:17:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_external_nonpayable$_t_address_payable_$_t_uint256_$returns$__$",
                                                "typeString": "function (address payable,uint256) external"
                                            }
                                        },
                                        "id": 293,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5077:33:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 294,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5077:33:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 279,
                            "nodeType": "StructuredDocumentation",
                            "src": "4769:201:0",
                            "text": " @notice Withdraw deposit from the RelayHub.\n @param amount The amount to be subtracted from the sender.\n @param target The target to which the amount will be transferred."
                        },
                        "functionSelector": "2d14c4b7",
                        "id": 296,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [
                            {
                                "id": 286,
                                "kind": "modifierInvocation",
                                "modifierName": {
                                    "id": 285,
                                    "name": "onlyOwner",
                                    "nodeType": "IdentifierPath",
                                    "referencedDeclaration": 10101,
                                    "src": "5057:9:0"
                                },
                                "nodeType": "ModifierInvocation",
                                "src": "5057:9:0"
                            }
                        ],
                        "name": "withdrawRelayHubDepositTo",
                        "nameLocation": "4984:25:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 284,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 281,
                                    "mutability": "mutable",
                                    "name": "amount",
                                    "nameLocation": "5018:6:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 296,
                                    "src": "5010:14:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 280,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5010:7:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 283,
                                    "mutability": "mutable",
                                    "name": "target",
                                    "nameLocation": "5042:6:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 296,
                                    "src": "5026:22:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                    },
                                    "typeName": {
                                        "id": 282,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5026:15:0",
                                        "stateMutability": "payable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address_payable",
                                            "typeString": "address payable"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5009:40:0"
                        },
                        "returnParameters": {
                            "id": 287,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "5067:0:0"
                        },
                        "scope": 397,
                        "src": "4975:142:0",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "baseFunctions": [
                            5427
                        ],
                        "body": {
                            "id": 340,
                            "nodeType": "Block",
                            "src": "5399:288:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [],
                                        "expression": {
                                            "argumentTypes": [],
                                            "id": 314,
                                            "name": "_verifyRelayHubOnly",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 140,
                                            "src": "5409:19:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$__$returns$__$",
                                                "typeString": "function () view"
                                            }
                                        },
                                        "id": 315,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5409:21:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 316,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5409:21:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 318,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 300,
                                                "src": "5457:12:0",
                                                "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": 317,
                                            "name": "_verifyForwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 127,
                                            "src": "5440:16:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$__$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) view"
                                            }
                                        },
                                        "id": 319,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5440:30:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 320,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5440:30:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 322,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 300,
                                                "src": "5493:12:0",
                                                "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": 321,
                                            "name": "_verifyValue",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 156,
                                            "src": "5480:12:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$__$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) view"
                                            }
                                        },
                                        "id": 323,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5480:26:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 324,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5480:26:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 326,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 300,
                                                "src": "5537:12:0",
                                                "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": 325,
                                            "name": "_verifyPaymasterData",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 173,
                                            "src": "5516:20:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$__$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) view"
                                            }
                                        },
                                        "id": 327,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5516:34:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 328,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5516:34:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 330,
                                                "name": "approvalData",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 304,
                                                "src": "5580:12:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            ],
                                            "id": 329,
                                            "name": "_verifyApprovalData",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 187,
                                            "src": "5560:19:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_bytes_calldata_ptr_$returns$__$",
                                                "typeString": "function (bytes calldata) view"
                                            }
                                        },
                                        "id": 331,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5560:33:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 332,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5560:33:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 334,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 300,
                                                "src": "5626:12:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            },
                                            {
                                                "id": 335,
                                                "name": "signature",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 302,
                                                "src": "5640:9:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            },
                                            {
                                                "id": 336,
                                                "name": "approvalData",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 304,
                                                "src": "5651:12:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            },
                                            {
                                                "id": 337,
                                                "name": "maxPossibleGas",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 306,
                                                "src": "5665:14:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            ],
                                            "id": 333,
                                            "name": "_preRelayedCall",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 358,
                                            "src": "5610:15:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_RelayRequest_$8491_calldata_ptr_$_t_bytes_calldata_ptr_$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$_t_bool_$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata,bytes calldata,bytes calldata,uint256) returns (bytes memory,bool)"
                                            }
                                        },
                                        "id": 338,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5610:70:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$_t_bytes_memory_ptr_$_t_bool_$",
                                            "typeString": "tuple(bytes memory,bool)"
                                        }
                                    },
                                    "functionReturnParameters": 313,
                                    "id": 339,
                                    "nodeType": "Return",
                                    "src": "5603:77:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 297,
                            "nodeType": "StructuredDocumentation",
                            "src": "5123:26:0",
                            "text": "@inheritdoc IPaymaster"
                        },
                        "functionSelector": "00be5dd4",
                        "id": 341,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "preRelayedCall",
                        "nameLocation": "5163:14:0",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 308,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "5357:8:0"
                        },
                        "parameters": {
                            "id": 307,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 300,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "5218:12:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 341,
                                    "src": "5187:43:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 299,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 298,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "5187:21:0"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "5187:21:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 302,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "5255:9:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 341,
                                    "src": "5240:24:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 301,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5240:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 304,
                                    "mutability": "mutable",
                                    "name": "approvalData",
                                    "nameLocation": "5289:12:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 341,
                                    "src": "5274:27:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 303,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5274:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 306,
                                    "mutability": "mutable",
                                    "name": "maxPossibleGas",
                                    "nameLocation": "5319:14:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 341,
                                    "src": "5311:22:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 305,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5311:7:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5177:162:0"
                        },
                        "returnParameters": {
                            "id": 313,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 310,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 341,
                                    "src": "5379:12:0",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 309,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5379:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 312,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 341,
                                    "src": "5393:4:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 311,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5393:4:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5378:20:0"
                        },
                        "scope": 397,
                        "src": "5154:533:0",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "documentation": {
                            "id": 342,
                            "nodeType": "StructuredDocumentation",
                            "src": "5693:211:0",
                            "text": " @notice internal logic the paymasters need to provide to select which transactions they are willing to pay for\n @notice see the documentation for `IPaymaster::preRelayedCall` for details"
                        },
                        "id": 358,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_preRelayedCall",
                        "nameLocation": "5918:15:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 352,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 345,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 358,
                                    "src": "5943:30:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 344,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 343,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "5943:21:0"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "5943:21:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 347,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 358,
                                    "src": "5983:14:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 346,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5983:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 349,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 358,
                                    "src": "6007:14:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 348,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6007:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 351,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 358,
                                    "src": "6031:7:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 350,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6031:7:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5933:111:0"
                        },
                        "returnParameters": {
                            "id": 357,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 354,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 358,
                                    "src": "6083:12:0",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 353,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6083:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 356,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 358,
                                    "src": "6097:4:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 355,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6097:4:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "6082:20:0"
                        },
                        "scope": 397,
                        "src": "5909:194:0",
                        "stateMutability": "nonpayable",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "baseFunctions": [
                            5440
                        ],
                        "body": {
                            "id": 382,
                            "nodeType": "Block",
                            "src": "6337:112:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [],
                                        "expression": {
                                            "argumentTypes": [],
                                            "id": 372,
                                            "name": "_verifyRelayHubOnly",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 140,
                                            "src": "6347:19:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$__$returns$__$",
                                                "typeString": "function () view"
                                            }
                                        },
                                        "id": 373,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "6347:21:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 374,
                                    "nodeType": "ExpressionStatement",
                                    "src": "6347:21:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 376,
                                                "name": "context",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 361,
                                                "src": "6395:7:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            },
                                            {
                                                "id": 377,
                                                "name": "success",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 363,
                                                "src": "6404:7:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "id": 378,
                                                "name": "gasUseWithoutPost",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 365,
                                                "src": "6413:17:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            {
                                                "id": 379,
                                                "name": "relayData",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 368,
                                                "src": "6432:9:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayData calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                {
                                                    "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayData calldata"
                                                }
                                            ],
                                            "id": 375,
                                            "name": "_postRelayedCall",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 396,
                                            "src": "6378:16:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_nonpayable$_t_bytes_calldata_ptr_$_t_bool_$_t_uint256_$_t_struct$_RelayData_$8484_calldata_ptr_$returns$__$",
                                                "typeString": "function (bytes calldata,bool,uint256,struct GsnTypes.RelayData calldata)"
                                            }
                                        },
                                        "id": 380,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "6378:64:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 381,
                                    "nodeType": "ExpressionStatement",
                                    "src": "6378:64:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 359,
                            "nodeType": "StructuredDocumentation",
                            "src": "6109:26:0",
                            "text": "@inheritdoc IPaymaster"
                        },
                        "functionSelector": "76fa01c3",
                        "id": 383,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "postRelayedCall",
                        "nameLocation": "6149:15:0",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 370,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "6324:8:0"
                        },
                        "parameters": {
                            "id": 369,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 361,
                                    "mutability": "mutable",
                                    "name": "context",
                                    "nameLocation": "6189:7:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 383,
                                    "src": "6174:22:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 360,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6174:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 363,
                                    "mutability": "mutable",
                                    "name": "success",
                                    "nameLocation": "6211:7:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 383,
                                    "src": "6206:12:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 362,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6206:4:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 365,
                                    "mutability": "mutable",
                                    "name": "gasUseWithoutPost",
                                    "nameLocation": "6236:17:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 383,
                                    "src": "6228:25:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 364,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6228:7:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 368,
                                    "mutability": "mutable",
                                    "name": "relayData",
                                    "nameLocation": "6291:9:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 383,
                                    "src": "6263:37:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayData"
                                    },
                                    "typeName": {
                                        "id": 367,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 366,
                                            "name": "GsnTypes.RelayData",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8484,
                                            "src": "6263:18:0"
                                        },
                                        "referencedDeclaration": 8484,
                                        "src": "6263:18:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayData_$8484_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayData"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "6164:142:0"
                        },
                        "returnParameters": {
                            "id": 371,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "6337:0:0"
                        },
                        "scope": 397,
                        "src": "6140:309:0",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "documentation": {
                            "id": 384,
                            "nodeType": "StructuredDocumentation",
                            "src": "6455:210:0",
                            "text": " @notice internal logic the paymasters need to provide if they need to take some action after the transaction\n @notice see the documentation for `IPaymaster::postRelayedCall` for details"
                        },
                        "id": 396,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_postRelayedCall",
                        "nameLocation": "6679:16:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 394,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 386,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 396,
                                    "src": "6705:14:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 385,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6705:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 388,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 396,
                                    "src": "6729:4:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 387,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6729:4:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 390,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 396,
                                    "src": "6743:7:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 389,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6743:7:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 393,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 396,
                                    "src": "6760:27:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayData"
                                    },
                                    "typeName": {
                                        "id": 392,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 391,
                                            "name": "GsnTypes.RelayData",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8484,
                                            "src": "6760:18:0"
                                        },
                                        "referencedDeclaration": 8484,
                                        "src": "6760:18:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayData_$8484_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayData"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "6695:98:0"
                        },
                        "returnParameters": {
                            "id": 395,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "6818:0:0"
                        },
                        "scope": 397,
                        "src": "6670:149:0",
                        "stateMutability": "nonpayable",
                        "virtual": true,
                        "visibility": "internal"
                    }
                ],
                "scope": 398,
                "src": "618:6203:0",
                "usedErrors": []
            }
        ],
        "src": "0:6821:0"
    },
    "legacyAST": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/BasePaymaster.sol",
        "exportedSymbols": {
            "BasePaymaster": [
                397
            ],
            "Context": [
                11508
            ],
            "ERC165": [
                12146
            ],
            "ERC165Checker": [
                12340
            ],
            "GsnEip712Library": [
                8464
            ],
            "GsnTypes": [
                8492
            ],
            "GsnUtils": [
                8572
            ],
            "IERC165": [
                12352
            ],
            "IERC20": [
                10849
            ],
            "IERC2771Recipient": [
                5374
            ],
            "IForwarder": [
                5129
            ],
            "IPaymaster": [
                5447
            ],
            "IRelayHub": [
                5896
            ],
            "IStakeManager": [
                6284
            ],
            "MinLibBytes": [
                8687
            ],
            "Ownable": [
                10182
            ]
        },
        "id": 398,
        "license": "GPL-3.0-only",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 1,
                "literals": [
                    "solidity",
                    ">=",
                    "0.7",
                    ".6"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:24:0"
            },
            {
                "id": 2,
                "literals": [
                    "abicoder",
                    "v2"
                ],
                "nodeType": "PragmaDirective",
                "src": "25:19:0"
            },
            {
                "absolutePath": "@openzeppelin/contracts/access/Ownable.sol",
                "file": "@openzeppelin/contracts/access/Ownable.sol",
                "id": 3,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 10183,
                "src": "88:52:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "@openzeppelin/contracts/utils/introspection/ERC165.sol",
                "file": "@openzeppelin/contracts/utils/introspection/ERC165.sol",
                "id": 4,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 12147,
                "src": "141:64:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol",
                "file": "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol",
                "id": 5,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 12341,
                "src": "206:71:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnTypes.sol",
                "file": "./utils/GsnTypes.sol",
                "id": 6,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 8493,
                "src": "279:30:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/interfaces/IPaymaster.sol",
                "file": "./interfaces/IPaymaster.sol",
                "id": 7,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 5448,
                "src": "310:37:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/interfaces/IRelayHub.sol",
                "file": "./interfaces/IRelayHub.sol",
                "id": 8,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 5897,
                "src": "348:36:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnEip712Library.sol",
                "file": "./utils/GsnEip712Library.sol",
                "id": 9,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 8465,
                "src": "385:38:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/forwarder/IForwarder.sol",
                "file": "./forwarder/IForwarder.sol",
                "id": 10,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 398,
                "sourceUnit": 5130,
                "src": "424:36:0",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": true,
                "baseContracts": [
                    {
                        "baseName": {
                            "id": 12,
                            "name": "IPaymaster",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 5447,
                            "src": "653:10:0"
                        },
                        "id": 13,
                        "nodeType": "InheritanceSpecifier",
                        "src": "653:10:0"
                    },
                    {
                        "baseName": {
                            "id": 14,
                            "name": "Ownable",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 10182,
                            "src": "665:7:0"
                        },
                        "id": 15,
                        "nodeType": "InheritanceSpecifier",
                        "src": "665:7:0"
                    },
                    {
                        "baseName": {
                            "id": 16,
                            "name": "ERC165",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 12146,
                            "src": "674:6:0"
                        },
                        "id": 17,
                        "nodeType": "InheritanceSpecifier",
                        "src": "674:6:0"
                    }
                ],
                "contractDependencies": [],
                "contractKind": "contract",
                "documentation": {
                    "id": 11,
                    "nodeType": "StructuredDocumentation",
                    "src": "462:155:0",
                    "text": " @notice An abstract base class to be inherited by a concrete Paymaster.\n A subclass must implement:\n  - preRelayedCall\n  - postRelayedCall"
                },
                "fullyImplemented": false,
                "id": 397,
                "linearizedBaseContracts": [
                    397,
                    12146,
                    10182,
                    11508,
                    5447,
                    12352
                ],
                "name": "BasePaymaster",
                "nameLocation": "636:13:0",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "id": 20,
                        "libraryName": {
                            "id": 18,
                            "name": "ERC165Checker",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 12340,
                            "src": "693:13:0"
                        },
                        "nodeType": "UsingForDirective",
                        "src": "687:32:0",
                        "typeName": {
                            "id": 19,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "711:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                            }
                        }
                    },
                    {
                        "constant": false,
                        "id": 23,
                        "mutability": "mutable",
                        "name": "relayHub",
                        "nameLocation": "744:8:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "725:27:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IRelayHub_$5896",
                            "typeString": "contract IRelayHub"
                        },
                        "typeName": {
                            "id": 22,
                            "nodeType": "UserDefinedTypeName",
                            "pathNode": {
                                "id": 21,
                                "name": "IRelayHub",
                                "nodeType": "IdentifierPath",
                                "referencedDeclaration": 5896,
                                "src": "725:9:0"
                            },
                            "referencedDeclaration": 5896,
                            "src": "725:9:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                "typeString": "contract IRelayHub"
                            }
                        },
                        "visibility": "internal"
                    },
                    {
                        "constant": false,
                        "id": 25,
                        "mutability": "mutable",
                        "name": "_trustedForwarder",
                        "nameLocation": "774:17:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "758:33:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                        },
                        "typeName": {
                            "id": 24,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "758:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                            }
                        },
                        "visibility": "private"
                    },
                    {
                        "baseFunctions": [
                            5410
                        ],
                        "body": {
                            "id": 37,
                            "nodeType": "Block",
                            "src": "891:41:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 34,
                                                "name": "relayHub",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 23,
                                                "src": "916:8:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                    "typeString": "contract IRelayHub"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                    "typeString": "contract IRelayHub"
                                                }
                                            ],
                                            "id": 33,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "908:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_address_$",
                                                "typeString": "type(address)"
                                            },
                                            "typeName": {
                                                "id": 32,
                                                "name": "address",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "908:7:0",
                                                "typeDescriptions": {}
                                            }
                                        },
                                        "id": 35,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "908:17:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "functionReturnParameters": 31,
                                    "id": 36,
                                    "nodeType": "Return",
                                    "src": "901:24:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 26,
                            "nodeType": "StructuredDocumentation",
                            "src": "798:26:0",
                            "text": "@inheritdoc IPaymaster"
                        },
                        "functionSelector": "7bdf2ec7",
                        "id": 38,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "getRelayHub",
                        "nameLocation": "838:11:0",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 28,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "859:8:0"
                        },
                        "parameters": {
                            "id": 27,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "849:2:0"
                        },
                        "returnParameters": {
                            "id": 31,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 30,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 38,
                                    "src": "882:7:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 29,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "882:7:0",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "881:9:0"
                        },
                        "scope": 397,
                        "src": "829:103:0",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "b90b41cf",
                        "id": 41,
                        "mutability": "constant",
                        "name": "FORWARDER_HUB_OVERHEAD",
                        "nameLocation": "1027:22:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "1003:54:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                        },
                        "typeName": {
                            "id": 39,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "1003:7:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "value": {
                            "hexValue": "3530303030",
                            "id": 40,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1052:5:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_rational_50000_by_1",
                                "typeString": "int_const 50000"
                            },
                            "value": "50000"
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "f9c002f7",
                        "id": 44,
                        "mutability": "constant",
                        "name": "PRE_RELAYED_CALL_GAS_LIMIT",
                        "nameLocation": "1157:26:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "1133:59:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                        },
                        "typeName": {
                            "id": 42,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "1133:7:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "value": {
                            "hexValue": "313030303030",
                            "id": 43,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1186:6:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_rational_100000_by_1",
                                "typeString": "int_const 100000"
                            },
                            "value": "100000"
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "bbdaa3c9",
                        "id": 47,
                        "mutability": "constant",
                        "name": "POST_RELAYED_CALL_GAS_LIMIT",
                        "nameLocation": "1222:27:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "1198:60:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                        },
                        "typeName": {
                            "id": 45,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "1198:7:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "value": {
                            "hexValue": "313130303030",
                            "id": 46,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1252:6:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_rational_110000_by_1",
                                "typeString": "int_const 110000"
                            },
                            "value": "110000"
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "df463a66",
                        "id": 52,
                        "mutability": "constant",
                        "name": "PAYMASTER_ACCEPTANCE_BUDGET",
                        "nameLocation": "1288:27:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "1264:105:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                        },
                        "typeName": {
                            "id": 48,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "1264:7:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "value": {
                            "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            },
                            "id": 51,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "leftExpression": {
                                "id": 49,
                                "name": "PRE_RELAYED_CALL_GAS_LIMIT",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 44,
                                "src": "1318:26:0",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "+",
                            "rightExpression": {
                                "id": 50,
                                "name": "FORWARDER_HUB_OVERHEAD",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 41,
                                "src": "1347:22:0",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                }
                            },
                            "src": "1318:51:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "constant": true,
                        "functionSelector": "5c5e3db1",
                        "id": 55,
                        "mutability": "constant",
                        "name": "CALLDATA_SIZE_LIMIT",
                        "nameLocation": "1399:19:0",
                        "nodeType": "VariableDeclaration",
                        "scope": 397,
                        "src": "1375:51:0",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                        },
                        "typeName": {
                            "id": 53,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "1375:7:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                            }
                        },
                        "value": {
                            "hexValue": "3130353030",
                            "id": 54,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1421:5:0",
                            "typeDescriptions": {
                                "typeIdentifier": "t_rational_10500_by_1",
                                "typeString": "int_const 10500"
                            },
                            "value": "10500"
                        },
                        "visibility": "public"
                    },
                    {
                        "baseFunctions": [
                            12145,
                            12351
                        ],
                        "body": {
                            "id": 85,
                            "nodeType": "Block",
                            "src": "1569:175:0",
                            "statements": [
                                {
                                    "expression": {
                                        "commonType": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        },
                                        "id": 83,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                            "commonType": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            },
                                            "id": 78,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                                "commonType": {
                                                    "typeIdentifier": "t_bytes4",
                                                    "typeString": "bytes4"
                                                },
                                                "id": 71,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "id": 66,
                                                    "name": "interfaceId",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 58,
                                                    "src": "1586:11:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes4",
                                                        "typeString": "bytes4"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "expression": {
                                                        "arguments": [
                                                            {
                                                                "id": 68,
                                                                "name": "IPaymaster",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 5447,
                                                                "src": "1606:10:0",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_type$_t_contract$_IPaymaster_$5447_$",
                                                                    "typeString": "type(contract IPaymaster)"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_type$_t_contract$_IPaymaster_$5447_$",
                                                                    "typeString": "type(contract IPaymaster)"
                                                                }
                                                            ],
                                                            "id": 67,
                                                            "name": "type",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967269,
                                                            "src": "1601:4:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                                                                "typeString": "function () pure"
                                                            }
                                                        },
                                                        "id": 69,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "1601:16:0",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_meta_type_t_contract$_IPaymaster_$5447",
                                                            "typeString": "type(contract IPaymaster)"
                                                        }
                                                    },
                                                    "id": 70,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "memberName": "interfaceId",
                                                    "nodeType": "MemberAccess",
                                                    "src": "1601:28:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes4",
                                                        "typeString": "bytes4"
                                                    }
                                                },
                                                "src": "1586:43:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "||",
                                            "rightExpression": {
                                                "commonType": {
                                                    "typeIdentifier": "t_bytes4",
                                                    "typeString": "bytes4"
                                                },
                                                "id": 77,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "id": 72,
                                                    "name": "interfaceId",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 58,
                                                    "src": "1645:11:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes4",
                                                        "typeString": "bytes4"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "expression": {
                                                        "arguments": [
                                                            {
                                                                "id": 74,
                                                                "name": "Ownable",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 10182,
                                                                "src": "1665:7:0",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_type$_t_contract$_Ownable_$10182_$",
                                                                    "typeString": "type(contract Ownable)"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_type$_t_contract$_Ownable_$10182_$",
                                                                    "typeString": "type(contract Ownable)"
                                                                }
                                                            ],
                                                            "id": 73,
                                                            "name": "type",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967269,
                                                            "src": "1660:4:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                                                                "typeString": "function () pure"
                                                            }
                                                        },
                                                        "id": 75,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "1660:13:0",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_meta_type_t_contract$_Ownable_$10182",
                                                            "typeString": "type(contract Ownable)"
                                                        }
                                                    },
                                                    "id": 76,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "memberName": "interfaceId",
                                                    "nodeType": "MemberAccess",
                                                    "src": "1660:25:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes4",
                                                        "typeString": "bytes4"
                                                    }
                                                },
                                                "src": "1645:40:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            "src": "1586:99:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "||",
                                        "rightExpression": {
                                            "arguments": [
                                                {
                                                    "id": 81,
                                                    "name": "interfaceId",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 58,
                                                    "src": "1725:11:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes4",
                                                        "typeString": "bytes4"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_bytes4",
                                                        "typeString": "bytes4"
                                                    }
                                                ],
                                                "expression": {
                                                    "id": 79,
                                                    "name": "super",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 4294967271,
                                                    "src": "1701:5:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_super$_BasePaymaster_$397_$",
                                                        "typeString": "type(contract super BasePaymaster)"
                                                    }
                                                },
                                                "id": 80,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "supportsInterface",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 12145,
                                                "src": "1701:23:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_internal_view$_t_bytes4_$returns$_t_bool_$",
                                                    "typeString": "function (bytes4) view returns (bool)"
                                                }
                                            },
                                            "id": 82,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "1701:36:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "src": "1586:151:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "functionReturnParameters": 65,
                                    "id": 84,
                                    "nodeType": "Return",
                                    "src": "1579:158:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 56,
                            "nodeType": "StructuredDocumentation",
                            "src": "1433:23:0",
                            "text": "@inheritdoc IERC165"
                        },
                        "functionSelector": "01ffc9a7",
                        "id": 86,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "supportsInterface",
                        "nameLocation": "1470:17:0",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 62,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [
                                {
                                    "id": 60,
                                    "name": "IERC165",
                                    "nodeType": "IdentifierPath",
                                    "referencedDeclaration": 12352,
                                    "src": "1537:7:0"
                                },
                                {
                                    "id": 61,
                                    "name": "ERC165",
                                    "nodeType": "IdentifierPath",
                                    "referencedDeclaration": 12146,
                                    "src": "1546:6:0"
                                }
                            ],
                            "src": "1528:25:0"
                        },
                        "parameters": {
                            "id": 59,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 58,
                                    "mutability": "mutable",
                                    "name": "interfaceId",
                                    "nameLocation": "1495:11:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 86,
                                    "src": "1488:18:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes4",
                                        "typeString": "bytes4"
                                    },
                                    "typeName": {
                                        "id": 57,
                                        "name": "bytes4",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1488:6:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes4",
                                            "typeString": "bytes4"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1487:20:0"
                        },
                        "returnParameters": {
                            "id": 65,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 64,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 86,
                                    "src": "1563:4:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 63,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1563:4:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1562:6:0"
                        },
                        "scope": 397,
                        "src": "1461:283:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "public"
                    },
                    {
                        "baseFunctions": [
                            5398
                        ],
                        "body": {
                            "id": 102,
                            "nodeType": "Block",
                            "src": "1927:216:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 96,
                                                "name": "PAYMASTER_ACCEPTANCE_BUDGET",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 52,
                                                "src": "1985:27:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            {
                                                "id": 97,
                                                "name": "PRE_RELAYED_CALL_GAS_LIMIT",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 44,
                                                "src": "2026:26:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            {
                                                "id": 98,
                                                "name": "POST_RELAYED_CALL_GAS_LIMIT",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 47,
                                                "src": "2066:27:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            {
                                                "id": 99,
                                                "name": "CALLDATA_SIZE_LIMIT",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 55,
                                                "src": "2107:19:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            ],
                                            "expression": {
                                                "id": 94,
                                                "name": "IPaymaster",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 5447,
                                                "src": "1944:10:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_IPaymaster_$5447_$",
                                                    "typeString": "type(contract IPaymaster)"
                                                }
                                            },
                                            "id": 95,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "GasAndDataLimits",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 5391,
                                            "src": "1944:27:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_struct$_GasAndDataLimits_$5391_storage_ptr_$",
                                                "typeString": "type(struct IPaymaster.GasAndDataLimits storage pointer)"
                                            }
                                        },
                                        "id": 100,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "structConstructorCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "1944:192:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_GasAndDataLimits_$5391_memory_ptr",
                                            "typeString": "struct IPaymaster.GasAndDataLimits memory"
                                        }
                                    },
                                    "functionReturnParameters": 93,
                                    "id": 101,
                                    "nodeType": "Return",
                                    "src": "1937:199:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 87,
                            "nodeType": "StructuredDocumentation",
                            "src": "1750:26:0",
                            "text": "@inheritdoc IPaymaster"
                        },
                        "functionSelector": "b039a88f",
                        "id": 103,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "getGasAndDataLimits",
                        "nameLocation": "1790:19:0",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 89,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "1827:8:0"
                        },
                        "parameters": {
                            "id": 88,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1809:2:0"
                        },
                        "returnParameters": {
                            "id": 93,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 92,
                                    "mutability": "mutable",
                                    "name": "limits",
                                    "nameLocation": "1914:6:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 103,
                                    "src": "1879:41:0",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_GasAndDataLimits_$5391_memory_ptr",
                                        "typeString": "struct IPaymaster.GasAndDataLimits"
                                    },
                                    "typeName": {
                                        "id": 91,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 90,
                                            "name": "IPaymaster.GasAndDataLimits",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 5391,
                                            "src": "1879:27:0"
                                        },
                                        "referencedDeclaration": 5391,
                                        "src": "1879:27:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_GasAndDataLimits_$5391_storage_ptr",
                                            "typeString": "struct IPaymaster.GasAndDataLimits"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1869:57:0"
                        },
                        "scope": 397,
                        "src": "1781:362:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 126,
                            "nodeType": "Block",
                            "src": "2441:174:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                "id": 116,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "arguments": [],
                                                    "expression": {
                                                        "argumentTypes": [],
                                                        "id": 111,
                                                        "name": "getTrustedForwarder",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 248,
                                                        "src": "2459:19:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                                            "typeString": "function () view returns (address)"
                                                        }
                                                    },
                                                    "id": 112,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "2459:21:0",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "expression": {
                                                        "expression": {
                                                            "id": 113,
                                                            "name": "relayRequest",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 107,
                                                            "src": "2484:12:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayRequest calldata"
                                                            }
                                                        },
                                                        "id": 114,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "relayData",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8490,
                                                        "src": "2484:22:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                            "typeString": "struct GsnTypes.RelayData calldata"
                                                        }
                                                    },
                                                    "id": 115,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "forwarder",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 8479,
                                                    "src": "2484:32:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "src": "2459:57:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "466f72776172646572206973206e6f742074727573746564",
                                                "id": 117,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2518:26:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_3a2fca03255f31860c82d52f1191f77065f7ff670c017cd47e3568fc231bf429",
                                                    "typeString": "literal_string \"Forwarder is not trusted\""
                                                },
                                                "value": "Forwarder is not trusted"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_3a2fca03255f31860c82d52f1191f77065f7ff670c017cd47e3568fc231bf429",
                                                    "typeString": "literal_string \"Forwarder is not trusted\""
                                                }
                                            ],
                                            "id": 110,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "2451:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 118,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2451:94:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 119,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2451:94:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 123,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 107,
                                                "src": "2595:12:0",
                                                "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"
                                                }
                                            ],
                                            "expression": {
                                                "id": 120,
                                                "name": "GsnEip712Library",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8464,
                                                "src": "2555:16:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                    "typeString": "type(library GsnEip712Library)"
                                                }
                                            },
                                            "id": 122,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "verifyForwarderTrusted",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 8210,
                                            "src": "2555:39:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$__$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) view"
                                            }
                                        },
                                        "id": 124,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2555:53:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 125,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2555:53:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 104,
                            "nodeType": "StructuredDocumentation",
                            "src": "2149:178:0",
                            "text": " @notice this method must be called from preRelayedCall to validate that the forwarder\n is approved by the paymaster as well as by the recipient contract."
                        },
                        "id": 127,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_verifyForwarder",
                        "nameLocation": "2341:16:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 108,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 107,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "2389:12:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 127,
                                    "src": "2358:43:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 106,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 105,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "2358:21:0"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "2358:21:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2357:45:0"
                        },
                        "returnParameters": {
                            "id": 109,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2441:0:0"
                        },
                        "scope": 397,
                        "src": "2332:283:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 139,
                            "nodeType": "Block",
                            "src": "2674:87:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                "id": 135,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "expression": {
                                                        "id": 131,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "2692:3:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 132,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "sender",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2692:10:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "arguments": [],
                                                    "expression": {
                                                        "argumentTypes": [],
                                                        "id": 133,
                                                        "name": "getRelayHub",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 38,
                                                        "src": "2706:11:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                                            "typeString": "function () view returns (address)"
                                                        }
                                                    },
                                                    "id": 134,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "2706:13:0",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "src": "2692:27:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "63616e206f6e6c792062652063616c6c65642062792052656c6179487562",
                                                "id": 136,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2721:32:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_d169f51e5e283c8c890697eb898c30495d34dbb12b80eb91ce172a0d9c75ebfb",
                                                    "typeString": "literal_string \"can only be called by RelayHub\""
                                                },
                                                "value": "can only be called by RelayHub"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_d169f51e5e283c8c890697eb898c30495d34dbb12b80eb91ce172a0d9c75ebfb",
                                                    "typeString": "literal_string \"can only be called by RelayHub\""
                                                }
                                            ],
                                            "id": 130,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "2684:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 137,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2684:70:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 138,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2684:70:0"
                                }
                            ]
                        },
                        "id": 140,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_verifyRelayHubOnly",
                        "nameLocation": "2630:19:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 128,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2649:2:0"
                        },
                        "returnParameters": {
                            "id": 129,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2674:0:0"
                        },
                        "scope": 397,
                        "src": "2621:140:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 155,
                            "nodeType": "Block",
                            "src": "2855:89:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                "id": 151,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "expression": {
                                                        "expression": {
                                                            "id": 147,
                                                            "name": "relayRequest",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 143,
                                                            "src": "2873:12:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayRequest calldata"
                                                            }
                                                        },
                                                        "id": 148,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "request",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8487,
                                                        "src": "2873:20:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                            "typeString": "struct IForwarder.ForwardRequest calldata"
                                                        }
                                                    },
                                                    "id": 149,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "value",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 5049,
                                                    "src": "2873:26:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "hexValue": "30",
                                                    "id": 150,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "number",
                                                    "lValueRequested": false,
                                                    "nodeType": "Literal",
                                                    "src": "2903:1:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_rational_0_by_1",
                                                        "typeString": "int_const 0"
                                                    },
                                                    "value": "0"
                                                },
                                                "src": "2873:31:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "76616c7565207472616e73666572206e6f7420737570706f72746564",
                                                "id": 152,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2906:30:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_e16e7b15b3ab333edb68f7b1a990600092795acc5fc3b3a41ef443557f01e8e8",
                                                    "typeString": "literal_string \"value transfer not supported\""
                                                },
                                                "value": "value transfer not supported"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_e16e7b15b3ab333edb68f7b1a990600092795acc5fc3b3a41ef443557f01e8e8",
                                                    "typeString": "literal_string \"value transfer not supported\""
                                                }
                                            ],
                                            "id": 146,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "2865:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 153,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2865:72:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 154,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2865:72:0"
                                }
                            ]
                        },
                        "id": 156,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_verifyValue",
                        "nameLocation": "2776:12:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 144,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 143,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "2820:12:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 156,
                                    "src": "2789:43:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 142,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 141,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "2789:21:0"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "2789:21:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2788:45:0"
                        },
                        "returnParameters": {
                            "id": 145,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2855:0:0"
                        },
                        "scope": 397,
                        "src": "2767:177:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 172,
                            "nodeType": "Block",
                            "src": "3047:106:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                "id": 168,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "expression": {
                                                        "expression": {
                                                            "expression": {
                                                                "id": 163,
                                                                "name": "relayRequest",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 159,
                                                                "src": "3065:12:0",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                                }
                                                            },
                                                            "id": 164,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "memberName": "relayData",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": 8490,
                                                            "src": "3065:22:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                                "typeString": "struct GsnTypes.RelayData calldata"
                                                            }
                                                        },
                                                        "id": 165,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "paymasterData",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8481,
                                                        "src": "3065:36:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes_calldata_ptr",
                                                            "typeString": "bytes calldata"
                                                        }
                                                    },
                                                    "id": 166,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "length",
                                                    "nodeType": "MemberAccess",
                                                    "src": "3065:43:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "hexValue": "30",
                                                    "id": 167,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "number",
                                                    "lValueRequested": false,
                                                    "nodeType": "Literal",
                                                    "src": "3112:1:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_rational_0_by_1",
                                                        "typeString": "int_const 0"
                                                    },
                                                    "value": "0"
                                                },
                                                "src": "3065:48:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "73686f756c642068617665206e6f207061796d617374657244617461",
                                                "id": 169,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "3115:30:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_182b40eb1561ed39a86edc754bf2a5f045daef24c145773d4b18340a470251b6",
                                                    "typeString": "literal_string \"should have no paymasterData\""
                                                },
                                                "value": "should have no paymasterData"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_182b40eb1561ed39a86edc754bf2a5f045daef24c145773d4b18340a470251b6",
                                                    "typeString": "literal_string \"should have no paymasterData\""
                                                }
                                            ],
                                            "id": 162,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "3057:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 170,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3057:89:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 171,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3057:89:0"
                                }
                            ]
                        },
                        "id": 173,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_verifyPaymasterData",
                        "nameLocation": "2959:20:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 160,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 159,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "3011:12:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 173,
                                    "src": "2980:43:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 158,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 157,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "2980:21:0"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "2980:21:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2979:45:0"
                        },
                        "returnParameters": {
                            "id": 161,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "3047:0:0"
                        },
                        "scope": 397,
                        "src": "2950:203:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 186,
                            "nodeType": "Block",
                            "src": "3238:81:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                "id": 182,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "expression": {
                                                        "id": 179,
                                                        "name": "approvalData",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 175,
                                                        "src": "3256:12:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes_calldata_ptr",
                                                            "typeString": "bytes calldata"
                                                        }
                                                    },
                                                    "id": 180,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "length",
                                                    "nodeType": "MemberAccess",
                                                    "src": "3256:19:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "hexValue": "30",
                                                    "id": 181,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "number",
                                                    "lValueRequested": false,
                                                    "nodeType": "Literal",
                                                    "src": "3279:1:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_rational_0_by_1",
                                                        "typeString": "int_const 0"
                                                    },
                                                    "value": "0"
                                                },
                                                "src": "3256:24:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "73686f756c642068617665206e6f20617070726f76616c44617461",
                                                "id": 183,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "3282:29:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_fccc4b6995a94cdc6e6e9a1b088f6ad31bd641a326f5e5ddcc3773886206aa37",
                                                    "typeString": "literal_string \"should have no approvalData\""
                                                },
                                                "value": "should have no approvalData"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_fccc4b6995a94cdc6e6e9a1b088f6ad31bd641a326f5e5ddcc3773886206aa37",
                                                    "typeString": "literal_string \"should have no approvalData\""
                                                }
                                            ],
                                            "id": 178,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "3248:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 184,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3248:64:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 185,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3248:64:0"
                                }
                            ]
                        },
                        "id": 187,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_verifyApprovalData",
                        "nameLocation": "3168:19:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 176,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 175,
                                    "mutability": "mutable",
                                    "name": "approvalData",
                                    "nameLocation": "3203:12:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 187,
                                    "src": "3188:27:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 174,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3188:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3187:29:0"
                        },
                        "returnParameters": {
                            "id": 177,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "3238:0:0"
                        },
                        "scope": 397,
                        "src": "3159:160:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "body": {
                            "id": 214,
                            "nodeType": "Block",
                            "src": "3604:144:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "expression": {
                                                            "arguments": [
                                                                {
                                                                    "id": 203,
                                                                    "name": "IRelayHub",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 5896,
                                                                    "src": "3658:9:0",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_type$_t_contract$_IRelayHub_$5896_$",
                                                                        "typeString": "type(contract IRelayHub)"
                                                                    }
                                                                }
                                                            ],
                                                            "expression": {
                                                                "argumentTypes": [
                                                                    {
                                                                        "typeIdentifier": "t_type$_t_contract$_IRelayHub_$5896_$",
                                                                        "typeString": "type(contract IRelayHub)"
                                                                    }
                                                                ],
                                                                "id": 202,
                                                                "name": "type",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 4294967269,
                                                                "src": "3653:4:0",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                                                                    "typeString": "function () pure"
                                                                }
                                                            },
                                                            "id": 204,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "kind": "functionCall",
                                                            "lValueRequested": false,
                                                            "names": [],
                                                            "nodeType": "FunctionCall",
                                                            "src": "3653:15:0",
                                                            "tryCall": false,
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_magic_meta_type_t_contract$_IRelayHub_$5896",
                                                                "typeString": "type(contract IRelayHub)"
                                                            }
                                                        },
                                                        "id": 205,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "memberName": "interfaceId",
                                                        "nodeType": "MemberAccess",
                                                        "src": "3653:27:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes4",
                                                            "typeString": "bytes4"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_bytes4",
                                                            "typeString": "bytes4"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "arguments": [
                                                            {
                                                                "id": 199,
                                                                "name": "hub",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 191,
                                                                "src": "3630:3:0",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                                    "typeString": "contract IRelayHub"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                                    "typeString": "contract IRelayHub"
                                                                }
                                                            ],
                                                            "id": 198,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "nodeType": "ElementaryTypeNameExpression",
                                                            "src": "3622:7:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_type$_t_address_$",
                                                                "typeString": "type(address)"
                                                            },
                                                            "typeName": {
                                                                "id": 197,
                                                                "name": "address",
                                                                "nodeType": "ElementaryTypeName",
                                                                "src": "3622:7:0",
                                                                "typeDescriptions": {}
                                                            }
                                                        },
                                                        "id": 200,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "typeConversion",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "3622:12:0",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    "id": 201,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "supportsInterface",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 12196,
                                                    "src": "3622:30:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$bound_to$_t_address_$",
                                                        "typeString": "function (address,bytes4) view returns (bool)"
                                                    }
                                                },
                                                "id": 206,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "3622:59:0",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "746172676574206973206e6f7420612076616c6964204952656c6179487562",
                                                "id": 207,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "3683:33:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_b62b61dba941996cba530085b5313ea27667d0ee2b85e1209b8aedd3e5e9398e",
                                                    "typeString": "literal_string \"target is not a valid IRelayHub\""
                                                },
                                                "value": "target is not a valid IRelayHub"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_b62b61dba941996cba530085b5313ea27667d0ee2b85e1209b8aedd3e5e9398e",
                                                    "typeString": "literal_string \"target is not a valid IRelayHub\""
                                                }
                                            ],
                                            "id": 196,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "3614:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 208,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3614:103:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 209,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3614:103:0"
                                },
                                {
                                    "expression": {
                                        "id": 212,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "id": 210,
                                            "name": "relayHub",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 23,
                                            "src": "3727:8:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                "typeString": "contract IRelayHub"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "id": 211,
                                            "name": "hub",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 191,
                                            "src": "3738:3:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                "typeString": "contract IRelayHub"
                                            }
                                        },
                                        "src": "3727:14:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                            "typeString": "contract IRelayHub"
                                        }
                                    },
                                    "id": 213,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3727:14:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 188,
                            "nodeType": "StructuredDocumentation",
                            "src": "3325:221:0",
                            "text": " @notice The owner of the Paymaster can change the instance of the RelayHub this Paymaster works with.\n :warning: **Warning** :warning: The deposit on the previous RelayHub must be withdrawn first."
                        },
                        "functionSelector": "7bb05264",
                        "id": 215,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [
                            {
                                "id": 194,
                                "kind": "modifierInvocation",
                                "modifierName": {
                                    "id": 193,
                                    "name": "onlyOwner",
                                    "nodeType": "IdentifierPath",
                                    "referencedDeclaration": 10101,
                                    "src": "3594:9:0"
                                },
                                "nodeType": "ModifierInvocation",
                                "src": "3594:9:0"
                            }
                        ],
                        "name": "setRelayHub",
                        "nameLocation": "3560:11:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 192,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 191,
                                    "mutability": "mutable",
                                    "name": "hub",
                                    "nameLocation": "3582:3:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 215,
                                    "src": "3572:13:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                        "typeString": "contract IRelayHub"
                                    },
                                    "typeName": {
                                        "id": 190,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 189,
                                            "name": "IRelayHub",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 5896,
                                            "src": "3572:9:0"
                                        },
                                        "referencedDeclaration": 5896,
                                        "src": "3572:9:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                            "typeString": "contract IRelayHub"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3571:15:0"
                        },
                        "returnParameters": {
                            "id": 195,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "3604:0:0"
                        },
                        "scope": 397,
                        "src": "3551:197:0",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 238,
                            "nodeType": "Block",
                            "src": "4070:158:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "expression": {
                                                            "arguments": [
                                                                {
                                                                    "id": 227,
                                                                    "name": "IForwarder",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 5129,
                                                                    "src": "4121:10:0",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_type$_t_contract$_IForwarder_$5129_$",
                                                                        "typeString": "type(contract IForwarder)"
                                                                    }
                                                                }
                                                            ],
                                                            "expression": {
                                                                "argumentTypes": [
                                                                    {
                                                                        "typeIdentifier": "t_type$_t_contract$_IForwarder_$5129_$",
                                                                        "typeString": "type(contract IForwarder)"
                                                                    }
                                                                ],
                                                                "id": 226,
                                                                "name": "type",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 4294967269,
                                                                "src": "4116:4:0",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                                                                    "typeString": "function () pure"
                                                                }
                                                            },
                                                            "id": 228,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "kind": "functionCall",
                                                            "lValueRequested": false,
                                                            "names": [],
                                                            "nodeType": "FunctionCall",
                                                            "src": "4116:16:0",
                                                            "tryCall": false,
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_magic_meta_type_t_contract$_IForwarder_$5129",
                                                                "typeString": "type(contract IForwarder)"
                                                            }
                                                        },
                                                        "id": 229,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "memberName": "interfaceId",
                                                        "nodeType": "MemberAccess",
                                                        "src": "4116:28:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes4",
                                                            "typeString": "bytes4"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_bytes4",
                                                            "typeString": "bytes4"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "id": 224,
                                                        "name": "forwarder",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 218,
                                                        "src": "4088:9:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    "id": 225,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "supportsInterface",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 12196,
                                                    "src": "4088:27:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$bound_to$_t_address_$",
                                                        "typeString": "function (address,bytes4) view returns (bool)"
                                                    }
                                                },
                                                "id": 230,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "4088:57:0",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "746172676574206973206e6f7420612076616c69642049466f72776172646572",
                                                "id": 231,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "4147:34:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_4f35ce95c64a40a715e95a1b7d3fe84cf613d64347e430eb5f35903ecdb7e24d",
                                                    "typeString": "literal_string \"target is not a valid IForwarder\""
                                                },
                                                "value": "target is not a valid IForwarder"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_4f35ce95c64a40a715e95a1b7d3fe84cf613d64347e430eb5f35903ecdb7e24d",
                                                    "typeString": "literal_string \"target is not a valid IForwarder\""
                                                }
                                            ],
                                            "id": 223,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "4080:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 232,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "4080:102:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 233,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4080:102:0"
                                },
                                {
                                    "expression": {
                                        "id": 236,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "id": 234,
                                            "name": "_trustedForwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25,
                                            "src": "4192:17:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "id": 235,
                                            "name": "forwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 218,
                                            "src": "4212:9:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "src": "4192:29:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "id": 237,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4192:29:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 216,
                            "nodeType": "StructuredDocumentation",
                            "src": "3754:238:0",
                            "text": " @notice The owner of the Paymaster can change the instance of the Forwarder this Paymaster works with.\n @notice the Recipients must trust this Forwarder as well in order for the configuration to remain functional."
                        },
                        "functionSelector": "da742228",
                        "id": 239,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [
                            {
                                "id": 221,
                                "kind": "modifierInvocation",
                                "modifierName": {
                                    "id": 220,
                                    "name": "onlyOwner",
                                    "nodeType": "IdentifierPath",
                                    "referencedDeclaration": 10101,
                                    "src": "4060:9:0"
                                },
                                "nodeType": "ModifierInvocation",
                                "src": "4060:9:0"
                            }
                        ],
                        "name": "setTrustedForwarder",
                        "nameLocation": "4006:19:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 219,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 218,
                                    "mutability": "mutable",
                                    "name": "forwarder",
                                    "nameLocation": "4034:9:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 239,
                                    "src": "4026:17:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 217,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4026:7:0",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4025:19:0"
                        },
                        "returnParameters": {
                            "id": 222,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4070:0:0"
                        },
                        "scope": 397,
                        "src": "3997:231:0",
                        "stateMutability": "nonpayable",
                        "virtual": true,
                        "visibility": "public"
                    },
                    {
                        "baseFunctions": [
                            5404
                        ],
                        "body": {
                            "id": 247,
                            "nodeType": "Block",
                            "src": "4311:41:0",
                            "statements": [
                                {
                                    "expression": {
                                        "id": 245,
                                        "name": "_trustedForwarder",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25,
                                        "src": "4328:17:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "functionReturnParameters": 244,
                                    "id": 246,
                                    "nodeType": "Return",
                                    "src": "4321:24:0"
                                }
                            ]
                        },
                        "functionSelector": "ce1b815f",
                        "id": 248,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "getTrustedForwarder",
                        "nameLocation": "4243:19:0",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 241,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "4285:8:0"
                        },
                        "parameters": {
                            "id": 240,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4262:2:0"
                        },
                        "returnParameters": {
                            "id": 244,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 243,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 248,
                                    "src": "4303:7:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 242,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4303:7:0",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4302:9:0"
                        },
                        "scope": 397,
                        "src": "4234:118:0",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 277,
                            "nodeType": "Block",
                            "src": "4616:147:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                "id": 261,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "arguments": [
                                                        {
                                                            "id": 255,
                                                            "name": "relayHub",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 23,
                                                            "src": "4642:8:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                                "typeString": "contract IRelayHub"
                                                            }
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                                "typeString": "contract IRelayHub"
                                                            }
                                                        ],
                                                        "id": 254,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "ElementaryTypeNameExpression",
                                                        "src": "4634:7:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_address_$",
                                                            "typeString": "type(address)"
                                                        },
                                                        "typeName": {
                                                            "id": 253,
                                                            "name": "address",
                                                            "nodeType": "ElementaryTypeName",
                                                            "src": "4634:7:0",
                                                            "typeDescriptions": {}
                                                        }
                                                    },
                                                    "id": 256,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "typeConversion",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "4634:17:0",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "!=",
                                                "rightExpression": {
                                                    "arguments": [
                                                        {
                                                            "hexValue": "30",
                                                            "id": 259,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "kind": "number",
                                                            "lValueRequested": false,
                                                            "nodeType": "Literal",
                                                            "src": "4663:1:0",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_rational_0_by_1",
                                                                "typeString": "int_const 0"
                                                            },
                                                            "value": "0"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_rational_0_by_1",
                                                                "typeString": "int_const 0"
                                                            }
                                                        ],
                                                        "id": 258,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "ElementaryTypeNameExpression",
                                                        "src": "4655:7:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_address_$",
                                                            "typeString": "type(address)"
                                                        },
                                                        "typeName": {
                                                            "id": 257,
                                                            "name": "address",
                                                            "nodeType": "ElementaryTypeName",
                                                            "src": "4655:7:0",
                                                            "typeDescriptions": {}
                                                        }
                                                    },
                                                    "id": 260,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "typeConversion",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "4655:10:0",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "src": "4634:31:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "72656c6179206875622061646472657373206e6f7420736574",
                                                "id": 262,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "4667:27:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_2e4bcc216326d2d371e2433ec8e1af9c54827701515af7cd10f9acc79120d313",
                                                    "typeString": "literal_string \"relay hub address not set\""
                                                },
                                                "value": "relay hub address not set"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_2e4bcc216326d2d371e2433ec8e1af9c54827701515af7cd10f9acc79120d313",
                                                    "typeString": "literal_string \"relay hub address not set\""
                                                }
                                            ],
                                            "id": 252,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "4626:7:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 263,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "4626:69:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 264,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4626:69:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "arguments": [
                                                    {
                                                        "id": 273,
                                                        "name": "this",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967268,
                                                        "src": "4750:4:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_contract$_BasePaymaster_$397",
                                                            "typeString": "contract BasePaymaster"
                                                        }
                                                    }
                                                ],
                                                "expression": {
                                                    "argumentTypes": [
                                                        {
                                                            "typeIdentifier": "t_contract$_BasePaymaster_$397",
                                                            "typeString": "contract BasePaymaster"
                                                        }
                                                    ],
                                                    "id": 272,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "nodeType": "ElementaryTypeNameExpression",
                                                    "src": "4742:7:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_address_$",
                                                        "typeString": "type(address)"
                                                    },
                                                    "typeName": {
                                                        "id": 271,
                                                        "name": "address",
                                                        "nodeType": "ElementaryTypeName",
                                                        "src": "4742:7:0",
                                                        "typeDescriptions": {}
                                                    }
                                                },
                                                "id": 274,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "typeConversion",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "4742:13:0",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                ],
                                                "expression": {
                                                    "id": 265,
                                                    "name": "relayHub",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 23,
                                                    "src": "4705:8:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                        "typeString": "contract IRelayHub"
                                                    }
                                                },
                                                "id": 267,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "depositFor",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 5687,
                                                "src": "4705:19:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_external_payable$_t_address_$returns$__$",
                                                    "typeString": "function (address) payable external"
                                                }
                                            },
                                            "id": 270,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "names": [
                                                "value"
                                            ],
                                            "nodeType": "FunctionCallOptions",
                                            "options": [
                                                {
                                                    "expression": {
                                                        "id": 268,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "4731:3:0",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 269,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "value",
                                                    "nodeType": "MemberAccess",
                                                    "src": "4731:9:0",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                }
                                            ],
                                            "src": "4705:36:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_external_payable$_t_address_$returns$__$value",
                                                "typeString": "function (address) payable external"
                                            }
                                        },
                                        "id": 275,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "4705:51:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 276,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4705:51:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 249,
                            "nodeType": "StructuredDocumentation",
                            "src": "4358:218:0",
                            "text": " @notice Any native Ether transferred into the paymaster is transferred as a deposit to the RelayHub.\n This way, we don't need to understand the RelayHub API in order to replenish the paymaster."
                        },
                        "id": 278,
                        "implemented": true,
                        "kind": "receive",
                        "modifiers": [],
                        "name": "",
                        "nameLocation": "-1:-1:-1",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 250,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4588:2:0"
                        },
                        "returnParameters": {
                            "id": 251,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4616:0:0"
                        },
                        "scope": 397,
                        "src": "4581:182:0",
                        "stateMutability": "payable",
                        "virtual": true,
                        "visibility": "external"
                    },
                    {
                        "body": {
                            "id": 295,
                            "nodeType": "Block",
                            "src": "5067:50:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 291,
                                                "name": "target",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 283,
                                                "src": "5095:6:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address_payable",
                                                    "typeString": "address payable"
                                                }
                                            },
                                            {
                                                "id": 292,
                                                "name": "amount",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 281,
                                                "src": "5103:6:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_address_payable",
                                                    "typeString": "address payable"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            ],
                                            "expression": {
                                                "id": 288,
                                                "name": "relayHub",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 23,
                                                "src": "5077:8:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_IRelayHub_$5896",
                                                    "typeString": "contract IRelayHub"
                                                }
                                            },
                                            "id": 290,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "withdraw",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 5695,
                                            "src": "5077:17:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_external_nonpayable$_t_address_payable_$_t_uint256_$returns$__$",
                                                "typeString": "function (address payable,uint256) external"
                                            }
                                        },
                                        "id": 293,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5077:33:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 294,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5077:33:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 279,
                            "nodeType": "StructuredDocumentation",
                            "src": "4769:201:0",
                            "text": " @notice Withdraw deposit from the RelayHub.\n @param amount The amount to be subtracted from the sender.\n @param target The target to which the amount will be transferred."
                        },
                        "functionSelector": "2d14c4b7",
                        "id": 296,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [
                            {
                                "id": 286,
                                "kind": "modifierInvocation",
                                "modifierName": {
                                    "id": 285,
                                    "name": "onlyOwner",
                                    "nodeType": "IdentifierPath",
                                    "referencedDeclaration": 10101,
                                    "src": "5057:9:0"
                                },
                                "nodeType": "ModifierInvocation",
                                "src": "5057:9:0"
                            }
                        ],
                        "name": "withdrawRelayHubDepositTo",
                        "nameLocation": "4984:25:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 284,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 281,
                                    "mutability": "mutable",
                                    "name": "amount",
                                    "nameLocation": "5018:6:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 296,
                                    "src": "5010:14:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 280,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5010:7:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 283,
                                    "mutability": "mutable",
                                    "name": "target",
                                    "nameLocation": "5042:6:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 296,
                                    "src": "5026:22:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                    },
                                    "typeName": {
                                        "id": 282,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5026:15:0",
                                        "stateMutability": "payable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address_payable",
                                            "typeString": "address payable"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5009:40:0"
                        },
                        "returnParameters": {
                            "id": 287,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "5067:0:0"
                        },
                        "scope": 397,
                        "src": "4975:142:0",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "baseFunctions": [
                            5427
                        ],
                        "body": {
                            "id": 340,
                            "nodeType": "Block",
                            "src": "5399:288:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [],
                                        "expression": {
                                            "argumentTypes": [],
                                            "id": 314,
                                            "name": "_verifyRelayHubOnly",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 140,
                                            "src": "5409:19:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$__$returns$__$",
                                                "typeString": "function () view"
                                            }
                                        },
                                        "id": 315,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5409:21:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 316,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5409:21:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 318,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 300,
                                                "src": "5457:12:0",
                                                "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": 317,
                                            "name": "_verifyForwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 127,
                                            "src": "5440:16:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$__$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) view"
                                            }
                                        },
                                        "id": 319,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5440:30:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 320,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5440:30:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 322,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 300,
                                                "src": "5493:12:0",
                                                "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": 321,
                                            "name": "_verifyValue",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 156,
                                            "src": "5480:12:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$__$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) view"
                                            }
                                        },
                                        "id": 323,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5480:26:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 324,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5480:26:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 326,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 300,
                                                "src": "5537:12:0",
                                                "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": 325,
                                            "name": "_verifyPaymasterData",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 173,
                                            "src": "5516:20:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$__$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata) view"
                                            }
                                        },
                                        "id": 327,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5516:34:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 328,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5516:34:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 330,
                                                "name": "approvalData",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 304,
                                                "src": "5580:12:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            ],
                                            "id": 329,
                                            "name": "_verifyApprovalData",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 187,
                                            "src": "5560:19:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_bytes_calldata_ptr_$returns$__$",
                                                "typeString": "function (bytes calldata) view"
                                            }
                                        },
                                        "id": 331,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5560:33:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 332,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5560:33:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 334,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 300,
                                                "src": "5626:12:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            },
                                            {
                                                "id": 335,
                                                "name": "signature",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 302,
                                                "src": "5640:9:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            },
                                            {
                                                "id": 336,
                                                "name": "approvalData",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 304,
                                                "src": "5651:12:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            },
                                            {
                                                "id": 337,
                                                "name": "maxPossibleGas",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 306,
                                                "src": "5665:14:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            ],
                                            "id": 333,
                                            "name": "_preRelayedCall",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 358,
                                            "src": "5610:15:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_RelayRequest_$8491_calldata_ptr_$_t_bytes_calldata_ptr_$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_bytes_memory_ptr_$_t_bool_$",
                                                "typeString": "function (struct GsnTypes.RelayRequest calldata,bytes calldata,bytes calldata,uint256) returns (bytes memory,bool)"
                                            }
                                        },
                                        "id": 338,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "5610:70:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$_t_bytes_memory_ptr_$_t_bool_$",
                                            "typeString": "tuple(bytes memory,bool)"
                                        }
                                    },
                                    "functionReturnParameters": 313,
                                    "id": 339,
                                    "nodeType": "Return",
                                    "src": "5603:77:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 297,
                            "nodeType": "StructuredDocumentation",
                            "src": "5123:26:0",
                            "text": "@inheritdoc IPaymaster"
                        },
                        "functionSelector": "00be5dd4",
                        "id": 341,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "preRelayedCall",
                        "nameLocation": "5163:14:0",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 308,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "5357:8:0"
                        },
                        "parameters": {
                            "id": 307,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 300,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "5218:12:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 341,
                                    "src": "5187:43:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 299,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 298,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "5187:21:0"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "5187:21:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 302,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "5255:9:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 341,
                                    "src": "5240:24:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 301,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5240:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 304,
                                    "mutability": "mutable",
                                    "name": "approvalData",
                                    "nameLocation": "5289:12:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 341,
                                    "src": "5274:27:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 303,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5274:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 306,
                                    "mutability": "mutable",
                                    "name": "maxPossibleGas",
                                    "nameLocation": "5319:14:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 341,
                                    "src": "5311:22:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 305,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5311:7:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5177:162:0"
                        },
                        "returnParameters": {
                            "id": 313,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 310,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 341,
                                    "src": "5379:12:0",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 309,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5379:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 312,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 341,
                                    "src": "5393:4:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 311,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5393:4:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5378:20:0"
                        },
                        "scope": 397,
                        "src": "5154:533:0",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "documentation": {
                            "id": 342,
                            "nodeType": "StructuredDocumentation",
                            "src": "5693:211:0",
                            "text": " @notice internal logic the paymasters need to provide to select which transactions they are willing to pay for\n @notice see the documentation for `IPaymaster::preRelayedCall` for details"
                        },
                        "id": 358,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_preRelayedCall",
                        "nameLocation": "5918:15:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 352,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 345,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 358,
                                    "src": "5943:30:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 344,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 343,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "5943:21:0"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "5943:21:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 347,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 358,
                                    "src": "5983:14:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 346,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5983:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 349,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 358,
                                    "src": "6007:14:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 348,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6007:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 351,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 358,
                                    "src": "6031:7:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 350,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6031:7:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "5933:111:0"
                        },
                        "returnParameters": {
                            "id": 357,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 354,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 358,
                                    "src": "6083:12:0",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 353,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6083:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 356,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 358,
                                    "src": "6097:4:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 355,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6097:4:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "6082:20:0"
                        },
                        "scope": 397,
                        "src": "5909:194:0",
                        "stateMutability": "nonpayable",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "baseFunctions": [
                            5440
                        ],
                        "body": {
                            "id": 382,
                            "nodeType": "Block",
                            "src": "6337:112:0",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [],
                                        "expression": {
                                            "argumentTypes": [],
                                            "id": 372,
                                            "name": "_verifyRelayHubOnly",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 140,
                                            "src": "6347:19:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$__$returns$__$",
                                                "typeString": "function () view"
                                            }
                                        },
                                        "id": 373,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "6347:21:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 374,
                                    "nodeType": "ExpressionStatement",
                                    "src": "6347:21:0"
                                },
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 376,
                                                "name": "context",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 361,
                                                "src": "6395:7:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            },
                                            {
                                                "id": 377,
                                                "name": "success",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 363,
                                                "src": "6404:7:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "id": 378,
                                                "name": "gasUseWithoutPost",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 365,
                                                "src": "6413:17:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            {
                                                "id": 379,
                                                "name": "relayData",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 368,
                                                "src": "6432:9:0",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayData calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                {
                                                    "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayData calldata"
                                                }
                                            ],
                                            "id": 375,
                                            "name": "_postRelayedCall",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 396,
                                            "src": "6378:16:0",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_nonpayable$_t_bytes_calldata_ptr_$_t_bool_$_t_uint256_$_t_struct$_RelayData_$8484_calldata_ptr_$returns$__$",
                                                "typeString": "function (bytes calldata,bool,uint256,struct GsnTypes.RelayData calldata)"
                                            }
                                        },
                                        "id": 380,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "6378:64:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 381,
                                    "nodeType": "ExpressionStatement",
                                    "src": "6378:64:0"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 359,
                            "nodeType": "StructuredDocumentation",
                            "src": "6109:26:0",
                            "text": "@inheritdoc IPaymaster"
                        },
                        "functionSelector": "76fa01c3",
                        "id": 383,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "postRelayedCall",
                        "nameLocation": "6149:15:0",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 370,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "6324:8:0"
                        },
                        "parameters": {
                            "id": 369,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 361,
                                    "mutability": "mutable",
                                    "name": "context",
                                    "nameLocation": "6189:7:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 383,
                                    "src": "6174:22:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 360,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6174:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 363,
                                    "mutability": "mutable",
                                    "name": "success",
                                    "nameLocation": "6211:7:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 383,
                                    "src": "6206:12:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 362,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6206:4:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 365,
                                    "mutability": "mutable",
                                    "name": "gasUseWithoutPost",
                                    "nameLocation": "6236:17:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 383,
                                    "src": "6228:25:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 364,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6228:7:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 368,
                                    "mutability": "mutable",
                                    "name": "relayData",
                                    "nameLocation": "6291:9:0",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 383,
                                    "src": "6263:37:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayData"
                                    },
                                    "typeName": {
                                        "id": 367,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 366,
                                            "name": "GsnTypes.RelayData",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8484,
                                            "src": "6263:18:0"
                                        },
                                        "referencedDeclaration": 8484,
                                        "src": "6263:18:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayData_$8484_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayData"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "6164:142:0"
                        },
                        "returnParameters": {
                            "id": 371,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "6337:0:0"
                        },
                        "scope": 397,
                        "src": "6140:309:0",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "documentation": {
                            "id": 384,
                            "nodeType": "StructuredDocumentation",
                            "src": "6455:210:0",
                            "text": " @notice internal logic the paymasters need to provide if they need to take some action after the transaction\n @notice see the documentation for `IPaymaster::postRelayedCall` for details"
                        },
                        "id": 396,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_postRelayedCall",
                        "nameLocation": "6679:16:0",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 394,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 386,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 396,
                                    "src": "6705:14:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 385,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6705:5:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 388,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 396,
                                    "src": "6729:4:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 387,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6729:4:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 390,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 396,
                                    "src": "6743:7:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 389,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6743:7:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 393,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 396,
                                    "src": "6760:27:0",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayData_$8484_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayData"
                                    },
                                    "typeName": {
                                        "id": 392,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 391,
                                            "name": "GsnTypes.RelayData",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8484,
                                            "src": "6760:18:0"
                                        },
                                        "referencedDeclaration": 8484,
                                        "src": "6760:18:0",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayData_$8484_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayData"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "6695:98:0"
                        },
                        "returnParameters": {
                            "id": 395,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "6818:0:0"
                        },
                        "scope": 397,
                        "src": "6670:149:0",
                        "stateMutability": "nonpayable",
                        "virtual": true,
                        "visibility": "internal"
                    }
                ],
                "scope": 398,
                "src": "618:6203:0",
                "usedErrors": []
            }
        ],
        "src": "0:6821:0"
    },
    "compiler": {
        "name": "solc",
        "version": "0.8.7+commit.e28d00a7.Emscripten.clang"
    },
    "networks": {},
    "schemaVersion": "3.1.0",
    "updatedAt": "2023-03-16T16:54:15.122Z",
    "devdoc": {
        "kind": "dev",
        "methods": {
            "getGasAndDataLimits()": {
                "returns": {
                    "limits": "An instance of the `GasAndDataLimits` struct ##### `acceptanceBudget` If the transactions consumes more than `acceptanceBudget` this Paymaster will be charged for gas no matter what. Transaction that gets rejected after consuming more than `acceptanceBudget` gas is on this Paymaster's expense. Should be set to an amount gas this Paymaster expects to spend deciding whether to accept or reject a request. This includes gas consumed by calculations in the `preRelayedCall`, `Forwarder` and the recipient contract. :warning: **Warning** :warning: As long this value is above `preRelayedCallGasLimit` (see defaults in `BasePaymaster`), the Paymaster is guaranteed it will never pay for rejected transactions. If this value is below `preRelayedCallGasLimit`, it might might make Paymaster open to a \"griefing\" attack. The relayers should prefer lower `acceptanceBudget`, as it improves their chances of being compensated. From a Relay's point of view, this is the highest gas value a bad Paymaster may cost the relay, since the paymaster will pay anything above that value regardless of whether the transaction succeeds or reverts. Specifying value too high might make the call rejected by relayers (see `maxAcceptanceBudget` in server config). ##### `preRelayedCallGasLimit` The max gas usage of preRelayedCall. Any revert of the `preRelayedCall` is a request rejection by the paymaster. As long as `acceptanceBudget` is above `preRelayedCallGasLimit`, any such revert is not payed by the paymaster. ##### `postRelayedCallGasLimit` The max gas usage of postRelayedCall. The Paymaster is not charged for the maximum, only for actually used gas. Note that an OOG will revert the inner transaction, but the paymaster will be charged for it anyway."
                }
            },
            "getRelayHub()": {
                "returns": {
                    "_0": "The address of the `RelayHub` that is trusted by this Paymaster to execute the requests."
                }
            },
            "getTrustedForwarder()": {
                "returns": {
                    "_0": "The address of the `Forwarder` that is trusted by this Paymaster to execute the requests."
                }
            },
            "owner()": {
                "details": "Returns the address of the current owner."
            },
            "postRelayedCall(bytes,bool,uint256,(uint256,uint256,uint256,address,address,address,bytes,uint256))": {
                "params": {
                    "context": "The call context, as returned by the preRelayedCall",
                    "gasUseWithoutPost": "The actual amount of gas used by the entire transaction, EXCEPT        the gas used by the postRelayedCall itself.",
                    "relayData": "The relay params of the request. can be used by relayHub.calculateCharge()",
                    "success": "`true` if the relayed call succeeded, false if it reverted"
                }
            },
            "preRelayedCall(((address,address,uint256,uint256,uint256,bytes,uint256),(uint256,uint256,uint256,address,address,address,bytes,uint256)),bytes,bytes,uint256)": {
                "params": {
                    "approvalData": "- extra dapp-specific data (e.g. signature from trusted party)",
                    "maxPossibleGas": "- based on values returned from `getGasAndDataLimits` the RelayHub will calculate the maximum possible amount of gas the user may be charged for. In order to convert this value to wei, the Paymaster has to call \"relayHub.calculateCharge()\"",
                    "relayRequest": "- the full relay request structure",
                    "signature": "- user's EIP712-compatible signature of the `relayRequest`. Note that in most cases the paymaster shouldn't try use it at all. It is always checked by the forwarder immediately after preRelayedCall returns."
                },
                "returns": {
                    "_0": "A byte array to be passed to postRelayedCall. Can contain any data needed by this Paymaster in any form or be empty if no extra data is needed.",
                    "_1": "The flag that allows a Paymaster to \"delegate\" the rejection to the recipient code. It also means the Paymaster trust the recipient to reject fast: both preRelayedCall, forwarder check and recipient checks must fit into the GasLimits.acceptanceBudget, otherwise the TX is paid by the Paymaster. `true` if the Paymaster wants to reject the TX if the recipient reverts. `false` if the Paymaster wants rejects by the recipient to be completed on chain and paid by the Paymaster."
                }
            },
            "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
            },
            "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
            },
            "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
            },
            "versionPaymaster()": {
                "returns": {
                    "_0": "version The SemVer string of this Paymaster's version."
                }
            },
            "withdrawRelayHubDepositTo(uint256,address)": {
                "params": {
                    "amount": "The amount to be subtracted from the sender.",
                    "target": "The target to which the amount will be transferred."
                }
            }
        },
        "version": 1
    },
    "userdoc": {
        "kind": "user",
        "methods": {
            "getGasAndDataLimits()": {
                "notice": "Return the Gas Limits for Paymaster's functions and maximum msg.data length values for this Paymaster. This function allows different paymasters to have different properties without changes to the RelayHub."
            },
            "getTrustedForwarder()": {
                "notice": ":warning: **Warning** :warning: using incorrect Forwarder may cause the Paymaster to agreeing to pay for invalid transactions."
            },
            "postRelayedCall(bytes,bool,uint256,(uint256,uint256,uint256,address,address,address,bytes,uint256))": {
                "notice": "This method is called after the actual relayed function call. It may be used to record the transaction (e.g. charge the caller by some contract logic) for this call. Revert in this functions causes a revert of the client's relayed call (and preRelayedCall(), but the Paymaster is still committed to pay the relay for the entire transaction."
            },
            "preRelayedCall(((address,address,uint256,uint256,uint256,bytes,uint256),(uint256,uint256,uint256,address,address,address,bytes,uint256)),bytes,bytes,uint256)": {
                "notice": "Called by the Relay in view mode and later by the `RelayHub` on-chain to validate that the Paymaster agrees to pay for this call. The request is considered to be rejected by the Paymaster in one of the following conditions:  - `preRelayedCall()` method reverts  - the `Forwarder` reverts because of nonce or signature error  - the `Paymaster` returned `rejectOnRecipientRevert: true` and the recipient contract reverted    (and all that did not consume more than `acceptanceBudget` gas). In any of the above cases, all Paymaster calls and the recipient call are reverted. In any other case the Paymaster will pay for the gas cost of the transaction. Note that even if `postRelayedCall` is reverted the Paymaster will be charged."
            },
            "setRelayHub(address)": {
                "notice": "The owner of the Paymaster can change the instance of the RelayHub this Paymaster works with. :warning: **Warning** :warning: The deposit on the previous RelayHub must be withdrawn first."
            },
            "setTrustedForwarder(address)": {
                "notice": "The owner of the Paymaster can change the instance of the Forwarder this Paymaster works with.the Recipients must trust this Forwarder as well in order for the configuration to remain functional."
            },
            "withdrawRelayHubDepositTo(uint256,address)": {
                "notice": "Withdraw deposit from the RelayHub."
            }
        },
        "notice": "An abstract base class to be inherited by a concrete Paymaster. A subclass must implement:  - preRelayedCall  - postRelayedCall",
        "version": 1
    }
}
