{
    "contractName": "TestForwarderTarget",
    "abi": [
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "forwarder",
                    "type": "address"
                }
            ],
            "stateMutability": "nonpayable",
            "type": "constructor"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": false,
                    "internalType": "string",
                    "name": "message",
                    "type": "string"
                }
            ],
            "name": "Reverting",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": false,
                    "internalType": "string",
                    "name": "message",
                    "type": "string"
                },
                {
                    "indexed": false,
                    "internalType": "bytes",
                    "name": "realMsgData",
                    "type": "bytes"
                },
                {
                    "indexed": false,
                    "internalType": "address",
                    "name": "realSender",
                    "type": "address"
                },
                {
                    "indexed": false,
                    "internalType": "address",
                    "name": "msgSender",
                    "type": "address"
                },
                {
                    "indexed": false,
                    "internalType": "address",
                    "name": "origin",
                    "type": "address"
                }
            ],
            "name": "TestForwarderMessage",
            "type": "event"
        },
        {
            "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"
        },
        {
            "stateMutability": "payable",
            "type": "receive"
        },
        {
            "inputs": [
                {
                    "internalType": "string",
                    "name": "message",
                    "type": "string"
                }
            ],
            "name": "emitMessage",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "publicMsgSender",
            "outputs": [
                {
                    "internalType": "address",
                    "name": "",
                    "type": "address"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "publicMsgData",
            "outputs": [
                {
                    "internalType": "bytes",
                    "name": "",
                    "type": "bytes"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "uint256",
                    "name": "value",
                    "type": "uint256"
                }
            ],
            "name": "mustReceiveEth",
            "outputs": [],
            "stateMutability": "payable",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "testRevert",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        }
    ],
    "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"Reverting\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"realMsgData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"realSender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"msgSender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"origin\",\"type\":\"address\"}],\"name\":\"TestForwarderMessage\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"emitMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"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\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"mustReceiveEth\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"publicMsgData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"publicMsgSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"testRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"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.\"}}},\"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.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/alexf/gsn2/packages/contracts/solpp/forwarder/test/TestForwarderTarget.sol\":\"TestForwarderTarget\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/alexf/gsn2/packages/contracts/solpp/ERC2771Recipient.sol\":{\"keccak256\":\"0x59c3b1808d8e9cdfe652be6e4855e399536b7431d9b2725f8a7ba7ff5cd1d9cf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1505389e12708d3de0252d9da1bc9c7fc03f39273bdfb0deb667adb23082e6b\",\"dweb:/ipfs/QmXdWyNCnef8jjELUed3SZEZoUKHVT6yzVr9wqi6fZ2X1E\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/forwarder/test/TestForwarderTarget.sol\":{\"keccak256\":\"0x130ae16b86b4a64c16de569a8ea895cda21ad453d5d7f7b950387228e35c0d8d\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://e62f2bdfc79ec1025c1e20328591fb7d9ed431a0139f9ac42c9b766cb2a71f12\",\"dweb:/ipfs/QmfTKckcfRT39r8Wu2XTpNbwchStAzLoo85QSXZL8PvTPA\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/interfaces/IERC2771Recipient.sol\":{\"keccak256\":\"0x92a3665ec2fc3d2ab78cf8a08451b2ab6466dc7fae3c215150be2132500406fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://364eee344363535733b4cc1a7748e1fc8b10786f6df6c0e2bc0082bcb2477e0e\",\"dweb:/ipfs/QmfCwWAxFqU4woSqu3g5BFPASEA7eCSwcwUSHM9EoYhYdu\"]}},\"version\":1}",
    "bytecode": "0x608060405234801561001057600080fd5b5060405161068238038061068283398101604081905261002f91610050565b600080546001600160a01b0319166001600160a01b03831617905550610080565b60006020828403121561006257600080fd5b81516001600160a01b038116811461007957600080fd5b9392505050565b6105f38061008f6000396000f3fe6080604052600436106100745760003560e01c8063a26388bb1161004e578063a26388bb146100f9578063b6ffacf71461010e578063bf9587261461013b578063ce1b815f1461015d57600080fd5b80632ac0df2614610080578063572b6c05146100a25780637a27578d146100e657600080fd5b3661007b57005b600080fd5b34801561008c57600080fd5b506100a061009b3660046103c4565b61017b565b005b3480156100ae57600080fd5b506100d16100bd366004610394565b6000546001600160a01b0391821691161490565b60405190151581526020015b60405180910390f35b6100a06100f4366004610475565b6101cc565b34801561010557600080fd5b506100a061021a565b34801561011a57600080fd5b506101236102bd565b6040516001600160a01b0390911681526020016100dd565b34801561014757600080fd5b506101506102cc565b6040516100dd91906104db565b34801561016957600080fd5b506000546001600160a01b0316610123565b7f855af3b0567c81711540539ad042ef5a2a20d47d9d86ababf362a8e47058b5ef816101a5610310565b6101ad610360565b33326040516101c1969594939291906104ee565b60405180910390a150565b8034146102175760405162461bcd60e51b81526020600482015260146024820152736469646e277420726563656976652076616c756560601b60448201526064015b60405180910390fd5b50565b30156102565760405162461bcd60e51b815260206004820152600b60248201526a185b1dd85e5cc819985a5b60aa1b604482015260640161020e565b7f3f110cf99894407239c5fa1bf0523ea12b54ef6eb3e88be600b6a7f0ff76eb0e6040516102b3906020808252818101527f696620796f7520736565207468697320726576657274206661696c65642e2e2e604082015260600190565b60405180910390a1565b60006102c7610360565b905090565b60606102d6610310565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092949350505050565b3660006014821080159061032e57506000546001600160a01b031633145b156103575760008036610342601482610582565b9261034f93929190610558565b915091509091565b50600091369150565b60006014361080159061037d57506000546001600160a01b031633145b1561038f575060131936013560601c90565b503390565b6000602082840312156103a657600080fd5b81356001600160a01b03811681146103bd57600080fd5b9392505050565b6000602082840312156103d657600080fd5b813567ffffffffffffffff808211156103ee57600080fd5b818401915084601f83011261040257600080fd5b813581811115610414576104146105a7565b604051601f8201601f19908116603f0116810190838211818310171561043c5761043c6105a7565b8160405282815287602084870101111561045557600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561048757600080fd5b5035919050565b6000815180845260005b818110156104b457602081850181015186830182015201610498565b818111156104c6576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006103bd602083018461048e565b60a08152600061050160a083018961048e565b828103602084015286815286886020830137600060208883018101919091526001600160a01b039687166040850152948616606084015292909416608090910152601f909301601f19169092019091019392505050565b6000808585111561056857600080fd5b8386111561057557600080fd5b5050820193919092039150565b6000828210156105a257634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052604160045260246000fdfea26469706673582212208fba60283626e3290d4cdbcb47e80d069031b5162fc1be49f8a7785d6fe3fe0f64736f6c63430008070033",
    "deployedBytecode": "0x6080604052600436106100745760003560e01c8063a26388bb1161004e578063a26388bb146100f9578063b6ffacf71461010e578063bf9587261461013b578063ce1b815f1461015d57600080fd5b80632ac0df2614610080578063572b6c05146100a25780637a27578d146100e657600080fd5b3661007b57005b600080fd5b34801561008c57600080fd5b506100a061009b3660046103c4565b61017b565b005b3480156100ae57600080fd5b506100d16100bd366004610394565b6000546001600160a01b0391821691161490565b60405190151581526020015b60405180910390f35b6100a06100f4366004610475565b6101cc565b34801561010557600080fd5b506100a061021a565b34801561011a57600080fd5b506101236102bd565b6040516001600160a01b0390911681526020016100dd565b34801561014757600080fd5b506101506102cc565b6040516100dd91906104db565b34801561016957600080fd5b506000546001600160a01b0316610123565b7f855af3b0567c81711540539ad042ef5a2a20d47d9d86ababf362a8e47058b5ef816101a5610310565b6101ad610360565b33326040516101c1969594939291906104ee565b60405180910390a150565b8034146102175760405162461bcd60e51b81526020600482015260146024820152736469646e277420726563656976652076616c756560601b60448201526064015b60405180910390fd5b50565b30156102565760405162461bcd60e51b815260206004820152600b60248201526a185b1dd85e5cc819985a5b60aa1b604482015260640161020e565b7f3f110cf99894407239c5fa1bf0523ea12b54ef6eb3e88be600b6a7f0ff76eb0e6040516102b3906020808252818101527f696620796f7520736565207468697320726576657274206661696c65642e2e2e604082015260600190565b60405180910390a1565b60006102c7610360565b905090565b60606102d6610310565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092949350505050565b3660006014821080159061032e57506000546001600160a01b031633145b156103575760008036610342601482610582565b9261034f93929190610558565b915091509091565b50600091369150565b60006014361080159061037d57506000546001600160a01b031633145b1561038f575060131936013560601c90565b503390565b6000602082840312156103a657600080fd5b81356001600160a01b03811681146103bd57600080fd5b9392505050565b6000602082840312156103d657600080fd5b813567ffffffffffffffff808211156103ee57600080fd5b818401915084601f83011261040257600080fd5b813581811115610414576104146105a7565b604051601f8201601f19908116603f0116810190838211818310171561043c5761043c6105a7565b8160405282815287602084870101111561045557600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561048757600080fd5b5035919050565b6000815180845260005b818110156104b457602081850181015186830182015201610498565b818111156104c6576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006103bd602083018461048e565b60a08152600061050160a083018961048e565b828103602084015286815286886020830137600060208883018101919091526001600160a01b039687166040850152948616606084015292909416608090910152601f909301601f19169092019091019392505050565b6000808585111561056857600080fd5b8386111561057557600080fd5b5050820193919092039150565b6000828210156105a257634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052604160045260246000fdfea26469706673582212208fba60283626e3290d4cdbcb47e80d069031b5162fc1be49f8a7785d6fe3fe0f64736f6c63430008070033",
    "immutableReferences": {},
    "sourceMap": "105:1084:11:-:0;;;161:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1213:17:1;:30;;-1:-1:-1;;;;;;1213:30:1;-1:-1:-1;;;;;1213:30:1;;;;;161:79:11;105:1084;;14:290:63;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:63;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:63:o;:::-;105:1084:11;;;;;;",
    "deployedSourceMap": "105:1084:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;453:205;;;;;;;;;;-1:-1:-1;453:205:11;;;;;:::i;:::-;;:::i;:::-;;1294:144:1;;;;;;;;;;-1:-1:-1;1294:144:1;;;;;:::i;:::-;1378:4;1414:17;-1:-1:-1;;;;;1401:30:1;;;1414:17;;1401:30;;1294:144;;;;2266:14:63;;2259:22;2241:41;;2229:2;2214:18;1294:144:1;;;;;;;;863:123:11;;;;;;:::i;:::-;;:::i;1030:157::-;;;;;;;;;;;;;:::i;664:93::-;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;2057:32:63;;;2039:51;;2027:2;2012:18;664:93:11;1893:203:63;763:94:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1019:119:1:-;;;;;;;;;;-1:-1:-1;1079:17:1;1114;-1:-1:-1;;;;;1114:17:1;1019:119;;453:205:11;573:78;594:7;603:10;:8;:10::i;:::-;615:12;:10;:12::i;:::-;629:10;641:9;573:78;;;;;;;;;;;:::i;:::-;;;;;;;;453:205;:::o;863:123::-;949:5;936:9;:18;927:52;;;;-1:-1:-1;;;927:52:11;;4245:2:63;927:52:11;;;4227:21:63;4284:2;4264:18;;;4257:30;-1:-1:-1;;;4303:18:63;;;4296:50;4363:18;;927:52:11;;;;;;;;;863:123;:::o;1030:157::-;1085:4;1077:27;1069:51;;;;-1:-1:-1;;;1069:51:11;;3905:2:63;1069:51:11;;;3887:21:63;3944:2;3924:18;;;3917:30;-1:-1:-1;;;3963:18:63;;;3956:41;4014:18;;1069:51:11;3703:335:63;1069:51:11;1135:45;;;;;3544:2:63;3526:21;;;3563:18;;;3556:30;3622:34;3617:2;3602:18;;3595:62;3689:2;3674:18;;3342:356;1135:45:11;;;;;;;;1030:157::o;664:93::-;712:7;738:12;:10;:12::i;:::-;731:19;;664:93;:::o;763:94::-;809:12;840:10;:8;:10::i;:::-;833:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;833:17:11;;763:94;-1:-1:-1;;;;763:94:11:o;2073:265:1:-;2133:18;;2186:2;2167:21;;;;;:55;;-1:-1:-1;1378:4:1;1414:17;-1:-1:-1;;;;;1414:17:1;2211:10;1401:30;2192;2163:169;;;2245:8;;;2256:18;2272:2;2245:8;2256:18;:::i;:::-;2245:30;;;;;;;:::i;:::-;2238:37;;;;2073:265;;:::o;2163:169::-;-1:-1:-1;2313:8:1;;;;-1:-1:-1;2073:265:1:o;1482:547::-;1544:11;1590:2;1571:8;:21;;;;:55;;-1:-1:-1;1378:4:1;1414:17;-1:-1:-1;;;;;1414:17:1;1615:10;1401:30;1596;1567:456;;;-1:-1:-1;;;1932:14:1;1928:22;1915:36;1912:2;1908:44;1482:547;:::o;1567:456::-;-1:-1:-1;2002:10:1;1482:547;:::o;14:286:63:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;168:23;;-1:-1:-1;;;;;220:31:63;;210:42;;200:70;;266:1;263;256:12;200:70;289:5;14:286;-1:-1:-1;;;14:286:63:o;305:922::-;374:6;427:2;415:9;406:7;402:23;398:32;395:52;;;443:1;440;433:12;395:52;483:9;470:23;512:18;553:2;545:6;542:14;539:34;;;569:1;566;559:12;539:34;607:6;596:9;592:22;582:32;;652:7;645:4;641:2;637:13;633:27;623:55;;674:1;671;664:12;623:55;710:2;697:16;732:2;728;725:10;722:36;;;738:18;;:::i;:::-;813:2;807:9;781:2;867:13;;-1:-1:-1;;863:22:63;;;887:2;859:31;855:40;843:53;;;911:18;;;931:22;;;908:46;905:72;;;957:18;;:::i;:::-;997:10;993:2;986:22;1032:2;1024:6;1017:18;1072:7;1067:2;1062;1058;1054:11;1050:20;1047:33;1044:53;;;1093:1;1090;1083:12;1044:53;1149:2;1144;1140;1136:11;1131:2;1123:6;1119:15;1106:46;1194:1;1172:15;;;1189:2;1168:24;1161:35;;;;-1:-1:-1;1176:6:63;305:922;-1:-1:-1;;;;;305:922:63:o;1232:180::-;1291:6;1344:2;1332:9;1323:7;1319:23;1315:32;1312:52;;;1360:1;1357;1350:12;1312:52;-1:-1:-1;1383:23:63;;1232:180;-1:-1:-1;1232:180:63:o;1417:471::-;1458:3;1496:5;1490:12;1523:6;1518:3;1511:19;1548:1;1558:162;1572:6;1569:1;1566:13;1558:162;;;1634:4;1690:13;;;1686:22;;1680:29;1662:11;;;1658:20;;1651:59;1587:12;1558:162;;;1738:6;1735:1;1732:13;1729:87;;;1804:1;1797:4;1788:6;1783:3;1779:16;1775:27;1768:38;1729:87;-1:-1:-1;1870:2:63;1849:15;-1:-1:-1;;1845:29:63;1836:39;;;;1877:4;1832:50;;1417:471;-1:-1:-1;;1417:471:63:o;2293:217::-;2440:2;2429:9;2422:21;2403:4;2460:44;2500:2;2489:9;2485:18;2477:6;2460:44;:::i;2515:822::-;2804:3;2793:9;2786:22;2767:4;2831:45;2871:3;2860:9;2856:19;2848:6;2831:45;:::i;:::-;2924:9;2916:6;2912:22;2907:2;2896:9;2892:18;2885:50;2959:6;2951;2944:22;3013:6;3005;3000:2;2992:6;2988:15;2975:45;3066:1;3061:2;3040:19;;;3036:28;;3029:39;;;;-1:-1:-1;;;;;3210:15:63;;;3205:2;3190:18;;3183:43;3262:15;;;3257:2;3242:18;;3235:43;3315:15;;;;3309:3;3294:19;;;3287:44;3126:2;3105:15;;;-1:-1:-1;;3101:29:63;3089:42;;;3085:51;;;;;-1:-1:-1;;;2515:822:63:o;4392:331::-;4497:9;4508;4550:8;4538:10;4535:24;4532:44;;;4572:1;4569;4562:12;4532:44;4601:6;4591:8;4588:20;4585:40;;;4621:1;4618;4611:12;4585:40;-1:-1:-1;;4647:23:63;;;4692:25;;;;;-1:-1:-1;4392:331:63:o;4728:222::-;4768:4;4796:1;4793;4790:8;4787:131;;;4840:10;4835:3;4831:20;4828:1;4821:31;4875:4;4872:1;4865:15;4903:4;4900:1;4893:15;4787:131;-1:-1:-1;4935:9:63;;4728:222::o;4955:127::-;5016:10;5011:3;5007:20;5004:1;4997:31;5047:4;5044:1;5037:15;5071:4;5068:1;5061:15",
    "source": "pragma solidity ^0.8.0;\n\n// SPDX-License-Identifier: GPL-3.0-only\n\nimport \"../../ERC2771Recipient.sol\";\n\ncontract TestForwarderTarget is ERC2771Recipient {\n\n    constructor(address forwarder) {\n        _setTrustedForwarder(forwarder);\n    }\n\n    // solhint-disable-next-line no-empty-blocks\n    receive() external payable {}\n\n    event TestForwarderMessage(string message, bytes realMsgData, address realSender, address msgSender, address origin);\n\n    function emitMessage(string memory message) public {\n\n        // solhint-disable-next-line avoid-tx-origin\n        emit TestForwarderMessage(message, _msgData(), _msgSender(), msg.sender, tx.origin);\n    }\n\n    function publicMsgSender() public view returns (address) {\n        return _msgSender();\n    }\n\n    function publicMsgData() public view returns (bytes memory) {\n        return _msgData();\n    }\n\n    function mustReceiveEth(uint256 value) public payable {\n        require( msg.value == value, \"didn't receive value\");\n    }\n\n    event Reverting(string message);\n\n    function testRevert() public {\n        require(address(this) == address(0), \"always fail\");\n        emit Reverting(\"if you see this revert failed...\");\n    }\n}",
    "sourcePath": "/Users/alexf/gsn2/packages/contracts/solpp/forwarder/test/TestForwarderTarget.sol",
    "ast": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/forwarder/test/TestForwarderTarget.sol",
        "exportedSymbols": {
            "ERC2771Recipient": [
                500
            ],
            "IERC2771Recipient": [
                5374
            ],
            "TestForwarderTarget": [
                5332
            ]
        },
        "id": 5333,
        "license": "GPL-3.0-only",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 5227,
                "literals": [
                    "solidity",
                    "^",
                    "0.8",
                    ".0"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:23:11"
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/ERC2771Recipient.sol",
                "file": "../../ERC2771Recipient.sol",
                "id": 5228,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 5333,
                "sourceUnit": 501,
                "src": "67:36:11",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": false,
                "baseContracts": [
                    {
                        "baseName": {
                            "id": 5229,
                            "name": "ERC2771Recipient",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 500,
                            "src": "137:16:11"
                        },
                        "id": 5230,
                        "nodeType": "InheritanceSpecifier",
                        "src": "137:16:11"
                    }
                ],
                "contractDependencies": [],
                "contractKind": "contract",
                "fullyImplemented": true,
                "id": 5332,
                "linearizedBaseContracts": [
                    5332,
                    500,
                    5374
                ],
                "name": "TestForwarderTarget",
                "nameLocation": "114:19:11",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "body": {
                            "id": 5239,
                            "nodeType": "Block",
                            "src": "192:48:11",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 5236,
                                                "name": "forwarder",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 5232,
                                                "src": "223:9:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            ],
                                            "id": 5235,
                                            "name": "_setTrustedForwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 424,
                                            "src": "202:20:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                                                "typeString": "function (address)"
                                            }
                                        },
                                        "id": 5237,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "202:31:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 5238,
                                    "nodeType": "ExpressionStatement",
                                    "src": "202:31:11"
                                }
                            ]
                        },
                        "id": 5240,
                        "implemented": true,
                        "kind": "constructor",
                        "modifiers": [],
                        "name": "",
                        "nameLocation": "-1:-1:-1",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5233,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5232,
                                    "mutability": "mutable",
                                    "name": "forwarder",
                                    "nameLocation": "181:9:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5240,
                                    "src": "173:17:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 5231,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "173:7:11",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "172:19:11"
                        },
                        "returnParameters": {
                            "id": 5234,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "192:0:11"
                        },
                        "scope": 5332,
                        "src": "161:79:11",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 5243,
                            "nodeType": "Block",
                            "src": "322:2:11",
                            "statements": []
                        },
                        "id": 5244,
                        "implemented": true,
                        "kind": "receive",
                        "modifiers": [],
                        "name": "",
                        "nameLocation": "-1:-1:-1",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5241,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "302:2:11"
                        },
                        "returnParameters": {
                            "id": 5242,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "322:0:11"
                        },
                        "scope": 5332,
                        "src": "295:29:11",
                        "stateMutability": "payable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "anonymous": false,
                        "id": 5256,
                        "name": "TestForwarderMessage",
                        "nameLocation": "336:20:11",
                        "nodeType": "EventDefinition",
                        "parameters": {
                            "id": 5255,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5246,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "message",
                                    "nameLocation": "364:7:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5256,
                                    "src": "357:14:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5245,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "357:6:11",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5248,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "realMsgData",
                                    "nameLocation": "379:11:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5256,
                                    "src": "373:17:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5247,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "373:5:11",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5250,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "realSender",
                                    "nameLocation": "400:10:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5256,
                                    "src": "392:18:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 5249,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "392:7:11",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5252,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "msgSender",
                                    "nameLocation": "420:9:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5256,
                                    "src": "412:17:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 5251,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "412:7:11",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5254,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "origin",
                                    "nameLocation": "439:6:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5256,
                                    "src": "431:14:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 5253,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "431:7:11",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "356:90:11"
                        },
                        "src": "330:117:11"
                    },
                    {
                        "body": {
                            "id": 5273,
                            "nodeType": "Block",
                            "src": "504:154:11",
                            "statements": [
                                {
                                    "eventCall": {
                                        "arguments": [
                                            {
                                                "id": 5262,
                                                "name": "message",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 5258,
                                                "src": "594:7:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                }
                                            },
                                            {
                                                "arguments": [],
                                                "expression": {
                                                    "argumentTypes": [],
                                                    "id": 5263,
                                                    "name": "_msgData",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [
                                                        499
                                                    ],
                                                    "referencedDeclaration": 499,
                                                    "src": "603:8:11",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$",
                                                        "typeString": "function () view returns (bytes calldata)"
                                                    }
                                                },
                                                "id": 5264,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "603:10:11",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            },
                                            {
                                                "arguments": [],
                                                "expression": {
                                                    "argumentTypes": [],
                                                    "id": 5265,
                                                    "name": "_msgSender",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [
                                                        465
                                                    ],
                                                    "referencedDeclaration": 465,
                                                    "src": "615:10:11",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                                        "typeString": "function () view returns (address)"
                                                    }
                                                },
                                                "id": 5266,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "615:12:11",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            },
                                            {
                                                "expression": {
                                                    "id": 5267,
                                                    "name": "msg",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 4294967281,
                                                    "src": "629:3:11",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_magic_message",
                                                        "typeString": "msg"
                                                    }
                                                },
                                                "id": 5268,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "sender",
                                                "nodeType": "MemberAccess",
                                                "src": "629:10:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            },
                                            {
                                                "expression": {
                                                    "id": 5269,
                                                    "name": "tx",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 4294967270,
                                                    "src": "641:2:11",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_magic_transaction",
                                                        "typeString": "tx"
                                                    }
                                                },
                                                "id": 5270,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "origin",
                                                "nodeType": "MemberAccess",
                                                "src": "641:9:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            ],
                                            "id": 5261,
                                            "name": "TestForwarderMessage",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 5256,
                                            "src": "573:20:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_event_nonpayable$_t_string_memory_ptr_$_t_bytes_memory_ptr_$_t_address_$_t_address_$_t_address_$returns$__$",
                                                "typeString": "function (string memory,bytes memory,address,address,address)"
                                            }
                                        },
                                        "id": 5271,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "573:78:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 5272,
                                    "nodeType": "EmitStatement",
                                    "src": "568:83:11"
                                }
                            ]
                        },
                        "functionSelector": "2ac0df26",
                        "id": 5274,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "emitMessage",
                        "nameLocation": "462:11:11",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5259,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5258,
                                    "mutability": "mutable",
                                    "name": "message",
                                    "nameLocation": "488:7:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5274,
                                    "src": "474:21:11",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5257,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "474:6:11",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "473:23:11"
                        },
                        "returnParameters": {
                            "id": 5260,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "504:0:11"
                        },
                        "scope": 5332,
                        "src": "453:205:11",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 5282,
                            "nodeType": "Block",
                            "src": "721:36:11",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [],
                                        "expression": {
                                            "argumentTypes": [],
                                            "id": 5279,
                                            "name": "_msgSender",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                465
                                            ],
                                            "referencedDeclaration": 465,
                                            "src": "738:10:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                                "typeString": "function () view returns (address)"
                                            }
                                        },
                                        "id": 5280,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "738:12:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "functionReturnParameters": 5278,
                                    "id": 5281,
                                    "nodeType": "Return",
                                    "src": "731:19:11"
                                }
                            ]
                        },
                        "functionSelector": "b6ffacf7",
                        "id": 5283,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "publicMsgSender",
                        "nameLocation": "673:15:11",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5275,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "688:2:11"
                        },
                        "returnParameters": {
                            "id": 5278,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5277,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5283,
                                    "src": "712:7:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 5276,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "712:7:11",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "711:9:11"
                        },
                        "scope": 5332,
                        "src": "664:93:11",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 5291,
                            "nodeType": "Block",
                            "src": "823:34:11",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [],
                                        "expression": {
                                            "argumentTypes": [],
                                            "id": 5288,
                                            "name": "_msgData",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                499
                                            ],
                                            "referencedDeclaration": 499,
                                            "src": "840:8:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$",
                                                "typeString": "function () view returns (bytes calldata)"
                                            }
                                        },
                                        "id": 5289,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "840:10:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_calldata_ptr",
                                            "typeString": "bytes calldata"
                                        }
                                    },
                                    "functionReturnParameters": 5287,
                                    "id": 5290,
                                    "nodeType": "Return",
                                    "src": "833:17:11"
                                }
                            ]
                        },
                        "functionSelector": "bf958726",
                        "id": 5292,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "publicMsgData",
                        "nameLocation": "772:13:11",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5284,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "785:2:11"
                        },
                        "returnParameters": {
                            "id": 5287,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5286,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5292,
                                    "src": "809:12:11",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5285,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "809:5:11",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "808:14:11"
                        },
                        "scope": 5332,
                        "src": "763:94:11",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 5305,
                            "nodeType": "Block",
                            "src": "917:69:11",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                "id": 5301,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "expression": {
                                                        "id": 5298,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "936:3:11",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 5299,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "value",
                                                    "nodeType": "MemberAccess",
                                                    "src": "936:9:11",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "id": 5300,
                                                    "name": "value",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 5294,
                                                    "src": "949:5:11",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                },
                                                "src": "936:18:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "6469646e277420726563656976652076616c7565",
                                                "id": 5302,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "956:22:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_e83c6601a0158dbf43c48c4174f8e801815194c1d1f7c7519fe3f4b591e92ad9",
                                                    "typeString": "literal_string \"didn't receive value\""
                                                },
                                                "value": "didn't receive value"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_e83c6601a0158dbf43c48c4174f8e801815194c1d1f7c7519fe3f4b591e92ad9",
                                                    "typeString": "literal_string \"didn't receive value\""
                                                }
                                            ],
                                            "id": 5297,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "927:7:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 5303,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "927:52:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 5304,
                                    "nodeType": "ExpressionStatement",
                                    "src": "927:52:11"
                                }
                            ]
                        },
                        "functionSelector": "7a27578d",
                        "id": 5306,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "mustReceiveEth",
                        "nameLocation": "872:14:11",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5295,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5294,
                                    "mutability": "mutable",
                                    "name": "value",
                                    "nameLocation": "895:5:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5306,
                                    "src": "887:13:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 5293,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "887:7:11",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "886:15:11"
                        },
                        "returnParameters": {
                            "id": 5296,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "917:0:11"
                        },
                        "scope": 5332,
                        "src": "863:123:11",
                        "stateMutability": "payable",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "anonymous": false,
                        "id": 5310,
                        "name": "Reverting",
                        "nameLocation": "998:9:11",
                        "nodeType": "EventDefinition",
                        "parameters": {
                            "id": 5309,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5308,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "message",
                                    "nameLocation": "1015:7:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5310,
                                    "src": "1008:14:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5307,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1008:6:11",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1007:16:11"
                        },
                        "src": "992:32:11"
                    },
                    {
                        "body": {
                            "id": 5330,
                            "nodeType": "Block",
                            "src": "1059:128:11",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                "id": 5322,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "arguments": [
                                                        {
                                                            "id": 5316,
                                                            "name": "this",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967268,
                                                            "src": "1085:4:11",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_contract$_TestForwarderTarget_$5332",
                                                                "typeString": "contract TestForwarderTarget"
                                                            }
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_contract$_TestForwarderTarget_$5332",
                                                                "typeString": "contract TestForwarderTarget"
                                                            }
                                                        ],
                                                        "id": 5315,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "ElementaryTypeNameExpression",
                                                        "src": "1077:7:11",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_address_$",
                                                            "typeString": "type(address)"
                                                        },
                                                        "typeName": {
                                                            "id": 5314,
                                                            "name": "address",
                                                            "nodeType": "ElementaryTypeName",
                                                            "src": "1077:7:11",
                                                            "typeDescriptions": {}
                                                        }
                                                    },
                                                    "id": 5317,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "typeConversion",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "1077:13:11",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "arguments": [
                                                        {
                                                            "hexValue": "30",
                                                            "id": 5320,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "kind": "number",
                                                            "lValueRequested": false,
                                                            "nodeType": "Literal",
                                                            "src": "1102:1:11",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_rational_0_by_1",
                                                                "typeString": "int_const 0"
                                                            },
                                                            "value": "0"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_rational_0_by_1",
                                                                "typeString": "int_const 0"
                                                            }
                                                        ],
                                                        "id": 5319,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "ElementaryTypeNameExpression",
                                                        "src": "1094:7:11",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_address_$",
                                                            "typeString": "type(address)"
                                                        },
                                                        "typeName": {
                                                            "id": 5318,
                                                            "name": "address",
                                                            "nodeType": "ElementaryTypeName",
                                                            "src": "1094:7:11",
                                                            "typeDescriptions": {}
                                                        }
                                                    },
                                                    "id": 5321,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "typeConversion",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "1094:10:11",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "src": "1077:27:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "616c77617973206661696c",
                                                "id": 5323,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "1106:13:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_bee1cf1f7d056e0353bed67574c7940047b661dff255a2207ffca4827603a4b3",
                                                    "typeString": "literal_string \"always fail\""
                                                },
                                                "value": "always fail"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_bee1cf1f7d056e0353bed67574c7940047b661dff255a2207ffca4827603a4b3",
                                                    "typeString": "literal_string \"always fail\""
                                                }
                                            ],
                                            "id": 5313,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "1069:7:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 5324,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "1069:51:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 5325,
                                    "nodeType": "ExpressionStatement",
                                    "src": "1069:51:11"
                                },
                                {
                                    "eventCall": {
                                        "arguments": [
                                            {
                                                "hexValue": "696620796f7520736565207468697320726576657274206661696c65642e2e2e",
                                                "id": 5327,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "1145:34:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_12be86633e0e7784ea53f89fba7d26deacab661ef43c51d4ee479d1860c88685",
                                                    "typeString": "literal_string \"if you see this revert failed...\""
                                                },
                                                "value": "if you see this revert failed..."
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_stringliteral_12be86633e0e7784ea53f89fba7d26deacab661ef43c51d4ee479d1860c88685",
                                                    "typeString": "literal_string \"if you see this revert failed...\""
                                                }
                                            ],
                                            "id": 5326,
                                            "name": "Reverting",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 5310,
                                            "src": "1135:9:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_event_nonpayable$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (string memory)"
                                            }
                                        },
                                        "id": 5328,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "1135:45:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 5329,
                                    "nodeType": "EmitStatement",
                                    "src": "1130:50:11"
                                }
                            ]
                        },
                        "functionSelector": "a26388bb",
                        "id": 5331,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "testRevert",
                        "nameLocation": "1039:10:11",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5311,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1049:2:11"
                        },
                        "returnParameters": {
                            "id": 5312,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1059:0:11"
                        },
                        "scope": 5332,
                        "src": "1030:157:11",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    }
                ],
                "scope": 5333,
                "src": "105:1084:11",
                "usedErrors": []
            }
        ],
        "src": "0:1189:11"
    },
    "legacyAST": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/forwarder/test/TestForwarderTarget.sol",
        "exportedSymbols": {
            "ERC2771Recipient": [
                500
            ],
            "IERC2771Recipient": [
                5374
            ],
            "TestForwarderTarget": [
                5332
            ]
        },
        "id": 5333,
        "license": "GPL-3.0-only",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 5227,
                "literals": [
                    "solidity",
                    "^",
                    "0.8",
                    ".0"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:23:11"
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/ERC2771Recipient.sol",
                "file": "../../ERC2771Recipient.sol",
                "id": 5228,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 5333,
                "sourceUnit": 501,
                "src": "67:36:11",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": false,
                "baseContracts": [
                    {
                        "baseName": {
                            "id": 5229,
                            "name": "ERC2771Recipient",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 500,
                            "src": "137:16:11"
                        },
                        "id": 5230,
                        "nodeType": "InheritanceSpecifier",
                        "src": "137:16:11"
                    }
                ],
                "contractDependencies": [],
                "contractKind": "contract",
                "fullyImplemented": true,
                "id": 5332,
                "linearizedBaseContracts": [
                    5332,
                    500,
                    5374
                ],
                "name": "TestForwarderTarget",
                "nameLocation": "114:19:11",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "body": {
                            "id": 5239,
                            "nodeType": "Block",
                            "src": "192:48:11",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 5236,
                                                "name": "forwarder",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 5232,
                                                "src": "223:9:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            ],
                                            "id": 5235,
                                            "name": "_setTrustedForwarder",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 424,
                                            "src": "202:20:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                                                "typeString": "function (address)"
                                            }
                                        },
                                        "id": 5237,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "202:31:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 5238,
                                    "nodeType": "ExpressionStatement",
                                    "src": "202:31:11"
                                }
                            ]
                        },
                        "id": 5240,
                        "implemented": true,
                        "kind": "constructor",
                        "modifiers": [],
                        "name": "",
                        "nameLocation": "-1:-1:-1",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5233,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5232,
                                    "mutability": "mutable",
                                    "name": "forwarder",
                                    "nameLocation": "181:9:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5240,
                                    "src": "173:17:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 5231,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "173:7:11",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "172:19:11"
                        },
                        "returnParameters": {
                            "id": 5234,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "192:0:11"
                        },
                        "scope": 5332,
                        "src": "161:79:11",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 5243,
                            "nodeType": "Block",
                            "src": "322:2:11",
                            "statements": []
                        },
                        "id": 5244,
                        "implemented": true,
                        "kind": "receive",
                        "modifiers": [],
                        "name": "",
                        "nameLocation": "-1:-1:-1",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5241,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "302:2:11"
                        },
                        "returnParameters": {
                            "id": 5242,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "322:0:11"
                        },
                        "scope": 5332,
                        "src": "295:29:11",
                        "stateMutability": "payable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "anonymous": false,
                        "id": 5256,
                        "name": "TestForwarderMessage",
                        "nameLocation": "336:20:11",
                        "nodeType": "EventDefinition",
                        "parameters": {
                            "id": 5255,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5246,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "message",
                                    "nameLocation": "364:7:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5256,
                                    "src": "357:14:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5245,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "357:6:11",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5248,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "realMsgData",
                                    "nameLocation": "379:11:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5256,
                                    "src": "373:17:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5247,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "373:5:11",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5250,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "realSender",
                                    "nameLocation": "400:10:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5256,
                                    "src": "392:18:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 5249,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "392:7:11",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5252,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "msgSender",
                                    "nameLocation": "420:9:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5256,
                                    "src": "412:17:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 5251,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "412:7:11",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 5254,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "origin",
                                    "nameLocation": "439:6:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5256,
                                    "src": "431:14:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 5253,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "431:7:11",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "356:90:11"
                        },
                        "src": "330:117:11"
                    },
                    {
                        "body": {
                            "id": 5273,
                            "nodeType": "Block",
                            "src": "504:154:11",
                            "statements": [
                                {
                                    "eventCall": {
                                        "arguments": [
                                            {
                                                "id": 5262,
                                                "name": "message",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 5258,
                                                "src": "594:7:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                }
                                            },
                                            {
                                                "arguments": [],
                                                "expression": {
                                                    "argumentTypes": [],
                                                    "id": 5263,
                                                    "name": "_msgData",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [
                                                        499
                                                    ],
                                                    "referencedDeclaration": 499,
                                                    "src": "603:8:11",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$",
                                                        "typeString": "function () view returns (bytes calldata)"
                                                    }
                                                },
                                                "id": 5264,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "603:10:11",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            },
                                            {
                                                "arguments": [],
                                                "expression": {
                                                    "argumentTypes": [],
                                                    "id": 5265,
                                                    "name": "_msgSender",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [
                                                        465
                                                    ],
                                                    "referencedDeclaration": 465,
                                                    "src": "615:10:11",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                                        "typeString": "function () view returns (address)"
                                                    }
                                                },
                                                "id": 5266,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "615:12:11",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            },
                                            {
                                                "expression": {
                                                    "id": 5267,
                                                    "name": "msg",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 4294967281,
                                                    "src": "629:3:11",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_magic_message",
                                                        "typeString": "msg"
                                                    }
                                                },
                                                "id": 5268,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "sender",
                                                "nodeType": "MemberAccess",
                                                "src": "629:10:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            },
                                            {
                                                "expression": {
                                                    "id": 5269,
                                                    "name": "tx",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 4294967270,
                                                    "src": "641:2:11",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_magic_transaction",
                                                        "typeString": "tx"
                                                    }
                                                },
                                                "id": 5270,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "origin",
                                                "nodeType": "MemberAccess",
                                                "src": "641:9:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_string_memory_ptr",
                                                    "typeString": "string memory"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            ],
                                            "id": 5261,
                                            "name": "TestForwarderMessage",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 5256,
                                            "src": "573:20:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_event_nonpayable$_t_string_memory_ptr_$_t_bytes_memory_ptr_$_t_address_$_t_address_$_t_address_$returns$__$",
                                                "typeString": "function (string memory,bytes memory,address,address,address)"
                                            }
                                        },
                                        "id": 5271,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "573:78:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 5272,
                                    "nodeType": "EmitStatement",
                                    "src": "568:83:11"
                                }
                            ]
                        },
                        "functionSelector": "2ac0df26",
                        "id": 5274,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "emitMessage",
                        "nameLocation": "462:11:11",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5259,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5258,
                                    "mutability": "mutable",
                                    "name": "message",
                                    "nameLocation": "488:7:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5274,
                                    "src": "474:21:11",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5257,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "474:6:11",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "473:23:11"
                        },
                        "returnParameters": {
                            "id": 5260,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "504:0:11"
                        },
                        "scope": 5332,
                        "src": "453:205:11",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 5282,
                            "nodeType": "Block",
                            "src": "721:36:11",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [],
                                        "expression": {
                                            "argumentTypes": [],
                                            "id": 5279,
                                            "name": "_msgSender",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                465
                                            ],
                                            "referencedDeclaration": 465,
                                            "src": "738:10:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                                "typeString": "function () view returns (address)"
                                            }
                                        },
                                        "id": 5280,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "738:12:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "functionReturnParameters": 5278,
                                    "id": 5281,
                                    "nodeType": "Return",
                                    "src": "731:19:11"
                                }
                            ]
                        },
                        "functionSelector": "b6ffacf7",
                        "id": 5283,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "publicMsgSender",
                        "nameLocation": "673:15:11",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5275,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "688:2:11"
                        },
                        "returnParameters": {
                            "id": 5278,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5277,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5283,
                                    "src": "712:7:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 5276,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "712:7:11",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "711:9:11"
                        },
                        "scope": 5332,
                        "src": "664:93:11",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 5291,
                            "nodeType": "Block",
                            "src": "823:34:11",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [],
                                        "expression": {
                                            "argumentTypes": [],
                                            "id": 5288,
                                            "name": "_msgData",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                499
                                            ],
                                            "referencedDeclaration": 499,
                                            "src": "840:8:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes_calldata_ptr_$",
                                                "typeString": "function () view returns (bytes calldata)"
                                            }
                                        },
                                        "id": 5289,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "840:10:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_calldata_ptr",
                                            "typeString": "bytes calldata"
                                        }
                                    },
                                    "functionReturnParameters": 5287,
                                    "id": 5290,
                                    "nodeType": "Return",
                                    "src": "833:17:11"
                                }
                            ]
                        },
                        "functionSelector": "bf958726",
                        "id": 5292,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "publicMsgData",
                        "nameLocation": "772:13:11",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5284,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "785:2:11"
                        },
                        "returnParameters": {
                            "id": 5287,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5286,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5292,
                                    "src": "809:12:11",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 5285,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "809:5:11",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "808:14:11"
                        },
                        "scope": 5332,
                        "src": "763:94:11",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 5305,
                            "nodeType": "Block",
                            "src": "917:69:11",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                },
                                                "id": 5301,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "expression": {
                                                        "id": 5298,
                                                        "name": "msg",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4294967281,
                                                        "src": "936:3:11",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_magic_message",
                                                            "typeString": "msg"
                                                        }
                                                    },
                                                    "id": 5299,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "value",
                                                    "nodeType": "MemberAccess",
                                                    "src": "936:9:11",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "id": 5300,
                                                    "name": "value",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 5294,
                                                    "src": "949:5:11",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                    }
                                                },
                                                "src": "936:18:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "6469646e277420726563656976652076616c7565",
                                                "id": 5302,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "956:22:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_e83c6601a0158dbf43c48c4174f8e801815194c1d1f7c7519fe3f4b591e92ad9",
                                                    "typeString": "literal_string \"didn't receive value\""
                                                },
                                                "value": "didn't receive value"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_e83c6601a0158dbf43c48c4174f8e801815194c1d1f7c7519fe3f4b591e92ad9",
                                                    "typeString": "literal_string \"didn't receive value\""
                                                }
                                            ],
                                            "id": 5297,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "927:7:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 5303,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "927:52:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 5304,
                                    "nodeType": "ExpressionStatement",
                                    "src": "927:52:11"
                                }
                            ]
                        },
                        "functionSelector": "7a27578d",
                        "id": 5306,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "mustReceiveEth",
                        "nameLocation": "872:14:11",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5295,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5294,
                                    "mutability": "mutable",
                                    "name": "value",
                                    "nameLocation": "895:5:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5306,
                                    "src": "887:13:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 5293,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "887:7:11",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "886:15:11"
                        },
                        "returnParameters": {
                            "id": 5296,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "917:0:11"
                        },
                        "scope": 5332,
                        "src": "863:123:11",
                        "stateMutability": "payable",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "anonymous": false,
                        "id": 5310,
                        "name": "Reverting",
                        "nameLocation": "998:9:11",
                        "nodeType": "EventDefinition",
                        "parameters": {
                            "id": 5309,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 5308,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "message",
                                    "nameLocation": "1015:7:11",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 5310,
                                    "src": "1008:14:11",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 5307,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1008:6:11",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1007:16:11"
                        },
                        "src": "992:32:11"
                    },
                    {
                        "body": {
                            "id": 5330,
                            "nodeType": "Block",
                            "src": "1059:128:11",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "commonType": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                },
                                                "id": 5322,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                    "arguments": [
                                                        {
                                                            "id": 5316,
                                                            "name": "this",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967268,
                                                            "src": "1085:4:11",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_contract$_TestForwarderTarget_$5332",
                                                                "typeString": "contract TestForwarderTarget"
                                                            }
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_contract$_TestForwarderTarget_$5332",
                                                                "typeString": "contract TestForwarderTarget"
                                                            }
                                                        ],
                                                        "id": 5315,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "ElementaryTypeNameExpression",
                                                        "src": "1077:7:11",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_address_$",
                                                            "typeString": "type(address)"
                                                        },
                                                        "typeName": {
                                                            "id": 5314,
                                                            "name": "address",
                                                            "nodeType": "ElementaryTypeName",
                                                            "src": "1077:7:11",
                                                            "typeDescriptions": {}
                                                        }
                                                    },
                                                    "id": 5317,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "typeConversion",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "1077:13:11",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                    "arguments": [
                                                        {
                                                            "hexValue": "30",
                                                            "id": 5320,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "kind": "number",
                                                            "lValueRequested": false,
                                                            "nodeType": "Literal",
                                                            "src": "1102:1:11",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_rational_0_by_1",
                                                                "typeString": "int_const 0"
                                                            },
                                                            "value": "0"
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_rational_0_by_1",
                                                                "typeString": "int_const 0"
                                                            }
                                                        ],
                                                        "id": 5319,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "ElementaryTypeNameExpression",
                                                        "src": "1094:7:11",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_address_$",
                                                            "typeString": "type(address)"
                                                        },
                                                        "typeName": {
                                                            "id": 5318,
                                                            "name": "address",
                                                            "nodeType": "ElementaryTypeName",
                                                            "src": "1094:7:11",
                                                            "typeDescriptions": {}
                                                        }
                                                    },
                                                    "id": 5321,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "typeConversion",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "1094:10:11",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                    }
                                                },
                                                "src": "1077:27:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "hexValue": "616c77617973206661696c",
                                                "id": 5323,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "1106:13:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_bee1cf1f7d056e0353bed67574c7940047b661dff255a2207ffca4827603a4b3",
                                                    "typeString": "literal_string \"always fail\""
                                                },
                                                "value": "always fail"
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_stringliteral_bee1cf1f7d056e0353bed67574c7940047b661dff255a2207ffca4827603a4b3",
                                                    "typeString": "literal_string \"always fail\""
                                                }
                                            ],
                                            "id": 5313,
                                            "name": "require",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [
                                                4294967278,
                                                4294967278
                                            ],
                                            "referencedDeclaration": 4294967278,
                                            "src": "1069:7:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                            }
                                        },
                                        "id": 5324,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "1069:51:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 5325,
                                    "nodeType": "ExpressionStatement",
                                    "src": "1069:51:11"
                                },
                                {
                                    "eventCall": {
                                        "arguments": [
                                            {
                                                "hexValue": "696620796f7520736565207468697320726576657274206661696c65642e2e2e",
                                                "id": 5327,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "1145:34:11",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_12be86633e0e7784ea53f89fba7d26deacab661ef43c51d4ee479d1860c88685",
                                                    "typeString": "literal_string \"if you see this revert failed...\""
                                                },
                                                "value": "if you see this revert failed..."
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_stringliteral_12be86633e0e7784ea53f89fba7d26deacab661ef43c51d4ee479d1860c88685",
                                                    "typeString": "literal_string \"if you see this revert failed...\""
                                                }
                                            ],
                                            "id": 5326,
                                            "name": "Reverting",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 5310,
                                            "src": "1135:9:11",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_event_nonpayable$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (string memory)"
                                            }
                                        },
                                        "id": 5328,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "1135:45:11",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 5329,
                                    "nodeType": "EmitStatement",
                                    "src": "1130:50:11"
                                }
                            ]
                        },
                        "functionSelector": "a26388bb",
                        "id": 5331,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "testRevert",
                        "nameLocation": "1039:10:11",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 5311,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1049:2:11"
                        },
                        "returnParameters": {
                            "id": 5312,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1059:0:11"
                        },
                        "scope": 5332,
                        "src": "1030:157:11",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "public"
                    }
                ],
                "scope": 5333,
                "src": "105:1084:11",
                "usedErrors": []
            }
        ],
        "src": "0:1189:11"
    },
    "compiler": {
        "name": "solc",
        "version": "0.8.7+commit.e28d00a7.Emscripten.clang"
    },
    "networks": {},
    "schemaVersion": "3.1.0",
    "updatedAt": "2023-03-16T16:54:15.199Z",
    "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."
                }
            }
        },
        "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."
            }
        },
        "version": 1
    }
}
