{
    "contractName": "ERC2771Recipient",
    "abi": [
        {
            "inputs": [],
            "name": "getTrustedForwarder",
            "outputs": [
                {
                    "internalType": "address",
                    "name": "forwarder",
                    "type": "address"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "forwarder",
                    "type": "address"
                }
            ],
            "name": "isTrustedForwarder",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        }
    ],
    "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"getTrustedForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"isTrustedForwarder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getTrustedForwarder()\":{\"returns\":{\"forwarder\":\"The address of the Forwarder contract that is being used.\"}},\"isTrustedForwarder(address)\":{\"params\":{\"forwarder\":\"The address of the Forwarder contract that is being used.\"},\"returns\":{\"_0\":\"isTrustedForwarder `true` if the Forwarder is trusted to forward relayed transactions by this Recipient.\"}}},\"title\":\"The ERC-2771 Recipient Base Abstract Class - Implementation\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getTrustedForwarder()\":{\"notice\":\":warning: **Warning** :warning: The Forwarder can have a full control over your Recipient. Only trust verified Forwarder.Method is not a required method to allow Recipients to trust multiple Forwarders. Not recommended yet.\"},\"isTrustedForwarder(address)\":{\"notice\":\":warning: **Warning** :warning: The Forwarder can have a full control over your Recipient. Only trust verified Forwarder.\"}},\"notice\":\"Note that this contract was called `BaseRelayRecipient` in the previous revision of the GSN.A base contract to be inherited by any contract that want to receive relayed transactions.A subclass must use `_msgSender()` instead of `msg.sender`.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@opengsn/contracts/src/ERC2771Recipient.sol\":\"ERC2771Recipient\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@opengsn/contracts/src/ERC2771Recipient.sol\":{\"keccak256\":\"0x77b3307c570c582969ea5466f296898ab9fea1f8b61b30f1c73345fe047a89a9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b2a2f0642c775f89615b1717ee3db50cf3732f59bc66032b06fee6c9018e308b\",\"dweb:/ipfs/QmRtsTQeTYk6muGrU7Qurjw6FeUVUBBXXhcUQNWvCoJysT\"]},\"@opengsn/contracts/src/interfaces/IERC2771Recipient.sol\":{\"keccak256\":\"0xc762358681e3494519a5fff2f7e3f0f74f9c9f395f23b00cdfb45e0fb9ef8170\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://68680e24b98e554eb64e724a6ddab30827d5091ae36812e2a4e1b1914481ca4c\",\"dweb:/ipfs/QmR9TVoucNzaeiAgSu1miqoQ4SZAcMCB2yRd32YuEXVWLB\"]}},\"version\":1}",
    "bytecode": "0x",
    "deployedBytecode": "0x",
    "immutableReferences": {},
    "sourceMap": "",
    "deployedSourceMap": "",
    "source": "// SPDX-License-Identifier: MIT\n// solhint-disable no-inline-assembly\npragma solidity >=0.6.9;\n\nimport \"./interfaces/IERC2771Recipient.sol\";\n\n/**\n * @title The ERC-2771 Recipient Base Abstract Class - Implementation\n *\n * @notice Note that this contract was called `BaseRelayRecipient` in the previous revision of the GSN.\n *\n * @notice A base contract to be inherited by any contract that want to receive relayed transactions.\n *\n * @notice A subclass must use `_msgSender()` instead of `msg.sender`.\n */\nabstract contract ERC2771Recipient is IERC2771Recipient {\n\n    /*\n     * Forwarder singleton we accept calls from\n     */\n    address private _trustedForwarder;\n\n    /**\n     * :warning: **Warning** :warning: The Forwarder can have a full control over your Recipient. Only trust verified Forwarder.\n     * @notice Method is not a required method to allow Recipients to trust multiple Forwarders. Not recommended yet.\n     * @return forwarder The address of the Forwarder contract that is being used.\n     */\n    function getTrustedForwarder() public virtual view returns (address forwarder){\n        return _trustedForwarder;\n    }\n\n    function _setTrustedForwarder(address _forwarder) internal {\n        _trustedForwarder = _forwarder;\n    }\n\n    /// @inheritdoc IERC2771Recipient\n    function isTrustedForwarder(address forwarder) public virtual override view returns(bool) {\n        return forwarder == _trustedForwarder;\n    }\n\n    /// @inheritdoc IERC2771Recipient\n    function _msgSender() internal override virtual view returns (address ret) {\n        if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) {\n            // At this point we know that the sender is a trusted forwarder,\n            // so we trust that the last bytes of msg.data are the verified sender address.\n            // extract sender address from the end of msg.data\n            assembly {\n                ret := shr(96,calldataload(sub(calldatasize(),20)))\n            }\n        } else {\n            ret = msg.sender;\n        }\n    }\n\n    /// @inheritdoc IERC2771Recipient\n    function _msgData() internal override virtual view returns (bytes calldata ret) {\n        if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) {\n            return msg.data[0:msg.data.length-20];\n        } else {\n            return msg.data;\n        }\n    }\n}\n",
    "sourcePath": "@opengsn/contracts/src/ERC2771Recipient.sol",
    "ast": {
        "absolutePath": "@opengsn/contracts/src/ERC2771Recipient.sol",
        "exportedSymbols": {
            "ERC2771Recipient": [
                10045
            ],
            "IERC2771Recipient": [
                10069
            ]
        },
        "id": 10046,
        "license": "MIT",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 9944,
                "literals": [
                    "solidity",
                    ">=",
                    "0.6",
                    ".9"
                ],
                "nodeType": "PragmaDirective",
                "src": "70:24:45"
            },
            {
                "absolutePath": "@opengsn/contracts/src/interfaces/IERC2771Recipient.sol",
                "file": "./interfaces/IERC2771Recipient.sol",
                "id": 9945,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 10046,
                "sourceUnit": 10070,
                "src": "96:44:45",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": true,
                "baseContracts": [
                    {
                        "baseName": {
                            "id": 9947,
                            "name": "IERC2771Recipient",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 10069,
                            "src": "544:17:45"
                        },
                        "id": 9948,
                        "nodeType": "InheritanceSpecifier",
                        "src": "544:17:45"
                    }
                ],
                "contractDependencies": [],
                "contractKind": "contract",
                "documentation": {
                    "id": 9946,
                    "nodeType": "StructuredDocumentation",
                    "src": "142:363:45",
                    "text": " @title The ERC-2771 Recipient Base Abstract Class - Implementation\n @notice Note that this contract was called `BaseRelayRecipient` in the previous revision of the GSN.\n @notice A base contract to be inherited by any contract that want to receive relayed transactions.\n @notice A subclass must use `_msgSender()` instead of `msg.sender`."
                },
                "fullyImplemented": true,
                "id": 10045,
                "linearizedBaseContracts": [
                    10045,
                    10069
                ],
                "name": "ERC2771Recipient",
                "nameLocation": "524:16:45",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "constant": false,
                        "id": 9950,
                        "mutability": "mutable",
                        "name": "_trustedForwarder",
                        "nameLocation": "648:17:45",
                        "nodeType": "VariableDeclaration",
                        "scope": 10045,
                        "src": "632:33:45",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                        },
                        "typeName": {
                            "id": 9949,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "632:7:45",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                            }
                        },
                        "visibility": "private"
                    },
                    {
                        "body": {
                            "id": 9958,
                            "nodeType": "Block",
                            "src": "1096:41:45",
                            "statements": [
                                {
                                    "expression": {
                                        "id": 9956,
                                        "name": "_trustedForwarder",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 9950,
                                        "src": "1113:17:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "functionReturnParameters": 9955,
                                    "id": 9957,
                                    "nodeType": "Return",
                                    "src": "1106:24:45"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 9951,
                            "nodeType": "StructuredDocumentation",
                            "src": "672:341:45",
                            "text": " :warning: **Warning** :warning: The Forwarder can have a full control over your Recipient. Only trust verified Forwarder.\n @notice Method is not a required method to allow Recipients to trust multiple Forwarders. Not recommended yet.\n @return forwarder The address of the Forwarder contract that is being used."
                        },
                        "functionSelector": "ce1b815f",
                        "id": 9959,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "getTrustedForwarder",
                        "nameLocation": "1027:19:45",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 9952,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1046:2:45"
                        },
                        "returnParameters": {
                            "id": 9955,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 9954,
                                    "mutability": "mutable",
                                    "name": "forwarder",
                                    "nameLocation": "1086:9:45",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 9959,
                                    "src": "1078:17:45",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 9953,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1078:7:45",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1077:19:45"
                        },
                        "scope": 10045,
                        "src": "1018:119:45",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 9968,
                            "nodeType": "Block",
                            "src": "1202:47:45",
                            "statements": [
                                {
                                    "expression": {
                                        "id": 9966,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "id": 9964,
                                            "name": "_trustedForwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 9950,
                                            "src": "1212:17:45",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "id": 9965,
                                            "name": "_forwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 9961,
                                            "src": "1232:10:45",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "src": "1212:30:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "id": 9967,
                                    "nodeType": "ExpressionStatement",
                                    "src": "1212:30:45"
                                }
                            ]
                        },
                        "id": 9969,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_setTrustedForwarder",
                        "nameLocation": "1152:20:45",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 9962,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 9961,
                                    "mutability": "mutable",
                                    "name": "_forwarder",
                                    "nameLocation": "1181:10:45",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 9969,
                                    "src": "1173:18:45",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 9960,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1173:7:45",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1172:20:45"
                        },
                        "returnParameters": {
                            "id": 9963,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1202:0:45"
                        },
                        "scope": 10045,
                        "src": "1143:106:45",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "baseFunctions": [
                            10056
                        ],
                        "body": {
                            "id": 9982,
                            "nodeType": "Block",
                            "src": "1383:54:45",
                            "statements": [
                                {
                                    "expression": {
                                        "commonType": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        },
                                        "id": 9980,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                            "id": 9978,
                                            "name": "forwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 9972,
                                            "src": "1400:9:45",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "==",
                                        "rightExpression": {
                                            "id": 9979,
                                            "name": "_trustedForwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 9950,
                                            "src": "1413:17:45",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "src": "1400:30:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "functionReturnParameters": 9977,
                                    "id": 9981,
                                    "nodeType": "Return",
                                    "src": "1393:37:45"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 9970,
                            "nodeType": "StructuredDocumentation",
                            "src": "1255:33:45",
                            "text": "@inheritdoc IERC2771Recipient"
                        },
                        "functionSelector": "572b6c05",
                        "id": 9983,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "isTrustedForwarder",
                        "nameLocation": "1302:18:45",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 9974,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "1355:8:45"
                        },
                        "parameters": {
                            "id": 9973,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 9972,
                                    "mutability": "mutable",
                                    "name": "forwarder",
                                    "nameLocation": "1329:9:45",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 9983,
                                    "src": "1321:17:45",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 9971,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1321:7:45",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1320:19:45"
                        },
                        "returnParameters": {
                            "id": 9977,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 9976,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 9983,
                                    "src": "1377:4:45",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 9975,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1377:4:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1376:6:45"
                        },
                        "scope": 10045,
                        "src": "1293:144:45",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "public"
                    },
                    {
                        "baseFunctions": [
                            10062
                        ],
                        "body": {
                            "id": 10009,
                            "nodeType": "Block",
                            "src": "1556:472:45",
                            "statements": [
                                {
                                    "condition": {
                                        "commonType": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        },
                                        "id": 9999,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                            "commonType": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                            },
                                            "id": 9994,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                                "expression": {
                                                    "expression": {
                                                        "id": 9990,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "1570:3:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 9991,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "data",
                                                    "nodeType": "MemberAccess",
                                                    "src": "1570:8:45",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                    }
                                                },
                                                "id": 9992,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "length",
                                                "nodeType": "MemberAccess",
                                                "src": "1570:15:45",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": ">=",
                                            "rightExpression": {
                                                "hexValue": "3230",
                                                "id": 9993,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "number",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "1589:2:45",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_rational_20_by_1",
                                                    "typeString": "int_const 20"
                                                },
                                                "value": "20"
                                            },
                                            "src": "1570:21:45",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "&&",
                                        "rightExpression": {
                                            "arguments": [
                                                {
                                                    "expression": {
                                                        "id": 9996,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "1614:3:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 9997,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "sender",
                                                    "nodeType": "MemberAccess",
                                                    "src": "1614:10:45",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                ],
                                                "id": 9995,
                                                "name": "isTrustedForwarder",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [
                                                    9983
                                                ],
                                                "referencedDeclaration": 9983,
                                                "src": "1595:18:45",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                                    "typeString": "function (address) view returns (bool)"
                                                }
                                            },
                                            "id": 9998,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "1595:30:45",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "src": "1570:55:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "falseBody": {
                                        "id": 10007,
                                        "nodeType": "Block",
                                        "src": "1981:41:45",
                                        "statements": [
                                            {
                                                "expression": {
                                                    "id": 10005,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "leftHandSide": {
                                                        "id": 10002,
                                                        "name": "ret",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 9988,
                                                        "src": "1995:3:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    "nodeType": "Assignment",
                                                    "operator": "=",
                                                    "rightHandSide": {
                                                        "expression": {
                                                            "id": 10003,
                                                            "name": "msg",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967281,
                                                            "src": "2001:3:45",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_magic_message",
                                                                "typeString": "msg"
                                                            }
                                                        },
                                                        "id": 10004,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "sender",
                                                        "nodeType": "MemberAccess",
                                                        "src": "2001:10:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    "src": "1995:16:45",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "id": 10006,
                                                "nodeType": "ExpressionStatement",
                                                "src": "1995:16:45"
                                            }
                                        ]
                                    },
                                    "id": 10008,
                                    "nodeType": "IfStatement",
                                    "src": "1566:456:45",
                                    "trueBody": {
                                        "id": 10001,
                                        "nodeType": "Block",
                                        "src": "1627:348:45",
                                        "statements": [
                                            {
                                                "AST": {
                                                    "nodeType": "YulBlock",
                                                    "src": "1882:83:45",
                                                    "statements": [
                                                        {
                                                            "nodeType": "YulAssignment",
                                                            "src": "1900:51:45",
                                                            "value": {
                                                                "arguments": [
                                                                    {
                                                                        "kind": "number",
                                                                        "nodeType": "YulLiteral",
                                                                        "src": "1911:2:45",
                                                                        "type": "",
                                                                        "value": "96"
                                                                    },
                                                                    {
                                                                        "arguments": [
                                                                            {
                                                                                "arguments": [
                                                                                    {
                                                                                        "arguments": [],
                                                                                        "functionName": {
                                                                                            "name": "calldatasize",
                                                                                            "nodeType": "YulIdentifier",
                                                                                            "src": "1931:12:45"
                                                                                        },
                                                                                        "nodeType": "YulFunctionCall",
                                                                                        "src": "1931:14:45"
                                                                                    },
                                                                                    {
                                                                                        "kind": "number",
                                                                                        "nodeType": "YulLiteral",
                                                                                        "src": "1946:2:45",
                                                                                        "type": "",
                                                                                        "value": "20"
                                                                                    }
                                                                                ],
                                                                                "functionName": {
                                                                                    "name": "sub",
                                                                                    "nodeType": "YulIdentifier",
                                                                                    "src": "1927:3:45"
                                                                                },
                                                                                "nodeType": "YulFunctionCall",
                                                                                "src": "1927:22:45"
                                                                            }
                                                                        ],
                                                                        "functionName": {
                                                                            "name": "calldataload",
                                                                            "nodeType": "YulIdentifier",
                                                                            "src": "1914:12:45"
                                                                        },
                                                                        "nodeType": "YulFunctionCall",
                                                                        "src": "1914:36:45"
                                                                    }
                                                                ],
                                                                "functionName": {
                                                                    "name": "shr",
                                                                    "nodeType": "YulIdentifier",
                                                                    "src": "1907:3:45"
                                                                },
                                                                "nodeType": "YulFunctionCall",
                                                                "src": "1907:44:45"
                                                            },
                                                            "variableNames": [
                                                                {
                                                                    "name": "ret",
                                                                    "nodeType": "YulIdentifier",
                                                                    "src": "1900:3:45"
                                                                }
                                                            ]
                                                        }
                                                    ]
                                                },
                                                "evmVersion": "london",
                                                "externalReferences": [
                                                    {
                                                        "declaration": 9988,
                                                        "isOffset": false,
                                                        "isSlot": false,
                                                        "src": "1900:3:45",
                                                        "valueSize": 1
                                                    }
                                                ],
                                                "id": 10000,
                                                "nodeType": "InlineAssembly",
                                                "src": "1873:92:45"
                                            }
                                        ]
                                    }
                                }
                            ]
                        },
                        "documentation": {
                            "id": 9984,
                            "nodeType": "StructuredDocumentation",
                            "src": "1443:33:45",
                            "text": "@inheritdoc IERC2771Recipient"
                        },
                        "id": 10010,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_msgSender",
                        "nameLocation": "1490:10:45",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 9986,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "1512:8:45"
                        },
                        "parameters": {
                            "id": 9985,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1500:2:45"
                        },
                        "returnParameters": {
                            "id": 9989,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 9988,
                                    "mutability": "mutable",
                                    "name": "ret",
                                    "nameLocation": "1551:3:45",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 10010,
                                    "src": "1543:11:45",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 9987,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1543:7:45",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1542:13:45"
                        },
                        "scope": 10045,
                        "src": "1481:547:45",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "baseFunctions": [
                            10068
                        ],
                        "body": {
                            "id": 10043,
                            "nodeType": "Block",
                            "src": "2152:185:45",
                            "statements": [
                                {
                                    "condition": {
                                        "commonType": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        },
                                        "id": 10026,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                            "commonType": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                            },
                                            "id": 10021,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                                "expression": {
                                                    "expression": {
                                                        "id": 10017,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "2166:3:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 10018,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "data",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2166:8:45",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                    }
                                                },
                                                "id": 10019,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "length",
                                                "nodeType": "MemberAccess",
                                                "src": "2166:15:45",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": ">=",
                                            "rightExpression": {
                                                "hexValue": "3230",
                                                "id": 10020,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "number",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2185:2:45",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_rational_20_by_1",
                                                    "typeString": "int_const 20"
                                                },
                                                "value": "20"
                                            },
                                            "src": "2166:21:45",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "&&",
                                        "rightExpression": {
                                            "arguments": [
                                                {
                                                    "expression": {
                                                        "id": 10023,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "2210:3:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 10024,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "sender",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2210:10:45",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                ],
                                                "id": 10022,
                                                "name": "isTrustedForwarder",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [
                                                    9983
                                                ],
                                                "referencedDeclaration": 9983,
                                                "src": "2191:18:45",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                                    "typeString": "function (address) view returns (bool)"
                                                }
                                            },
                                            "id": 10025,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "2191:30:45",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "src": "2166:55:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "falseBody": {
                                        "id": 10041,
                                        "nodeType": "Block",
                                        "src": "2291:40:45",
                                        "statements": [
                                            {
                                                "expression": {
                                                    "expression": {
                                                        "id": 10038,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "2312:3:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 10039,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "data",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2312:8:45",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                    }
                                                },
                                                "functionReturnParameters": 10016,
                                                "id": 10040,
                                                "nodeType": "Return",
                                                "src": "2305:15:45"
                                            }
                                        ]
                                    },
                                    "id": 10042,
                                    "nodeType": "IfStatement",
                                    "src": "2162:169:45",
                                    "trueBody": {
                                        "id": 10037,
                                        "nodeType": "Block",
                                        "src": "2223:62:45",
                                        "statements": [
                                            {
                                                "expression": {
                                                    "baseExpression": {
                                                        "expression": {
                                                            "id": 10027,
                                                            "name": "msg",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967281,
                                                            "src": "2244:3:45",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_magic_message",
                                                                "typeString": "msg"
                                                            }
                                                        },
                                                        "id": 10028,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "data",
                                                        "nodeType": "MemberAccess",
                                                        "src": "2244:8:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes_calldata_ptr",
                                                            "typeString": "bytes calldata"
                                                        }
                                                    },
                                                    "endExpression": {
                                                        "commonType": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        },
                                                        "id": 10034,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "leftExpression": {
                                                            "expression": {
                                                                "expression": {
                                                                    "id": 10030,
                                                                    "name": "msg",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 4294967281,
                                                                    "src": "2255:3:45",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_magic_message",
                                                                        "typeString": "msg"
                                                                    }
                                                                },
                                                                "id": 10031,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "lValueRequested": false,
                                                                "memberName": "data",
                                                                "nodeType": "MemberAccess",
                                                                "src": "2255:8:45",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                                    "typeString": "bytes calldata"
                                                                }
                                                            },
                                                            "id": 10032,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "memberName": "length",
                                                            "nodeType": "MemberAccess",
                                                            "src": "2255:15:45",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                            }
                                                        },
                                                        "nodeType": "BinaryOperation",
                                                        "operator": "-",
                                                        "rightExpression": {
                                                            "hexValue": "3230",
                                                            "id": 10033,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "kind": "number",
                                                            "lValueRequested": false,
                                                            "nodeType": "Literal",
                                                            "src": "2271:2:45",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_rational_20_by_1",
                                                                "typeString": "int_const 20"
                                                            },
                                                            "value": "20"
                                                        },
                                                        "src": "2255:18:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    },
                                                    "id": 10035,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "nodeType": "IndexRangeAccess",
                                                    "src": "2244:30:45",
                                                    "startExpression": {
                                                        "hexValue": "30",
                                                        "id": 10029,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "kind": "number",
                                                        "lValueRequested": false,
                                                        "nodeType": "Literal",
                                                        "src": "2253:1:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_rational_0_by_1",
                                                            "typeString": "int_const 0"
                                                        },
                                                        "value": "0"
                                                    },
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_calldata_ptr_slice",
                                                        "typeString": "bytes calldata slice"
                                                    }
                                                },
                                                "functionReturnParameters": 10016,
                                                "id": 10036,
                                                "nodeType": "Return",
                                                "src": "2237:37:45"
                                            }
                                        ]
                                    }
                                }
                            ]
                        },
                        "documentation": {
                            "id": 10011,
                            "nodeType": "StructuredDocumentation",
                            "src": "2034:33:45",
                            "text": "@inheritdoc IERC2771Recipient"
                        },
                        "id": 10044,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_msgData",
                        "nameLocation": "2081:8:45",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 10013,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "2101:8:45"
                        },
                        "parameters": {
                            "id": 10012,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2089:2:45"
                        },
                        "returnParameters": {
                            "id": 10016,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 10015,
                                    "mutability": "mutable",
                                    "name": "ret",
                                    "nameLocation": "2147:3:45",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 10044,
                                    "src": "2132:18:45",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 10014,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2132:5:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2131:20:45"
                        },
                        "scope": 10045,
                        "src": "2072:265:45",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    }
                ],
                "scope": 10046,
                "src": "506:1833:45",
                "usedErrors": []
            }
        ],
        "src": "70:2270:45"
    },
    "legacyAST": {
        "absolutePath": "@opengsn/contracts/src/ERC2771Recipient.sol",
        "exportedSymbols": {
            "ERC2771Recipient": [
                10045
            ],
            "IERC2771Recipient": [
                10069
            ]
        },
        "id": 10046,
        "license": "MIT",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 9944,
                "literals": [
                    "solidity",
                    ">=",
                    "0.6",
                    ".9"
                ],
                "nodeType": "PragmaDirective",
                "src": "70:24:45"
            },
            {
                "absolutePath": "@opengsn/contracts/src/interfaces/IERC2771Recipient.sol",
                "file": "./interfaces/IERC2771Recipient.sol",
                "id": 9945,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 10046,
                "sourceUnit": 10070,
                "src": "96:44:45",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": true,
                "baseContracts": [
                    {
                        "baseName": {
                            "id": 9947,
                            "name": "IERC2771Recipient",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 10069,
                            "src": "544:17:45"
                        },
                        "id": 9948,
                        "nodeType": "InheritanceSpecifier",
                        "src": "544:17:45"
                    }
                ],
                "contractDependencies": [],
                "contractKind": "contract",
                "documentation": {
                    "id": 9946,
                    "nodeType": "StructuredDocumentation",
                    "src": "142:363:45",
                    "text": " @title The ERC-2771 Recipient Base Abstract Class - Implementation\n @notice Note that this contract was called `BaseRelayRecipient` in the previous revision of the GSN.\n @notice A base contract to be inherited by any contract that want to receive relayed transactions.\n @notice A subclass must use `_msgSender()` instead of `msg.sender`."
                },
                "fullyImplemented": true,
                "id": 10045,
                "linearizedBaseContracts": [
                    10045,
                    10069
                ],
                "name": "ERC2771Recipient",
                "nameLocation": "524:16:45",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "constant": false,
                        "id": 9950,
                        "mutability": "mutable",
                        "name": "_trustedForwarder",
                        "nameLocation": "648:17:45",
                        "nodeType": "VariableDeclaration",
                        "scope": 10045,
                        "src": "632:33:45",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                        },
                        "typeName": {
                            "id": 9949,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "632:7:45",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                            }
                        },
                        "visibility": "private"
                    },
                    {
                        "body": {
                            "id": 9958,
                            "nodeType": "Block",
                            "src": "1096:41:45",
                            "statements": [
                                {
                                    "expression": {
                                        "id": 9956,
                                        "name": "_trustedForwarder",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 9950,
                                        "src": "1113:17:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "functionReturnParameters": 9955,
                                    "id": 9957,
                                    "nodeType": "Return",
                                    "src": "1106:24:45"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 9951,
                            "nodeType": "StructuredDocumentation",
                            "src": "672:341:45",
                            "text": " :warning: **Warning** :warning: The Forwarder can have a full control over your Recipient. Only trust verified Forwarder.\n @notice Method is not a required method to allow Recipients to trust multiple Forwarders. Not recommended yet.\n @return forwarder The address of the Forwarder contract that is being used."
                        },
                        "functionSelector": "ce1b815f",
                        "id": 9959,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "getTrustedForwarder",
                        "nameLocation": "1027:19:45",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 9952,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1046:2:45"
                        },
                        "returnParameters": {
                            "id": 9955,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 9954,
                                    "mutability": "mutable",
                                    "name": "forwarder",
                                    "nameLocation": "1086:9:45",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 9959,
                                    "src": "1078:17:45",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 9953,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1078:7:45",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1077:19:45"
                        },
                        "scope": 10045,
                        "src": "1018:119:45",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 9968,
                            "nodeType": "Block",
                            "src": "1202:47:45",
                            "statements": [
                                {
                                    "expression": {
                                        "id": 9966,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "id": 9964,
                                            "name": "_trustedForwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 9950,
                                            "src": "1212:17:45",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "id": 9965,
                                            "name": "_forwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 9961,
                                            "src": "1232:10:45",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "src": "1212:30:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "id": 9967,
                                    "nodeType": "ExpressionStatement",
                                    "src": "1212:30:45"
                                }
                            ]
                        },
                        "id": 9969,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_setTrustedForwarder",
                        "nameLocation": "1152:20:45",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 9962,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 9961,
                                    "mutability": "mutable",
                                    "name": "_forwarder",
                                    "nameLocation": "1181:10:45",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 9969,
                                    "src": "1173:18:45",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 9960,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1173:7:45",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1172:20:45"
                        },
                        "returnParameters": {
                            "id": 9963,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1202:0:45"
                        },
                        "scope": 10045,
                        "src": "1143:106:45",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "internal"
                    },
                    {
                        "baseFunctions": [
                            10056
                        ],
                        "body": {
                            "id": 9982,
                            "nodeType": "Block",
                            "src": "1383:54:45",
                            "statements": [
                                {
                                    "expression": {
                                        "commonType": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        },
                                        "id": 9980,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                            "id": 9978,
                                            "name": "forwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 9972,
                                            "src": "1400:9:45",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "==",
                                        "rightExpression": {
                                            "id": 9979,
                                            "name": "_trustedForwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 9950,
                                            "src": "1413:17:45",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "src": "1400:30:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "functionReturnParameters": 9977,
                                    "id": 9981,
                                    "nodeType": "Return",
                                    "src": "1393:37:45"
                                }
                            ]
                        },
                        "documentation": {
                            "id": 9970,
                            "nodeType": "StructuredDocumentation",
                            "src": "1255:33:45",
                            "text": "@inheritdoc IERC2771Recipient"
                        },
                        "functionSelector": "572b6c05",
                        "id": 9983,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "isTrustedForwarder",
                        "nameLocation": "1302:18:45",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 9974,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "1355:8:45"
                        },
                        "parameters": {
                            "id": 9973,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 9972,
                                    "mutability": "mutable",
                                    "name": "forwarder",
                                    "nameLocation": "1329:9:45",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 9983,
                                    "src": "1321:17:45",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 9971,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1321:7:45",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1320:19:45"
                        },
                        "returnParameters": {
                            "id": 9977,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 9976,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 9983,
                                    "src": "1377:4:45",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 9975,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1377:4:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1376:6:45"
                        },
                        "scope": 10045,
                        "src": "1293:144:45",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "public"
                    },
                    {
                        "baseFunctions": [
                            10062
                        ],
                        "body": {
                            "id": 10009,
                            "nodeType": "Block",
                            "src": "1556:472:45",
                            "statements": [
                                {
                                    "condition": {
                                        "commonType": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        },
                                        "id": 9999,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                            "commonType": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                            },
                                            "id": 9994,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                                "expression": {
                                                    "expression": {
                                                        "id": 9990,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "1570:3:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 9991,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "data",
                                                    "nodeType": "MemberAccess",
                                                    "src": "1570:8:45",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                    }
                                                },
                                                "id": 9992,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "length",
                                                "nodeType": "MemberAccess",
                                                "src": "1570:15:45",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": ">=",
                                            "rightExpression": {
                                                "hexValue": "3230",
                                                "id": 9993,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "number",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "1589:2:45",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_rational_20_by_1",
                                                    "typeString": "int_const 20"
                                                },
                                                "value": "20"
                                            },
                                            "src": "1570:21:45",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "&&",
                                        "rightExpression": {
                                            "arguments": [
                                                {
                                                    "expression": {
                                                        "id": 9996,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "1614:3:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 9997,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "sender",
                                                    "nodeType": "MemberAccess",
                                                    "src": "1614:10:45",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                ],
                                                "id": 9995,
                                                "name": "isTrustedForwarder",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [
                                                    9983
                                                ],
                                                "referencedDeclaration": 9983,
                                                "src": "1595:18:45",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                                    "typeString": "function (address) view returns (bool)"
                                                }
                                            },
                                            "id": 9998,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "1595:30:45",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "src": "1570:55:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "falseBody": {
                                        "id": 10007,
                                        "nodeType": "Block",
                                        "src": "1981:41:45",
                                        "statements": [
                                            {
                                                "expression": {
                                                    "id": 10005,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "leftHandSide": {
                                                        "id": 10002,
                                                        "name": "ret",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 9988,
                                                        "src": "1995:3:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    "nodeType": "Assignment",
                                                    "operator": "=",
                                                    "rightHandSide": {
                                                        "expression": {
                                                            "id": 10003,
                                                            "name": "msg",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967281,
                                                            "src": "2001:3:45",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_magic_message",
                                                                "typeString": "msg"
                                                            }
                                                        },
                                                        "id": 10004,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "sender",
                                                        "nodeType": "MemberAccess",
                                                        "src": "2001:10:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_address",
                                                            "typeString": "address"
                                                        }
                                                    },
                                                    "src": "1995:16:45",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "id": 10006,
                                                "nodeType": "ExpressionStatement",
                                                "src": "1995:16:45"
                                            }
                                        ]
                                    },
                                    "id": 10008,
                                    "nodeType": "IfStatement",
                                    "src": "1566:456:45",
                                    "trueBody": {
                                        "id": 10001,
                                        "nodeType": "Block",
                                        "src": "1627:348:45",
                                        "statements": [
                                            {
                                                "AST": {
                                                    "nodeType": "YulBlock",
                                                    "src": "1882:83:45",
                                                    "statements": [
                                                        {
                                                            "nodeType": "YulAssignment",
                                                            "src": "1900:51:45",
                                                            "value": {
                                                                "arguments": [
                                                                    {
                                                                        "kind": "number",
                                                                        "nodeType": "YulLiteral",
                                                                        "src": "1911:2:45",
                                                                        "type": "",
                                                                        "value": "96"
                                                                    },
                                                                    {
                                                                        "arguments": [
                                                                            {
                                                                                "arguments": [
                                                                                    {
                                                                                        "arguments": [],
                                                                                        "functionName": {
                                                                                            "name": "calldatasize",
                                                                                            "nodeType": "YulIdentifier",
                                                                                            "src": "1931:12:45"
                                                                                        },
                                                                                        "nodeType": "YulFunctionCall",
                                                                                        "src": "1931:14:45"
                                                                                    },
                                                                                    {
                                                                                        "kind": "number",
                                                                                        "nodeType": "YulLiteral",
                                                                                        "src": "1946:2:45",
                                                                                        "type": "",
                                                                                        "value": "20"
                                                                                    }
                                                                                ],
                                                                                "functionName": {
                                                                                    "name": "sub",
                                                                                    "nodeType": "YulIdentifier",
                                                                                    "src": "1927:3:45"
                                                                                },
                                                                                "nodeType": "YulFunctionCall",
                                                                                "src": "1927:22:45"
                                                                            }
                                                                        ],
                                                                        "functionName": {
                                                                            "name": "calldataload",
                                                                            "nodeType": "YulIdentifier",
                                                                            "src": "1914:12:45"
                                                                        },
                                                                        "nodeType": "YulFunctionCall",
                                                                        "src": "1914:36:45"
                                                                    }
                                                                ],
                                                                "functionName": {
                                                                    "name": "shr",
                                                                    "nodeType": "YulIdentifier",
                                                                    "src": "1907:3:45"
                                                                },
                                                                "nodeType": "YulFunctionCall",
                                                                "src": "1907:44:45"
                                                            },
                                                            "variableNames": [
                                                                {
                                                                    "name": "ret",
                                                                    "nodeType": "YulIdentifier",
                                                                    "src": "1900:3:45"
                                                                }
                                                            ]
                                                        }
                                                    ]
                                                },
                                                "evmVersion": "london",
                                                "externalReferences": [
                                                    {
                                                        "declaration": 9988,
                                                        "isOffset": false,
                                                        "isSlot": false,
                                                        "src": "1900:3:45",
                                                        "valueSize": 1
                                                    }
                                                ],
                                                "id": 10000,
                                                "nodeType": "InlineAssembly",
                                                "src": "1873:92:45"
                                            }
                                        ]
                                    }
                                }
                            ]
                        },
                        "documentation": {
                            "id": 9984,
                            "nodeType": "StructuredDocumentation",
                            "src": "1443:33:45",
                            "text": "@inheritdoc IERC2771Recipient"
                        },
                        "id": 10010,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_msgSender",
                        "nameLocation": "1490:10:45",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 9986,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "1512:8:45"
                        },
                        "parameters": {
                            "id": 9985,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1500:2:45"
                        },
                        "returnParameters": {
                            "id": 9989,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 9988,
                                    "mutability": "mutable",
                                    "name": "ret",
                                    "nameLocation": "1551:3:45",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 10010,
                                    "src": "1543:11:45",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 9987,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1543:7:45",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1542:13:45"
                        },
                        "scope": 10045,
                        "src": "1481:547:45",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    },
                    {
                        "baseFunctions": [
                            10068
                        ],
                        "body": {
                            "id": 10043,
                            "nodeType": "Block",
                            "src": "2152:185:45",
                            "statements": [
                                {
                                    "condition": {
                                        "commonType": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        },
                                        "id": 10026,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                            "commonType": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                            },
                                            "id": 10021,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                                "expression": {
                                                    "expression": {
                                                        "id": 10017,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "2166:3:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 10018,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "data",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2166:8:45",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                    }
                                                },
                                                "id": 10019,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "length",
                                                "nodeType": "MemberAccess",
                                                "src": "2166:15:45",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": ">=",
                                            "rightExpression": {
                                                "hexValue": "3230",
                                                "id": 10020,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "number",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2185:2:45",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_rational_20_by_1",
                                                    "typeString": "int_const 20"
                                                },
                                                "value": "20"
                                            },
                                            "src": "2166:21:45",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "&&",
                                        "rightExpression": {
                                            "arguments": [
                                                {
                                                    "expression": {
                                                        "id": 10023,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "2210:3:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 10024,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "sender",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2210:10:45",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                ],
                                                "id": 10022,
                                                "name": "isTrustedForwarder",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [
                                                    9983
                                                ],
                                                "referencedDeclaration": 9983,
                                                "src": "2191:18:45",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                                    "typeString": "function (address) view returns (bool)"
                                                }
                                            },
                                            "id": 10025,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "2191:30:45",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "src": "2166:55:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "falseBody": {
                                        "id": 10041,
                                        "nodeType": "Block",
                                        "src": "2291:40:45",
                                        "statements": [
                                            {
                                                "expression": {
                                                    "expression": {
                                                        "id": 10038,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "2312:3:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 10039,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "data",
                                                    "nodeType": "MemberAccess",
                                                    "src": "2312:8:45",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                    }
                                                },
                                                "functionReturnParameters": 10016,
                                                "id": 10040,
                                                "nodeType": "Return",
                                                "src": "2305:15:45"
                                            }
                                        ]
                                    },
                                    "id": 10042,
                                    "nodeType": "IfStatement",
                                    "src": "2162:169:45",
                                    "trueBody": {
                                        "id": 10037,
                                        "nodeType": "Block",
                                        "src": "2223:62:45",
                                        "statements": [
                                            {
                                                "expression": {
                                                    "baseExpression": {
                                                        "expression": {
                                                            "id": 10027,
                                                            "name": "msg",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967281,
                                                            "src": "2244:3:45",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_magic_message",
                                                                "typeString": "msg"
                                                            }
                                                        },
                                                        "id": 10028,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "data",
                                                        "nodeType": "MemberAccess",
                                                        "src": "2244:8:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes_calldata_ptr",
                                                            "typeString": "bytes calldata"
                                                        }
                                                    },
                                                    "endExpression": {
                                                        "commonType": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        },
                                                        "id": 10034,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "leftExpression": {
                                                            "expression": {
                                                                "expression": {
                                                                    "id": 10030,
                                                                    "name": "msg",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 4294967281,
                                                                    "src": "2255:3:45",
                                                                    "typeDescriptions": {
                                                                        "typeIdentifier": "t_magic_message",
                                                                        "typeString": "msg"
                                                                    }
                                                                },
                                                                "id": 10031,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "lValueRequested": false,
                                                                "memberName": "data",
                                                                "nodeType": "MemberAccess",
                                                                "src": "2255:8:45",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                                    "typeString": "bytes calldata"
                                                                }
                                                            },
                                                            "id": 10032,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "memberName": "length",
                                                            "nodeType": "MemberAccess",
                                                            "src": "2255:15:45",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                            }
                                                        },
                                                        "nodeType": "BinaryOperation",
                                                        "operator": "-",
                                                        "rightExpression": {
                                                            "hexValue": "3230",
                                                            "id": 10033,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "kind": "number",
                                                            "lValueRequested": false,
                                                            "nodeType": "Literal",
                                                            "src": "2271:2:45",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_rational_20_by_1",
                                                                "typeString": "int_const 20"
                                                            },
                                                            "value": "20"
                                                        },
                                                        "src": "2255:18:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                        }
                                                    },
                                                    "id": 10035,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "nodeType": "IndexRangeAccess",
                                                    "src": "2244:30:45",
                                                    "startExpression": {
                                                        "hexValue": "30",
                                                        "id": 10029,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "kind": "number",
                                                        "lValueRequested": false,
                                                        "nodeType": "Literal",
                                                        "src": "2253:1:45",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_rational_0_by_1",
                                                            "typeString": "int_const 0"
                                                        },
                                                        "value": "0"
                                                    },
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_calldata_ptr_slice",
                                                        "typeString": "bytes calldata slice"
                                                    }
                                                },
                                                "functionReturnParameters": 10016,
                                                "id": 10036,
                                                "nodeType": "Return",
                                                "src": "2237:37:45"
                                            }
                                        ]
                                    }
                                }
                            ]
                        },
                        "documentation": {
                            "id": 10011,
                            "nodeType": "StructuredDocumentation",
                            "src": "2034:33:45",
                            "text": "@inheritdoc IERC2771Recipient"
                        },
                        "id": 10044,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_msgData",
                        "nameLocation": "2081:8:45",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 10013,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "2101:8:45"
                        },
                        "parameters": {
                            "id": 10012,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2089:2:45"
                        },
                        "returnParameters": {
                            "id": 10016,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 10015,
                                    "mutability": "mutable",
                                    "name": "ret",
                                    "nameLocation": "2147:3:45",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 10044,
                                    "src": "2132:18:45",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 10014,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2132:5:45",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2131:20:45"
                        },
                        "scope": 10045,
                        "src": "2072:265:45",
                        "stateMutability": "view",
                        "virtual": true,
                        "visibility": "internal"
                    }
                ],
                "scope": 10046,
                "src": "506:1833:45",
                "usedErrors": []
            }
        ],
        "src": "70:2270:45"
    },
    "compiler": {
        "name": "solc",
        "version": "0.8.7+commit.e28d00a7.Emscripten.clang"
    },
    "networks": {},
    "schemaVersion": "3.1.0",
    "updatedAt": "2023-03-16T16:54:15.128Z",
    "devdoc": {
        "kind": "dev",
        "methods": {
            "getTrustedForwarder()": {
                "returns": {
                    "forwarder": "The address of the Forwarder contract that is being used."
                }
            },
            "isTrustedForwarder(address)": {
                "params": {
                    "forwarder": "The address of the Forwarder contract that is being used."
                },
                "returns": {
                    "_0": "isTrustedForwarder `true` if the Forwarder is trusted to forward relayed transactions by this Recipient."
                }
            }
        },
        "title": "The ERC-2771 Recipient Base Abstract Class - Implementation",
        "version": 1
    },
    "userdoc": {
        "kind": "user",
        "methods": {
            "getTrustedForwarder()": {
                "notice": ":warning: **Warning** :warning: The Forwarder can have a full control over your Recipient. Only trust verified Forwarder.Method is not a required method to allow Recipients to trust multiple Forwarders. Not recommended yet."
            },
            "isTrustedForwarder(address)": {
                "notice": ":warning: **Warning** :warning: The Forwarder can have a full control over your Recipient. Only trust verified Forwarder."
            }
        },
        "notice": "Note that this contract was called `BaseRelayRecipient` in the previous revision of the GSN.A base contract to be inherited by any contract that want to receive relayed transactions.A subclass must use `_msgSender()` instead of `msg.sender`.",
        "version": 1
    }
}
