{
    "contractName": "IForwarder",
    "abi": [
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": true,
                    "internalType": "bytes32",
                    "name": "domainSeparator",
                    "type": "bytes32"
                },
                {
                    "indexed": false,
                    "internalType": "bytes",
                    "name": "domainValue",
                    "type": "bytes"
                }
            ],
            "name": "DomainRegistered",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": true,
                    "internalType": "bytes32",
                    "name": "typeHash",
                    "type": "bytes32"
                },
                {
                    "indexed": false,
                    "internalType": "string",
                    "name": "typeStr",
                    "type": "string"
                }
            ],
            "name": "RequestTypeRegistered",
            "type": "event"
        },
        {
            "inputs": [
                {
                    "internalType": "bytes4",
                    "name": "interfaceId",
                    "type": "bytes4"
                }
            ],
            "name": "supportsInterface",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "from",
                    "type": "address"
                }
            ],
            "name": "getNonce",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "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": "forwardRequest",
                    "type": "tuple"
                },
                {
                    "internalType": "bytes32",
                    "name": "domainSeparator",
                    "type": "bytes32"
                },
                {
                    "internalType": "bytes32",
                    "name": "requestTypeHash",
                    "type": "bytes32"
                },
                {
                    "internalType": "bytes",
                    "name": "suffixData",
                    "type": "bytes"
                },
                {
                    "internalType": "bytes",
                    "name": "signature",
                    "type": "bytes"
                }
            ],
            "name": "verify",
            "outputs": [],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "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": "forwardRequest",
                    "type": "tuple"
                },
                {
                    "internalType": "bytes32",
                    "name": "domainSeparator",
                    "type": "bytes32"
                },
                {
                    "internalType": "bytes32",
                    "name": "requestTypeHash",
                    "type": "bytes32"
                },
                {
                    "internalType": "bytes",
                    "name": "suffixData",
                    "type": "bytes"
                },
                {
                    "internalType": "bytes",
                    "name": "signature",
                    "type": "bytes"
                }
            ],
            "name": "execute",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "success",
                    "type": "bool"
                },
                {
                    "internalType": "bytes",
                    "name": "ret",
                    "type": "bytes"
                }
            ],
            "stateMutability": "payable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "string",
                    "name": "typeName",
                    "type": "string"
                },
                {
                    "internalType": "string",
                    "name": "typeSuffix",
                    "type": "string"
                }
            ],
            "name": "registerRequestType",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "string",
                    "name": "name",
                    "type": "string"
                },
                {
                    "internalType": "string",
                    "name": "version",
                    "type": "string"
                }
            ],
            "name": "registerDomainSeparator",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        }
    ],
    "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"domainSeparator\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"domainValue\",\"type\":\"bytes\"}],\"name\":\"DomainRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"typeHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"typeStr\",\"type\":\"string\"}],\"name\":\"RequestTypeRegistered\",\"type\":\"event\"},{\"inputs\":[{\"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\":\"forwardRequest\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"domainSeparator\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"requestTypeHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"suffixData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"ret\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"name\":\"registerDomainSeparator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"typeName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"typeSuffix\",\"type\":\"string\"}],\"name\":\"registerRequestType\",\"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\":[{\"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\":\"forwardRequest\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"domainSeparator\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"requestTypeHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"suffixData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"verify\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"execute((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes32,bytes,bytes)\":{\"params\":{\"domainSeparator\":\"The domain used when signing this request.\",\"forwardRequest\":\"All requested transaction parameters.\",\"requestTypeHash\":\"The request type used when signing this request.\",\"signature\":\"The client signature to be validated.\",\"suffixData\":\"The ABI-encoded extension data for the current `RequestType` used when signing this request.\"},\"returns\":{\"ret\":\"The byte array returned by the underlying `CALL` to the target address.\",\"success\":\"The success flag of the underlying `CALL` to the target address.\"}},\"getNonce(address)\":{\"params\":{\"from\":\"The address of a sender.\"},\"returns\":{\"_0\":\"The nonce for this address.\"}},\"registerDomainSeparator(string,string)\":{\"params\":{\"name\":\"The domain's display name.\",\"version\":\"The domain/protocol version.\"}},\"registerRequestType(string,string)\":{\"params\":{\"typeName\":\"The name of the request type.\",\"typeSuffix\":\"Any extra data after the generic params. Must contain add at least one param. The generic ForwardRequest type is always registered by the constructor.\"}},\"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.\"}},\"title\":\"The Forwarder Interface\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"execute((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes32,bytes,bytes)\":{\"notice\":\"Executes a transaction specified by the `ForwardRequest`. The transaction is first verified and then executed. The success flag and returned bytes array of the `CALL` are returned as-is. This method would revert only in case of a verification error. All the target errors are reported using the returned success flag and returned bytes array.\"},\"registerDomainSeparator(string,string)\":{\"notice\":\"Register a new domain separator.This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.The domain separator must have the following fields: `name`, `version`, `chainId`, `verifyingContract`. The `chainId` is the current network's `chainId`, and the `verifyingContract` is this Forwarder's address. This method accepts the domain name and version to create and register the domain separator value.\"},\"registerRequestType(string,string)\":{\"notice\":\"Register a new Request typehash.This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.\"},\"verify((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes32,bytes,bytes)\":{\"notice\":\"Verify the transaction is valid and can be executed. Implementations must validate the signature and the nonce of the request are correct. Does not revert and returns successfully if the input is valid. Reverts if any validation has failed. For instance, if either signature or nonce are incorrect. Reverts if `domainSeparator` or `requestTypeHash` are not registered as well.\"}},\"notice\":\"The contracts implementing this interface take a role of authorization, authentication and replay protection for contracts that choose to trust a `Forwarder`, instead of relying on a mechanism built into the Ethereum protocol.if the `Forwarder` contract decides that an incoming `ForwardRequest` is valid, it must append 20 bytes that represent the caller to the `data` field of the request and send this new data to the target address (the `to` field) :warning: **Warning** :warning: The Forwarder can have a full control over a `Recipient` contract. Any vulnerability in a `Forwarder` implementation can make all of its `Recipient` contracts susceptible! Recipient contracts should only trust forwarders that passed through security audit, otherwise they are susceptible to identity theft.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/alexf/gsn2/packages/contracts/solpp/forwarder/IForwarder.sol\":\"IForwarder\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/alexf/gsn2/packages/contracts/solpp/forwarder/IForwarder.sol\":{\"keccak256\":\"0xef3d770001c3245db4408cdd0afdfc622695ccfe31f28b74571d05158bbf83f8\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://08949174ed05b596d89c8f1eeedfeb254993b84054bbc1ff6081ad926f5db406\",\"dweb:/ipfs/QmNQtKzHpie4Esocxuc9YrPtGQyA928a1a5TWbVc7cPoqk\"]},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0xd04b0f06e0666f29cf7cccc82894de541e19bb30a765b107b1e40bb7fe5f7d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7b652499d098e88d8d878374616bb58434301061cae2253298b3f374044e0ddb\",\"dweb:/ipfs/QmbhAzctqo5jrSKU6idHdVyqfmzCcDbNUPvmx4GiXxfA6q\"]},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]}},\"version\":1}",
    "bytecode": "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/interfaces/IERC165.sol\";\n\n/**\n * @title The Forwarder Interface\n * @notice The contracts implementing this interface take a role of authorization, authentication and replay protection\n * for contracts that choose to trust a `Forwarder`, instead of relying on a mechanism built into the Ethereum protocol.\n *\n * @notice if the `Forwarder` contract decides that an incoming `ForwardRequest` is valid, it must append 20 bytes that\n * represent the caller to the `data` field of the request and send this new data to the target address (the `to` field)\n *\n * :warning: **Warning** :warning: The Forwarder can have a full control over a `Recipient` contract.\n * Any vulnerability in a `Forwarder` implementation can make all of its `Recipient` contracts susceptible!\n * Recipient contracts should only trust forwarders that passed through security audit,\n * otherwise they are susceptible to identity theft.\n */\ninterface IForwarder is IERC165 {\n\n    /**\n     * @notice A representation of a request for a `Forwarder` to send `data` on behalf of a `from` to a target (`to`).\n     */\n    struct ForwardRequest {\n        address from;\n        address to;\n        uint256 value;\n        uint256 gas;\n        uint256 nonce;\n        bytes data;\n        uint256 validUntilTime;\n    }\n\n    event DomainRegistered(bytes32 indexed domainSeparator, bytes domainValue);\n\n    event RequestTypeRegistered(bytes32 indexed typeHash, string typeStr);\n\n    /**\n     * @param from The address of a sender.\n     * @return The nonce for this address.\n     */\n    function getNonce(address from)\n    external view\n    returns(uint256);\n\n    /**\n     * @notice Verify the transaction is valid and can be executed.\n     * Implementations must validate the signature and the nonce of the request are correct.\n     * Does not revert and returns successfully if the input is valid.\n     * Reverts if any validation has failed. For instance, if either signature or nonce are incorrect.\n     * Reverts if `domainSeparator` or `requestTypeHash` are not registered as well.\n     */\n    function verify(\n        ForwardRequest calldata forwardRequest,\n        bytes32 domainSeparator,\n        bytes32 requestTypeHash,\n        bytes calldata suffixData,\n        bytes calldata signature\n    ) external view;\n\n    /**\n     * @notice Executes a transaction specified by the `ForwardRequest`.\n     * The transaction is first verified and then executed.\n     * The success flag and returned bytes array of the `CALL` are returned as-is.\n     *\n     * This method would revert only in case of a verification error.\n     *\n     * All the target errors are reported using the returned success flag and returned bytes array.\n     *\n     * @param forwardRequest All requested transaction parameters.\n     * @param domainSeparator The domain used when signing this request.\n     * @param requestTypeHash The request type used when signing this request.\n     * @param suffixData The ABI-encoded extension data for the current `RequestType` used when signing this request.\n     * @param signature The client signature to be validated.\n     *\n     * @return success The success flag of the underlying `CALL` to the target address.\n     * @return ret The byte array returned by the underlying `CALL` to the target address.\n     */\n    function execute(\n        ForwardRequest calldata forwardRequest,\n        bytes32 domainSeparator,\n        bytes32 requestTypeHash,\n        bytes calldata suffixData,\n        bytes calldata signature\n    )\n    external payable\n    returns (bool success, bytes memory ret);\n\n    /**\n     * @notice Register a new Request typehash.\n     *\n     * @notice This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.\n     *\n     * @param typeName The name of the request type.\n     * @param typeSuffix Any extra data after the generic params. Must contain add at least one param.\n     * The generic ForwardRequest type is always registered by the constructor.\n     */\n    function registerRequestType(string calldata typeName, string calldata typeSuffix) external;\n\n    /**\n     * @notice Register a new domain separator.\n     *\n     * @notice This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.\n     *\n     * @notice The domain separator must have the following fields: `name`, `version`, `chainId`, `verifyingContract`.\n     * The `chainId` is the current network's `chainId`, and the `verifyingContract` is this Forwarder's address.\n     * This method accepts the domain name and version to create and register the domain separator value.\n     * @param name The domain's display name.\n     * @param version The domain/protocol version.\n     */\n    function registerDomainSeparator(string calldata name, string calldata version) external;\n}",
    "sourcePath": "/Users/alexf/gsn2/packages/contracts/solpp/forwarder/IForwarder.sol",
    "ast": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/forwarder/IForwarder.sol",
        "exportedSymbols": {
            "IERC165": [
                12352
            ],
            "IForwarder": [
                5129
            ]
        },
        "id": 5130,
        "license": "GPL-3.0-only",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 5038,
                "literals": [
                    "solidity",
                    ">=",
                    "0.7",
                    ".6"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:24:9"
            },
            {
                "id": 5039,
                "literals": [
                    "abicoder",
                    "v2"
                ],
                "nodeType": "PragmaDirective",
                "src": "25:19:9"
            },
            {
                "absolutePath": "@openzeppelin/contracts/interfaces/IERC165.sol",
                "file": "@openzeppelin/contracts/interfaces/IERC165.sol",
                "id": 5040,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 5130,
                "sourceUnit": 10186,
                "src": "88:56:9",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": false,
                "baseContracts": [
                    {
                        "baseName": {
                            "id": 5042,
                            "name": "IERC165",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 12352,
                            "src": "1051:7:9"
                        },
                        "id": 5043,
                        "nodeType": "InheritanceSpecifier",
                        "src": "1051:7:9"
                    }
                ],
                "contractDependencies": [],
                "contractKind": "interface",
                "documentation": {
                    "id": 5041,
                    "nodeType": "StructuredDocumentation",
                    "src": "146:880:9",
                    "text": " @title The Forwarder Interface\n @notice The contracts implementing this interface take a role of authorization, authentication and replay protection\n for contracts that choose to trust a `Forwarder`, instead of relying on a mechanism built into the Ethereum protocol.\n @notice if the `Forwarder` contract decides that an incoming `ForwardRequest` is valid, it must append 20 bytes that\n represent the caller to the `data` field of the request and send this new data to the target address (the `to` field)\n :warning: **Warning** :warning: The Forwarder can have a full control over a `Recipient` contract.\n Any vulnerability in a `Forwarder` implementation can make all of its `Recipient` contracts susceptible!\n Recipient contracts should only trust forwarders that passed through security audit,\n otherwise they are susceptible to identity theft."
                },
                "fullyImplemented": false,
                "id": 5129,
                "linearizedBaseContracts": [
                    5129,
                    12352
                ],
                "name": "IForwarder",
                "nameLocation": "1037:10:9",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "canonicalName": "IForwarder.ForwardRequest",
                        "id": 5058,
                        "members": [
                            {
                                "constant": false,
                                "id": 5045,
                                "mutability": "mutable",
                                "name": "from",
                                "nameLocation": "1242:4:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1234:12:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                },
                                "typeName": {
                                    "id": 5044,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1234:7:9",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 5047,
                                "mutability": "mutable",
                                "name": "to",
                                "nameLocation": "1264:2:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1256:10:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                },
                                "typeName": {
                                    "id": 5046,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1256:7:9",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 5049,
                                "mutability": "mutable",
                                "name": "value",
                                "nameLocation": "1284:5:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1276:13:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                },
                                "typeName": {
                                    "id": 5048,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1276:7:9",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 5051,
                                "mutability": "mutable",
                                "name": "gas",
                                "nameLocation": "1307:3:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1299:11:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                },
                                "typeName": {
                                    "id": 5050,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1299:7:9",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 5053,
                                "mutability": "mutable",
                                "name": "nonce",
                                "nameLocation": "1328:5:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1320:13:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                },
                                "typeName": {
                                    "id": 5052,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1320:7:9",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 5055,
                                "mutability": "mutable",
                                "name": "data",
                                "nameLocation": "1349:4:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1343:10:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_storage_ptr",
                                    "typeString": "bytes"
                                },
                                "typeName": {
                                    "id": 5054,
                                    "name": "bytes",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1343:5:9",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_storage_ptr",
                                        "typeString": "bytes"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 5057,
                                "mutability": "mutable",
                                "name": "validUntilTime",
                                "nameLocation": "1371:14:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1363:22:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                },
                                "typeName": {
                                    "id": 5056,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1363:7:9",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    }
                                },
                                "visibility": "internal"
                            }
                        ],
                        "name": "ForwardRequest",
                        "nameLocation": "1209:14:9",
                        "nodeType": "StructDefinition",
                        "scope": 5129,
                        "src": "1202:190:9",
                        "visibility": "public"
                    },
                    {
                        "anonymous": false,
                        "id": 5064,
                        "name": "DomainRegistered",
                        "nameLocation": "1404:16:9",
                        "nodeType": "EventDefinition",
                        "parameters": {
                            "id": 5063,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5060,
                                    "indexed": true,
                                    "mutability": "mutable",
                                    "name": "domainSeparator",
                                    "nameLocation": "1437:15:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5064,
                                    "src": "1421:31:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 5059,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1421:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5062,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "domainValue",
                                    "nameLocation": "1460:11:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5064,
                                    "src": "1454:17:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5061,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1454:5:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1420:52:9"
                        },
                        "src": "1398:75:9"
                    },
                    {
                        "anonymous": false,
                        "id": 5070,
                        "name": "RequestTypeRegistered",
                        "nameLocation": "1485:21:9",
                        "nodeType": "EventDefinition",
                        "parameters": {
                            "id": 5069,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5066,
                                    "indexed": true,
                                    "mutability": "mutable",
                                    "name": "typeHash",
                                    "nameLocation": "1523:8:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5070,
                                    "src": "1507:24:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 5065,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1507:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5068,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "typeStr",
                                    "nameLocation": "1540:7:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5070,
                                    "src": "1533:14:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5067,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1533:6:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1506:42:9"
                        },
                        "src": "1479:70:9"
                    },
                    {
                        "documentation": {
                            "id": 5071,
                            "nodeType": "StructuredDocumentation",
                            "src": "1555:98:9",
                            "text": " @param from The address of a sender.\n @return The nonce for this address."
                        },
                        "functionSelector": "2d0335ab",
                        "id": 5078,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "getNonce",
                        "nameLocation": "1667:8:9",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5074,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5073,
                                    "mutability": "mutable",
                                    "name": "from",
                                    "nameLocation": "1684:4:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5078,
                                    "src": "1676:12:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 5072,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1676:7:9",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1675:14:9"
                        },
                        "returnParameters": {
                            "id": 5077,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5076,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5078,
                                    "src": "1720:7:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 5075,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1720:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1719:9:9"
                        },
                        "scope": 5129,
                        "src": "1658:71:9",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "documentation": {
                            "id": 5079,
                            "nodeType": "StructuredDocumentation",
                            "src": "1735:431:9",
                            "text": " @notice Verify the transaction is valid and can be executed.\n Implementations must validate the signature and the nonce of the request are correct.\n Does not revert and returns successfully if the input is valid.\n Reverts if any validation has failed. For instance, if either signature or nonce are incorrect.\n Reverts if `domainSeparator` or `requestTypeHash` are not registered as well."
                        },
                        "functionSelector": "ad9f99c7",
                        "id": 5093,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "verify",
                        "nameLocation": "2180:6:9",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5091,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5082,
                                    "mutability": "mutable",
                                    "name": "forwardRequest",
                                    "nameLocation": "2220:14:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5093,
                                    "src": "2196:38:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                        "typeString": "struct IForwarder.ForwardRequest"
                                    },
                                    "typeName": {
                                        "id": 5081,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 5080,
                                            "name": "ForwardRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 5058,
                                            "src": "2196:14:9"
                                        },
                                        "referencedDeclaration": 5058,
                                        "src": "2196:14:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_ForwardRequest_$5058_storage_ptr",
                                            "typeString": "struct IForwarder.ForwardRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5084,
                                    "mutability": "mutable",
                                    "name": "domainSeparator",
                                    "nameLocation": "2252:15:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5093,
                                    "src": "2244:23:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 5083,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2244:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5086,
                                    "mutability": "mutable",
                                    "name": "requestTypeHash",
                                    "nameLocation": "2285:15:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5093,
                                    "src": "2277:23:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 5085,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2277:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5088,
                                    "mutability": "mutable",
                                    "name": "suffixData",
                                    "nameLocation": "2325:10:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5093,
                                    "src": "2310:25:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5087,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2310:5:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5090,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "2360:9:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5093,
                                    "src": "2345:24:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5089,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2345:5:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2186:189:9"
                        },
                        "returnParameters": {
                            "id": 5092,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2389:0:9"
                        },
                        "scope": 5129,
                        "src": "2171:219:9",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "documentation": {
                            "id": 5094,
                            "nodeType": "StructuredDocumentation",
                            "src": "2396:1003:9",
                            "text": " @notice Executes a transaction specified by the `ForwardRequest`.\n The transaction is first verified and then executed.\n The success flag and returned bytes array of the `CALL` are returned as-is.\n This method would revert only in case of a verification error.\n All the target errors are reported using the returned success flag and returned bytes array.\n @param forwardRequest All requested transaction parameters.\n @param domainSeparator The domain used when signing this request.\n @param requestTypeHash The request type used when signing this request.\n @param suffixData The ABI-encoded extension data for the current `RequestType` used when signing this request.\n @param signature The client signature to be validated.\n @return success The success flag of the underlying `CALL` to the target address.\n @return ret The byte array returned by the underlying `CALL` to the target address."
                        },
                        "functionSelector": "e024dc7f",
                        "id": 5112,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "execute",
                        "nameLocation": "3413:7:9",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5106,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5097,
                                    "mutability": "mutable",
                                    "name": "forwardRequest",
                                    "nameLocation": "3454:14:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3430:38:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                        "typeString": "struct IForwarder.ForwardRequest"
                                    },
                                    "typeName": {
                                        "id": 5096,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 5095,
                                            "name": "ForwardRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 5058,
                                            "src": "3430:14:9"
                                        },
                                        "referencedDeclaration": 5058,
                                        "src": "3430:14:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_ForwardRequest_$5058_storage_ptr",
                                            "typeString": "struct IForwarder.ForwardRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5099,
                                    "mutability": "mutable",
                                    "name": "domainSeparator",
                                    "nameLocation": "3486:15:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3478:23:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 5098,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3478:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5101,
                                    "mutability": "mutable",
                                    "name": "requestTypeHash",
                                    "nameLocation": "3519:15:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3511:23:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 5100,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3511:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5103,
                                    "mutability": "mutable",
                                    "name": "suffixData",
                                    "nameLocation": "3559:10:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3544:25:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5102,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3544:5:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5105,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "3594:9:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3579:24:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5104,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3579:5:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3420:189:9"
                        },
                        "returnParameters": {
                            "id": 5111,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5108,
                                    "mutability": "mutable",
                                    "name": "success",
                                    "nameLocation": "3649:7:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3644:12:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 5107,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3644:4:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5110,
                                    "mutability": "mutable",
                                    "name": "ret",
                                    "nameLocation": "3671:3:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3658:16:9",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5109,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3658:5:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3643:32:9"
                        },
                        "scope": 5129,
                        "src": "3404:272:9",
                        "stateMutability": "payable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "documentation": {
                            "id": 5113,
                            "nodeType": "StructuredDocumentation",
                            "src": "3682:423:9",
                            "text": " @notice Register a new Request typehash.\n @notice This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.\n @param typeName The name of the request type.\n @param typeSuffix Any extra data after the generic params. Must contain add at least one param.\n The generic ForwardRequest type is always registered by the constructor."
                        },
                        "functionSelector": "d9210be5",
                        "id": 5120,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "registerRequestType",
                        "nameLocation": "4119:19:9",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5118,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5115,
                                    "mutability": "mutable",
                                    "name": "typeName",
                                    "nameLocation": "4155:8:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5120,
                                    "src": "4139:24:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_calldata_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5114,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4139:6:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5117,
                                    "mutability": "mutable",
                                    "name": "typeSuffix",
                                    "nameLocation": "4181:10:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5120,
                                    "src": "4165:26:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_calldata_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5116,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4165:6:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4138:54:9"
                        },
                        "returnParameters": {
                            "id": 5119,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4201:0:9"
                        },
                        "scope": 5129,
                        "src": "4110:92:9",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "documentation": {
                            "id": 5121,
                            "nodeType": "StructuredDocumentation",
                            "src": "4208:623:9",
                            "text": " @notice Register a new domain separator.\n @notice This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.\n @notice The domain separator must have the following fields: `name`, `version`, `chainId`, `verifyingContract`.\n The `chainId` is the current network's `chainId`, and the `verifyingContract` is this Forwarder's address.\n This method accepts the domain name and version to create and register the domain separator value.\n @param name The domain's display name.\n @param version The domain/protocol version."
                        },
                        "functionSelector": "9c7b4592",
                        "id": 5128,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "registerDomainSeparator",
                        "nameLocation": "4845:23:9",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5126,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5123,
                                    "mutability": "mutable",
                                    "name": "name",
                                    "nameLocation": "4885:4:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5128,
                                    "src": "4869:20:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_calldata_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5122,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4869:6:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5125,
                                    "mutability": "mutable",
                                    "name": "version",
                                    "nameLocation": "4907:7:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5128,
                                    "src": "4891:23:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_calldata_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5124,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4891:6:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4868:47:9"
                        },
                        "returnParameters": {
                            "id": 5127,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4924:0:9"
                        },
                        "scope": 5129,
                        "src": "4836:89:9",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "external"
                    }
                ],
                "scope": 5130,
                "src": "1027:3900:9",
                "usedErrors": []
            }
        ],
        "src": "0:4927:9"
    },
    "legacyAST": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/forwarder/IForwarder.sol",
        "exportedSymbols": {
            "IERC165": [
                12352
            ],
            "IForwarder": [
                5129
            ]
        },
        "id": 5130,
        "license": "GPL-3.0-only",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 5038,
                "literals": [
                    "solidity",
                    ">=",
                    "0.7",
                    ".6"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:24:9"
            },
            {
                "id": 5039,
                "literals": [
                    "abicoder",
                    "v2"
                ],
                "nodeType": "PragmaDirective",
                "src": "25:19:9"
            },
            {
                "absolutePath": "@openzeppelin/contracts/interfaces/IERC165.sol",
                "file": "@openzeppelin/contracts/interfaces/IERC165.sol",
                "id": 5040,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 5130,
                "sourceUnit": 10186,
                "src": "88:56:9",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": false,
                "baseContracts": [
                    {
                        "baseName": {
                            "id": 5042,
                            "name": "IERC165",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 12352,
                            "src": "1051:7:9"
                        },
                        "id": 5043,
                        "nodeType": "InheritanceSpecifier",
                        "src": "1051:7:9"
                    }
                ],
                "contractDependencies": [],
                "contractKind": "interface",
                "documentation": {
                    "id": 5041,
                    "nodeType": "StructuredDocumentation",
                    "src": "146:880:9",
                    "text": " @title The Forwarder Interface\n @notice The contracts implementing this interface take a role of authorization, authentication and replay protection\n for contracts that choose to trust a `Forwarder`, instead of relying on a mechanism built into the Ethereum protocol.\n @notice if the `Forwarder` contract decides that an incoming `ForwardRequest` is valid, it must append 20 bytes that\n represent the caller to the `data` field of the request and send this new data to the target address (the `to` field)\n :warning: **Warning** :warning: The Forwarder can have a full control over a `Recipient` contract.\n Any vulnerability in a `Forwarder` implementation can make all of its `Recipient` contracts susceptible!\n Recipient contracts should only trust forwarders that passed through security audit,\n otherwise they are susceptible to identity theft."
                },
                "fullyImplemented": false,
                "id": 5129,
                "linearizedBaseContracts": [
                    5129,
                    12352
                ],
                "name": "IForwarder",
                "nameLocation": "1037:10:9",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "canonicalName": "IForwarder.ForwardRequest",
                        "id": 5058,
                        "members": [
                            {
                                "constant": false,
                                "id": 5045,
                                "mutability": "mutable",
                                "name": "from",
                                "nameLocation": "1242:4:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1234:12:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                },
                                "typeName": {
                                    "id": 5044,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1234:7:9",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 5047,
                                "mutability": "mutable",
                                "name": "to",
                                "nameLocation": "1264:2:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1256:10:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                },
                                "typeName": {
                                    "id": 5046,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1256:7:9",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 5049,
                                "mutability": "mutable",
                                "name": "value",
                                "nameLocation": "1284:5:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1276:13:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                },
                                "typeName": {
                                    "id": 5048,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1276:7:9",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 5051,
                                "mutability": "mutable",
                                "name": "gas",
                                "nameLocation": "1307:3:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1299:11:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                },
                                "typeName": {
                                    "id": 5050,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1299:7:9",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 5053,
                                "mutability": "mutable",
                                "name": "nonce",
                                "nameLocation": "1328:5:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1320:13:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                },
                                "typeName": {
                                    "id": 5052,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1320:7:9",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 5055,
                                "mutability": "mutable",
                                "name": "data",
                                "nameLocation": "1349:4:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1343:10:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_storage_ptr",
                                    "typeString": "bytes"
                                },
                                "typeName": {
                                    "id": 5054,
                                    "name": "bytes",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1343:5:9",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_storage_ptr",
                                        "typeString": "bytes"
                                    }
                                },
                                "visibility": "internal"
                            },
                            {
                                "constant": false,
                                "id": 5057,
                                "mutability": "mutable",
                                "name": "validUntilTime",
                                "nameLocation": "1371:14:9",
                                "nodeType": "VariableDeclaration",
                                "scope": 5058,
                                "src": "1363:22:9",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                },
                                "typeName": {
                                    "id": 5056,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1363:7:9",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    }
                                },
                                "visibility": "internal"
                            }
                        ],
                        "name": "ForwardRequest",
                        "nameLocation": "1209:14:9",
                        "nodeType": "StructDefinition",
                        "scope": 5129,
                        "src": "1202:190:9",
                        "visibility": "public"
                    },
                    {
                        "anonymous": false,
                        "id": 5064,
                        "name": "DomainRegistered",
                        "nameLocation": "1404:16:9",
                        "nodeType": "EventDefinition",
                        "parameters": {
                            "id": 5063,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5060,
                                    "indexed": true,
                                    "mutability": "mutable",
                                    "name": "domainSeparator",
                                    "nameLocation": "1437:15:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5064,
                                    "src": "1421:31:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 5059,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1421:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5062,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "domainValue",
                                    "nameLocation": "1460:11:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5064,
                                    "src": "1454:17:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5061,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1454:5:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1420:52:9"
                        },
                        "src": "1398:75:9"
                    },
                    {
                        "anonymous": false,
                        "id": 5070,
                        "name": "RequestTypeRegistered",
                        "nameLocation": "1485:21:9",
                        "nodeType": "EventDefinition",
                        "parameters": {
                            "id": 5069,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5066,
                                    "indexed": true,
                                    "mutability": "mutable",
                                    "name": "typeHash",
                                    "nameLocation": "1523:8:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5070,
                                    "src": "1507:24:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 5065,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1507:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5068,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "typeStr",
                                    "nameLocation": "1540:7:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5070,
                                    "src": "1533:14:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5067,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1533:6:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1506:42:9"
                        },
                        "src": "1479:70:9"
                    },
                    {
                        "documentation": {
                            "id": 5071,
                            "nodeType": "StructuredDocumentation",
                            "src": "1555:98:9",
                            "text": " @param from The address of a sender.\n @return The nonce for this address."
                        },
                        "functionSelector": "2d0335ab",
                        "id": 5078,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "getNonce",
                        "nameLocation": "1667:8:9",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5074,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5073,
                                    "mutability": "mutable",
                                    "name": "from",
                                    "nameLocation": "1684:4:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5078,
                                    "src": "1676:12:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 5072,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1676:7:9",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1675:14:9"
                        },
                        "returnParameters": {
                            "id": 5077,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5076,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5078,
                                    "src": "1720:7:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 5075,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1720:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1719:9:9"
                        },
                        "scope": 5129,
                        "src": "1658:71:9",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "documentation": {
                            "id": 5079,
                            "nodeType": "StructuredDocumentation",
                            "src": "1735:431:9",
                            "text": " @notice Verify the transaction is valid and can be executed.\n Implementations must validate the signature and the nonce of the request are correct.\n Does not revert and returns successfully if the input is valid.\n Reverts if any validation has failed. For instance, if either signature or nonce are incorrect.\n Reverts if `domainSeparator` or `requestTypeHash` are not registered as well."
                        },
                        "functionSelector": "ad9f99c7",
                        "id": 5093,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "verify",
                        "nameLocation": "2180:6:9",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5091,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5082,
                                    "mutability": "mutable",
                                    "name": "forwardRequest",
                                    "nameLocation": "2220:14:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5093,
                                    "src": "2196:38:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                        "typeString": "struct IForwarder.ForwardRequest"
                                    },
                                    "typeName": {
                                        "id": 5081,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 5080,
                                            "name": "ForwardRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 5058,
                                            "src": "2196:14:9"
                                        },
                                        "referencedDeclaration": 5058,
                                        "src": "2196:14:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_ForwardRequest_$5058_storage_ptr",
                                            "typeString": "struct IForwarder.ForwardRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5084,
                                    "mutability": "mutable",
                                    "name": "domainSeparator",
                                    "nameLocation": "2252:15:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5093,
                                    "src": "2244:23:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 5083,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2244:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5086,
                                    "mutability": "mutable",
                                    "name": "requestTypeHash",
                                    "nameLocation": "2285:15:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5093,
                                    "src": "2277:23:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 5085,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2277:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5088,
                                    "mutability": "mutable",
                                    "name": "suffixData",
                                    "nameLocation": "2325:10:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5093,
                                    "src": "2310:25:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5087,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2310:5:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5090,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "2360:9:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5093,
                                    "src": "2345:24:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5089,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2345:5:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2186:189:9"
                        },
                        "returnParameters": {
                            "id": 5092,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2389:0:9"
                        },
                        "scope": 5129,
                        "src": "2171:219:9",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "documentation": {
                            "id": 5094,
                            "nodeType": "StructuredDocumentation",
                            "src": "2396:1003:9",
                            "text": " @notice Executes a transaction specified by the `ForwardRequest`.\n The transaction is first verified and then executed.\n The success flag and returned bytes array of the `CALL` are returned as-is.\n This method would revert only in case of a verification error.\n All the target errors are reported using the returned success flag and returned bytes array.\n @param forwardRequest All requested transaction parameters.\n @param domainSeparator The domain used when signing this request.\n @param requestTypeHash The request type used when signing this request.\n @param suffixData The ABI-encoded extension data for the current `RequestType` used when signing this request.\n @param signature The client signature to be validated.\n @return success The success flag of the underlying `CALL` to the target address.\n @return ret The byte array returned by the underlying `CALL` to the target address."
                        },
                        "functionSelector": "e024dc7f",
                        "id": 5112,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "execute",
                        "nameLocation": "3413:7:9",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5106,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5097,
                                    "mutability": "mutable",
                                    "name": "forwardRequest",
                                    "nameLocation": "3454:14:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3430:38:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                        "typeString": "struct IForwarder.ForwardRequest"
                                    },
                                    "typeName": {
                                        "id": 5096,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 5095,
                                            "name": "ForwardRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 5058,
                                            "src": "3430:14:9"
                                        },
                                        "referencedDeclaration": 5058,
                                        "src": "3430:14:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_ForwardRequest_$5058_storage_ptr",
                                            "typeString": "struct IForwarder.ForwardRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5099,
                                    "mutability": "mutable",
                                    "name": "domainSeparator",
                                    "nameLocation": "3486:15:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3478:23:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 5098,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3478:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5101,
                                    "mutability": "mutable",
                                    "name": "requestTypeHash",
                                    "nameLocation": "3519:15:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3511:23:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 5100,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3511:7:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5103,
                                    "mutability": "mutable",
                                    "name": "suffixData",
                                    "nameLocation": "3559:10:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3544:25:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5102,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3544:5:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5105,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "3594:9:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3579:24:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5104,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3579:5:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3420:189:9"
                        },
                        "returnParameters": {
                            "id": 5111,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5108,
                                    "mutability": "mutable",
                                    "name": "success",
                                    "nameLocation": "3649:7:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3644:12:9",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 5107,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3644:4:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5110,
                                    "mutability": "mutable",
                                    "name": "ret",
                                    "nameLocation": "3671:3:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5112,
                                    "src": "3658:16:9",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5109,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3658:5:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "3643:32:9"
                        },
                        "scope": 5129,
                        "src": "3404:272:9",
                        "stateMutability": "payable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "documentation": {
                            "id": 5113,
                            "nodeType": "StructuredDocumentation",
                            "src": "3682:423:9",
                            "text": " @notice Register a new Request typehash.\n @notice This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.\n @param typeName The name of the request type.\n @param typeSuffix Any extra data after the generic params. Must contain add at least one param.\n The generic ForwardRequest type is always registered by the constructor."
                        },
                        "functionSelector": "d9210be5",
                        "id": 5120,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "registerRequestType",
                        "nameLocation": "4119:19:9",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5118,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5115,
                                    "mutability": "mutable",
                                    "name": "typeName",
                                    "nameLocation": "4155:8:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5120,
                                    "src": "4139:24:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_calldata_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5114,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4139:6:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5117,
                                    "mutability": "mutable",
                                    "name": "typeSuffix",
                                    "nameLocation": "4181:10:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5120,
                                    "src": "4165:26:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_calldata_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5116,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4165:6:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4138:54:9"
                        },
                        "returnParameters": {
                            "id": 5119,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4201:0:9"
                        },
                        "scope": 5129,
                        "src": "4110:92:9",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "documentation": {
                            "id": 5121,
                            "nodeType": "StructuredDocumentation",
                            "src": "4208:623:9",
                            "text": " @notice Register a new domain separator.\n @notice This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.\n @notice The domain separator must have the following fields: `name`, `version`, `chainId`, `verifyingContract`.\n The `chainId` is the current network's `chainId`, and the `verifyingContract` is this Forwarder's address.\n This method accepts the domain name and version to create and register the domain separator value.\n @param name The domain's display name.\n @param version The domain/protocol version."
                        },
                        "functionSelector": "9c7b4592",
                        "id": 5128,
                        "implemented": false,
                        "kind": "function",
                        "modifiers": [],
                        "name": "registerDomainSeparator",
                        "nameLocation": "4845:23:9",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5126,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5123,
                                    "mutability": "mutable",
                                    "name": "name",
                                    "nameLocation": "4885:4:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5128,
                                    "src": "4869:20:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_calldata_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5122,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4869:6:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5125,
                                    "mutability": "mutable",
                                    "name": "version",
                                    "nameLocation": "4907:7:9",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5128,
                                    "src": "4891:23:9",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_calldata_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5124,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4891:6:9",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "4868:47:9"
                        },
                        "returnParameters": {
                            "id": 5127,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "4924:0:9"
                        },
                        "scope": 5129,
                        "src": "4836:89:9",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "external"
                    }
                ],
                "scope": 5130,
                "src": "1027:3900:9",
                "usedErrors": []
            }
        ],
        "src": "0:4927:9"
    },
    "compiler": {
        "name": "solc",
        "version": "0.8.7+commit.e28d00a7.Emscripten.clang"
    },
    "networks": {},
    "schemaVersion": "3.1.0",
    "updatedAt": "2023-03-16T16:54:15.196Z",
    "devdoc": {
        "kind": "dev",
        "methods": {
            "execute((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes32,bytes,bytes)": {
                "params": {
                    "domainSeparator": "The domain used when signing this request.",
                    "forwardRequest": "All requested transaction parameters.",
                    "requestTypeHash": "The request type used when signing this request.",
                    "signature": "The client signature to be validated.",
                    "suffixData": "The ABI-encoded extension data for the current `RequestType` used when signing this request."
                },
                "returns": {
                    "ret": "The byte array returned by the underlying `CALL` to the target address.",
                    "success": "The success flag of the underlying `CALL` to the target address."
                }
            },
            "getNonce(address)": {
                "params": {
                    "from": "The address of a sender."
                },
                "returns": {
                    "_0": "The nonce for this address."
                }
            },
            "registerDomainSeparator(string,string)": {
                "params": {
                    "name": "The domain's display name.",
                    "version": "The domain/protocol version."
                }
            },
            "registerRequestType(string,string)": {
                "params": {
                    "typeName": "The name of the request type.",
                    "typeSuffix": "Any extra data after the generic params. Must contain add at least one param. The generic ForwardRequest type is always registered by the constructor."
                }
            },
            "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."
            }
        },
        "title": "The Forwarder Interface",
        "version": 1
    },
    "userdoc": {
        "kind": "user",
        "methods": {
            "execute((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes32,bytes,bytes)": {
                "notice": "Executes a transaction specified by the `ForwardRequest`. The transaction is first verified and then executed. The success flag and returned bytes array of the `CALL` are returned as-is. This method would revert only in case of a verification error. All the target errors are reported using the returned success flag and returned bytes array."
            },
            "registerDomainSeparator(string,string)": {
                "notice": "Register a new domain separator.This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.The domain separator must have the following fields: `name`, `version`, `chainId`, `verifyingContract`. The `chainId` is the current network's `chainId`, and the `verifyingContract` is this Forwarder's address. This method accepts the domain name and version to create and register the domain separator value."
            },
            "registerRequestType(string,string)": {
                "notice": "Register a new Request typehash.This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712."
            },
            "verify((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes32,bytes,bytes)": {
                "notice": "Verify the transaction is valid and can be executed. Implementations must validate the signature and the nonce of the request are correct. Does not revert and returns successfully if the input is valid. Reverts if any validation has failed. For instance, if either signature or nonce are incorrect. Reverts if `domainSeparator` or `requestTypeHash` are not registered as well."
            }
        },
        "notice": "The contracts implementing this interface take a role of authorization, authentication and replay protection for contracts that choose to trust a `Forwarder`, instead of relying on a mechanism built into the Ethereum protocol.if the `Forwarder` contract decides that an incoming `ForwardRequest` is valid, it must append 20 bytes that represent the caller to the `data` field of the request and send this new data to the target address (the `to` field) :warning: **Warning** :warning: The Forwarder can have a full control over a `Recipient` contract. Any vulnerability in a `Forwarder` implementation can make all of its `Recipient` contracts susceptible! Recipient contracts should only trust forwarders that passed through security audit, otherwise they are susceptible to identity theft.",
        "version": 1
    }
}
