{
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "forwardTo",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "stateMutability": "payable",
      "type": "fallback"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "forwardTo",
          "type": "address"
        }
      ],
      "name": "setForwardTo",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "allSourcePaths": {
    "19": "contracts/mocks/ForwardProxy.sol",
    "94": "node_modules/@openzeppelin/contracts/proxy/Proxy.sol"
  },
  "ast": {
    "absolutePath": "contracts/mocks/ForwardProxy.sol",
    "exportedSymbols": {
      "ForwardProxy": [
        12828
      ],
      "Proxy": [
        19871
      ]
    },
    "id": 12829,
    "license": "Apache-2.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 12781,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "39:23:19"
      },
      {
        "absolutePath": "node_modules/@openzeppelin/contracts/proxy/Proxy.sol",
        "file": "@openzeppelin/contracts/proxy/Proxy.sol",
        "id": 12783,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 12829,
        "sourceUnit": 19872,
        "src": "64:62:19",
        "symbolAliases": [
          {
            "foreign": {
              "id": 12782,
              "name": "Proxy",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "72:5:19",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 12785,
              "name": "Proxy",
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 19871,
              "src": "576:5:19"
            },
            "id": 12786,
            "nodeType": "InheritanceSpecifier",
            "src": "576:5:19"
          }
        ],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 12784,
          "nodeType": "StructuredDocumentation",
          "src": "128:422:19",
          "text": " @dev This contract provides a fallback function that forwards all calls to another contract using the EVM\n instruction `call`.\n Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n different contract through the {_delegate} function.\n The success and return data of the delegated call will be returned back to the caller of the proxy."
        },
        "fullyImplemented": true,
        "id": 12828,
        "linearizedBaseContracts": [
          12828,
          19871
        ],
        "name": "ForwardProxy",
        "nameLocation": "560:12:19",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 12788,
            "mutability": "mutable",
            "name": "_forwardTo",
            "nameLocation": "603:10:19",
            "nodeType": "VariableDeclaration",
            "scope": 12828,
            "src": "586:27:19",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 12787,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "586:7:19",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "internal"
          },
          {
            "body": {
              "id": 12797,
              "nodeType": "Block",
              "src": "649:33:19",
              "statements": [
                {
                  "expression": {
                    "id": 12795,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 12793,
                      "name": "_forwardTo",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 12788,
                      "src": "655:10:19",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 12794,
                      "name": "forwardTo",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 12790,
                      "src": "668:9:19",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "655:22:19",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 12796,
                  "nodeType": "ExpressionStatement",
                  "src": "655:22:19"
                }
              ]
            },
            "id": 12798,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12791,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12790,
                  "mutability": "mutable",
                  "name": "forwardTo",
                  "nameLocation": "638:9:19",
                  "nodeType": "VariableDeclaration",
                  "scope": 12798,
                  "src": "630:17:19",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12789,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "630:7:19",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "629:19:19"
            },
            "returnParameters": {
              "id": 12792,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "649:0:19"
            },
            "scope": 12828,
            "src": "618:64:19",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              19830
            ],
            "body": {
              "id": 12806,
              "nodeType": "Block",
              "src": "941:850:19",
              "statements": [
                {
                  "AST": {
                    "nodeType": "YulBlock",
                    "src": "1008:779:19",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1237:1:19",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1240:1:19",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "arguments": [],
                              "functionName": {
                                "name": "calldatasize",
                                "nodeType": "YulIdentifier",
                                "src": "1243:12:19"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "1243:14:19"
                            }
                          ],
                          "functionName": {
                            "name": "calldatacopy",
                            "nodeType": "YulIdentifier",
                            "src": "1224:12:19"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "1224:34:19"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "1224:34:19"
                      },
                      {
                        "nodeType": "YulVariableDeclaration",
                        "src": "1451:69:19",
                        "value": {
                          "arguments": [
                            {
                              "arguments": [],
                              "functionName": {
                                "name": "gas",
                                "nodeType": "YulIdentifier",
                                "src": "1470:3:19"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "1470:5:19"
                            },
                            {
                              "name": "implementation",
                              "nodeType": "YulIdentifier",
                              "src": "1477:14:19"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1493:1:19",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1496:1:19",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "arguments": [],
                              "functionName": {
                                "name": "calldatasize",
                                "nodeType": "YulIdentifier",
                                "src": "1499:12:19"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "1499:14:19"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1515:1:19",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1518:1:19",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "call",
                            "nodeType": "YulIdentifier",
                            "src": "1465:4:19"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "1465:55:19"
                        },
                        "variables": [
                          {
                            "name": "result",
                            "nodeType": "YulTypedName",
                            "src": "1455:6:19",
                            "type": ""
                          }
                        ]
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1576:1:19",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1579:1:19",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "arguments": [],
                              "functionName": {
                                "name": "returndatasize",
                                "nodeType": "YulIdentifier",
                                "src": "1582:14:19"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "1582:16:19"
                            }
                          ],
                          "functionName": {
                            "name": "returndatacopy",
                            "nodeType": "YulIdentifier",
                            "src": "1561:14:19"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "1561:38:19"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "1561:38:19"
                      },
                      {
                        "cases": [
                          {
                            "body": {
                              "nodeType": "YulBlock",
                              "src": "1676:45:19",
                              "statements": [
                                {
                                  "expression": {
                                    "arguments": [
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "1693:1:19",
                                        "type": "",
                                        "value": "0"
                                      },
                                      {
                                        "arguments": [],
                                        "functionName": {
                                          "name": "returndatasize",
                                          "nodeType": "YulIdentifier",
                                          "src": "1696:14:19"
                                        },
                                        "nodeType": "YulFunctionCall",
                                        "src": "1696:16:19"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "revert",
                                      "nodeType": "YulIdentifier",
                                      "src": "1686:6:19"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "1686:27:19"
                                  },
                                  "nodeType": "YulExpressionStatement",
                                  "src": "1686:27:19"
                                }
                              ]
                            },
                            "nodeType": "YulCase",
                            "src": "1669:52:19",
                            "value": {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1674:1:19",
                              "type": "",
                              "value": "0"
                            }
                          },
                          {
                            "body": {
                              "nodeType": "YulBlock",
                              "src": "1736:45:19",
                              "statements": [
                                {
                                  "expression": {
                                    "arguments": [
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "1753:1:19",
                                        "type": "",
                                        "value": "0"
                                      },
                                      {
                                        "arguments": [],
                                        "functionName": {
                                          "name": "returndatasize",
                                          "nodeType": "YulIdentifier",
                                          "src": "1756:14:19"
                                        },
                                        "nodeType": "YulFunctionCall",
                                        "src": "1756:16:19"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "return",
                                      "nodeType": "YulIdentifier",
                                      "src": "1746:6:19"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "1746:27:19"
                                  },
                                  "nodeType": "YulExpressionStatement",
                                  "src": "1746:27:19"
                                }
                              ]
                            },
                            "nodeType": "YulCase",
                            "src": "1728:53:19",
                            "value": "default"
                          }
                        ],
                        "expression": {
                          "name": "result",
                          "nodeType": "YulIdentifier",
                          "src": "1614:6:19"
                        },
                        "nodeType": "YulSwitch",
                        "src": "1607:174:19"
                      }
                    ]
                  },
                  "evmVersion": "istanbul",
                  "externalReferences": [
                    {
                      "declaration": 12801,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "1477:14:19",
                      "valueSize": 1
                    }
                  ],
                  "id": 12805,
                  "nodeType": "InlineAssembly",
                  "src": "999:788:19"
                }
              ]
            },
            "documentation": {
              "id": 12799,
              "nodeType": "StructuredDocumentation",
              "src": "686:183:19",
              "text": " @dev Delegates the current call to `implementation`.\n This function does not return to its internall call site, it will return directly to the external caller."
            },
            "id": 12807,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_delegate",
            "nameLocation": "881:9:19",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 12803,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "932:8:19"
            },
            "parameters": {
              "id": 12802,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12801,
                  "mutability": "mutable",
                  "name": "implementation",
                  "nameLocation": "899:14:19",
                  "nodeType": "VariableDeclaration",
                  "scope": 12807,
                  "src": "891:22:19",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12800,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "891:7:19",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "890:24:19"
            },
            "returnParameters": {
              "id": 12804,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "941:0:19"
            },
            "scope": 12828,
            "src": "872:919:19",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              19836
            ],
            "body": {
              "id": 12816,
              "nodeType": "Block",
              "src": "2040:28:19",
              "statements": [
                {
                  "expression": {
                    "id": 12814,
                    "name": "_forwardTo",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 12788,
                    "src": "2053:10:19",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 12813,
                  "id": 12815,
                  "nodeType": "Return",
                  "src": "2046:17:19"
                }
              ]
            },
            "documentation": {
              "id": 12808,
              "nodeType": "StructuredDocumentation",
              "src": "1795:166:19",
              "text": " @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\n and {_fallback} should delegate."
            },
            "id": 12817,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_implementation",
            "nameLocation": "1973:15:19",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 12810,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2013:8:19"
            },
            "parameters": {
              "id": 12809,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1988:2:19"
            },
            "returnParameters": {
              "id": 12813,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12812,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 12817,
                  "src": "2031:7:19",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12811,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2031:7:19",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2030:9:19"
            },
            "scope": 12828,
            "src": "1964:104:19",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 12826,
              "nodeType": "Block",
              "src": "2122:33:19",
              "statements": [
                {
                  "expression": {
                    "id": 12824,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 12822,
                      "name": "_forwardTo",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 12788,
                      "src": "2128:10:19",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 12823,
                      "name": "forwardTo",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 12819,
                      "src": "2141:9:19",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "2128:22:19",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 12825,
                  "nodeType": "ExpressionStatement",
                  "src": "2128:22:19"
                }
              ]
            },
            "functionSelector": "d4b27001",
            "id": 12827,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "setForwardTo",
            "nameLocation": "2081:12:19",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 12820,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 12819,
                  "mutability": "mutable",
                  "name": "forwardTo",
                  "nameLocation": "2102:9:19",
                  "nodeType": "VariableDeclaration",
                  "scope": 12827,
                  "src": "2094:17:19",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12818,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2094:7:19",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2093:19:19"
            },
            "returnParameters": {
              "id": 12821,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2122:0:19"
            },
            "scope": 12828,
            "src": "2072:83:19",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 12829,
        "src": "551:1606:19",
        "usedErrors": []
      }
    ],
    "src": "39:2119:19"
  },
  "bytecode": "608060405234801561001057600080fd5b5060405161019e38038061019e83398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b61010b806100936000396000f3fe608060405260043610601f5760003560e01c8063d4b2700114603157602b565b36602b576029606a565b005b6029606a565b348015603c57600080fd5b506029604836600460a7565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6081607d6000546001600160a01b031690565b6083565b565b366000803760008036600080855af13d6000803e80801560a2573d6000f35b3d6000fd5b60006020828403121560b857600080fd5b81356001600160a01b038116811460ce57600080fd5b939250505056fea264697066735822122071f409a3f37bc9f780cb17c477ba017eaa227cfe9f664b95dd6a3a731921e67c64736f6c63430008060033",
  "bytecodeSha1": "1bbb036962a4a161a122fdbd07dbb6a43afc2bbb",
  "compiler": {
    "evm_version": "istanbul",
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "version": "0.8.6+commit.11564f7e"
  },
  "contractName": "ForwardProxy",
  "coverageMap": {
    "branches": {
      "19": {},
      "94": {}
    },
    "statements": {
      "19": {
        "ForwardProxy._implementation": {
          "4": [
            2046,
            2063
          ]
        },
        "ForwardProxy.setForwardTo": {
          "2": [
            2128,
            2150
          ]
        }
      },
      "94": {
        "Proxy.<fallback>": {
          "1": [
            2675,
            2686
          ]
        },
        "Proxy.<receive>": {
          "0": [
            2898,
            2909
          ]
        },
        "Proxy._fallback": {
          "3": [
            2397,
            2425
          ]
        }
      }
    }
  },
  "dependencies": [
    "Proxy"
  ],
  "deployedBytecode": "608060405260043610601f5760003560e01c8063d4b2700114603157602b565b36602b576029606a565b005b6029606a565b348015603c57600080fd5b506029604836600460a7565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6081607d6000546001600160a01b031690565b6083565b565b366000803760008036600080855af13d6000803e80801560a2573d6000f35b3d6000fd5b60006020828403121560b857600080fd5b81356001600160a01b038116811460ce57600080fd5b939250505056fea264697066735822122071f409a3f37bc9f780cb17c477ba017eaa227cfe9f664b95dd6a3a731921e67c64736f6c63430008060033",
  "deployedSourceMap": "551:1606:19:-:0;;;;;;;;;;;;;;;;;;;;;;;2898:11:94;:9;:11::i;:::-;551:1606:19;;2675:11:94;:9;:11::i;2072:83:19:-;;;;;;;;;;-1:-1:-1;2072:83:19;;;;;:::i;:::-;2128:10;:22;;-1:-1:-1;;;;;;2128:22:19;-1:-1:-1;;;;;2128:22:19;;;;;;;;;;2072:83;2322:110:94;2397:28;2407:17;2031:7:19;2053:10;-1:-1:-1;;;;;2053:10:19;;1964:104;2407:17:94;2397:9;:28::i;:::-;2322:110::o;872:919:19:-;1243:14;1240:1;1237;1224:34;1518:1;1515;1499:14;1496:1;1493;1477:14;1470:5;1465:55;1582:16;1579:1;1576;1561:38;1614:6;1669:52;;;;1756:16;1753:1;1746:27;1669:52;1696:16;1693:1;1686:27;14:286:114;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;142:1;139;132:12;94:2;168:23;;-1:-1:-1;;;;;220:31:114;;210:42;;200:2;;266:1;263;256:12;200:2;289:5;84:216;-1:-1:-1;;;84:216:114:o",
  "language": "Solidity",
  "natspec": {
    "details": "This contract provides a fallback function that forwards all calls to another contract using the EVM instruction `call`. Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a different contract through the {_delegate} function. The success and return data of the delegated call will be returned back to the caller of the proxy.",
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "offset": [
    551,
    2157
  ],
  "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x1F JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xD4B27001 EQ PUSH1 0x31 JUMPI PUSH1 0x2B JUMP JUMPDEST CALLDATASIZE PUSH1 0x2B JUMPI PUSH1 0x29 PUSH1 0x6A JUMP JUMPDEST STOP JUMPDEST PUSH1 0x29 PUSH1 0x6A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH1 0x3C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x29 PUSH1 0x48 CALLDATASIZE PUSH1 0x4 PUSH1 0xA7 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x81 PUSH1 0x7D PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x83 JUMP JUMPDEST JUMP JUMPDEST CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP1 DUP6 GAS CALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 DUP1 ISZERO PUSH1 0xA2 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH1 0xB8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH1 0xCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH18 0xF409A3F37BC9F780CB17C477BA017EAA227C INVALID SWAP16 PUSH7 0x4B95DD6A3A7319 0x21 0xE6 PUSH29 0x64736F6C63430008060033000000000000000000000000000000000000 ",
  "pcMap": {
    "0": {
      "offset": [
        551,
        2157
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x80"
    },
    "2": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x40"
    },
    "4": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "MSTORE",
      "path": "19"
    },
    "5": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x4"
    },
    "7": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "CALLDATASIZE",
      "path": "19"
    },
    "8": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "LT",
      "path": "19"
    },
    "9": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x1F"
    },
    "11": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "JUMPI",
      "path": "19"
    },
    "12": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x0"
    },
    "14": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "CALLDATALOAD",
      "path": "19"
    },
    "15": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0xE0"
    },
    "17": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "SHR",
      "path": "19"
    },
    "18": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "DUP1",
      "path": "19"
    },
    "19": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "PUSH4",
      "path": "19",
      "value": "0xD4B27001"
    },
    "24": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "EQ",
      "path": "19"
    },
    "25": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x31"
    },
    "27": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "JUMPI",
      "path": "19"
    },
    "28": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x2B"
    },
    "30": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "JUMP",
      "path": "19"
    },
    "31": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "JUMPDEST",
      "path": "19"
    },
    "32": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "CALLDATASIZE",
      "path": "19"
    },
    "33": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x2B"
    },
    "35": {
      "fn": null,
      "offset": [
        551,
        2157
      ],
      "op": "JUMPI",
      "path": "19"
    },
    "36": {
      "fn": "Proxy.<receive>",
      "offset": [
        2898,
        2909
      ],
      "op": "PUSH1",
      "path": "94",
      "statement": 0,
      "value": "0x29"
    },
    "38": {
      "fn": "Proxy.<receive>",
      "offset": [
        2898,
        2907
      ],
      "op": "PUSH1",
      "path": "94",
      "value": "0x6A"
    },
    "40": {
      "fn": "Proxy.<receive>",
      "jump": "i",
      "offset": [
        2898,
        2909
      ],
      "op": "JUMP",
      "path": "94"
    },
    "41": {
      "fn": "Proxy.<receive>",
      "offset": [
        2898,
        2909
      ],
      "op": "JUMPDEST",
      "path": "94"
    },
    "42": {
      "offset": [
        551,
        2157
      ],
      "op": "STOP",
      "path": "19"
    },
    "43": {
      "fn": "Proxy.<receive>",
      "offset": [
        551,
        2157
      ],
      "op": "JUMPDEST",
      "path": "19"
    },
    "44": {
      "fn": "Proxy.<fallback>",
      "offset": [
        2675,
        2686
      ],
      "op": "PUSH1",
      "path": "94",
      "statement": 1,
      "value": "0x29"
    },
    "46": {
      "fn": "Proxy.<fallback>",
      "offset": [
        2675,
        2684
      ],
      "op": "PUSH1",
      "path": "94",
      "value": "0x6A"
    },
    "48": {
      "fn": "Proxy.<fallback>",
      "jump": "i",
      "offset": [
        2675,
        2686
      ],
      "op": "JUMP",
      "path": "94"
    },
    "49": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "JUMPDEST",
      "path": "19"
    },
    "50": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "CALLVALUE",
      "path": "19"
    },
    "51": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "DUP1",
      "path": "19"
    },
    "52": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "ISZERO",
      "path": "19"
    },
    "53": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x3C"
    },
    "55": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "JUMPI",
      "path": "19"
    },
    "56": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x0"
    },
    "58": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "DUP1",
      "path": "19"
    },
    "59": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "REVERT",
      "path": "19"
    },
    "60": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "JUMPDEST",
      "path": "19"
    },
    "61": {
      "op": "POP"
    },
    "62": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x29"
    },
    "64": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x48"
    },
    "66": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "CALLDATASIZE",
      "path": "19"
    },
    "67": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x4"
    },
    "69": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0xA7"
    },
    "71": {
      "fn": "ForwardProxy.setForwardTo",
      "jump": "i",
      "offset": [
        2072,
        2155
      ],
      "op": "JUMP",
      "path": "19"
    },
    "72": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "JUMPDEST",
      "path": "19"
    },
    "73": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2138
      ],
      "op": "PUSH1",
      "path": "19",
      "statement": 2,
      "value": "0x0"
    },
    "75": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2150
      ],
      "op": "DUP1",
      "path": "19"
    },
    "76": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2150
      ],
      "op": "SLOAD",
      "path": "19"
    },
    "77": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "79": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "81": {
      "op": "PUSH1",
      "value": "0xA0"
    },
    "83": {
      "op": "SHL"
    },
    "84": {
      "op": "SUB"
    },
    "85": {
      "op": "NOT"
    },
    "86": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2150
      ],
      "op": "AND",
      "path": "19"
    },
    "87": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "89": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "91": {
      "op": "PUSH1",
      "value": "0xA0"
    },
    "93": {
      "op": "SHL"
    },
    "94": {
      "op": "SUB"
    },
    "95": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2150
      ],
      "op": "SWAP3",
      "path": "19"
    },
    "96": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2150
      ],
      "op": "SWAP1",
      "path": "19"
    },
    "97": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2150
      ],
      "op": "SWAP3",
      "path": "19"
    },
    "98": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2150
      ],
      "op": "AND",
      "path": "19"
    },
    "99": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2150
      ],
      "op": "SWAP2",
      "path": "19"
    },
    "100": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2150
      ],
      "op": "SWAP1",
      "path": "19"
    },
    "101": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2150
      ],
      "op": "SWAP2",
      "path": "19"
    },
    "102": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2150
      ],
      "op": "OR",
      "path": "19"
    },
    "103": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2150
      ],
      "op": "SWAP1",
      "path": "19"
    },
    "104": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2128,
        2150
      ],
      "op": "SSTORE",
      "path": "19"
    },
    "105": {
      "fn": "ForwardProxy.setForwardTo",
      "offset": [
        2072,
        2155
      ],
      "op": "JUMP",
      "path": "19"
    },
    "106": {
      "fn": "Proxy._fallback",
      "offset": [
        2322,
        2432
      ],
      "op": "JUMPDEST",
      "path": "94"
    },
    "107": {
      "fn": "Proxy._fallback",
      "offset": [
        2397,
        2425
      ],
      "op": "PUSH1",
      "path": "94",
      "statement": 3,
      "value": "0x81"
    },
    "109": {
      "fn": "Proxy._fallback",
      "offset": [
        2407,
        2424
      ],
      "op": "PUSH1",
      "path": "94",
      "value": "0x7D"
    },
    "111": {
      "fn": "ForwardProxy._implementation",
      "offset": [
        2031,
        2038
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x0"
    },
    "113": {
      "fn": "ForwardProxy._implementation",
      "offset": [
        2053,
        2063
      ],
      "op": "SLOAD",
      "path": "19",
      "statement": 4
    },
    "114": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "116": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "118": {
      "op": "PUSH1",
      "value": "0xA0"
    },
    "120": {
      "op": "SHL"
    },
    "121": {
      "op": "SUB"
    },
    "122": {
      "fn": "ForwardProxy._implementation",
      "offset": [
        2053,
        2063
      ],
      "op": "AND",
      "path": "19"
    },
    "123": {
      "fn": "ForwardProxy._implementation",
      "offset": [
        2053,
        2063
      ],
      "op": "SWAP1",
      "path": "19"
    },
    "124": {
      "fn": "ForwardProxy._implementation",
      "offset": [
        1964,
        2068
      ],
      "op": "JUMP",
      "path": "19"
    },
    "125": {
      "fn": "Proxy._fallback",
      "offset": [
        2407,
        2424
      ],
      "op": "JUMPDEST",
      "path": "94"
    },
    "126": {
      "fn": "Proxy._fallback",
      "offset": [
        2397,
        2406
      ],
      "op": "PUSH1",
      "path": "94",
      "value": "0x83"
    },
    "128": {
      "fn": "Proxy._fallback",
      "jump": "i",
      "offset": [
        2397,
        2425
      ],
      "op": "JUMP",
      "path": "94"
    },
    "129": {
      "fn": "Proxy._fallback",
      "offset": [
        2397,
        2425
      ],
      "op": "JUMPDEST",
      "path": "94"
    },
    "130": {
      "fn": "Proxy._fallback",
      "jump": "o",
      "offset": [
        2322,
        2432
      ],
      "op": "JUMP",
      "path": "94"
    },
    "131": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        872,
        1791
      ],
      "op": "JUMPDEST",
      "path": "19"
    },
    "132": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1243,
        1257
      ],
      "op": "CALLDATASIZE",
      "path": "19"
    },
    "133": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1240,
        1241
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x0"
    },
    "135": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1237,
        1238
      ],
      "op": "DUP1",
      "path": "19"
    },
    "136": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1224,
        1258
      ],
      "op": "CALLDATACOPY",
      "path": "19"
    },
    "137": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1518,
        1519
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x0"
    },
    "139": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1515,
        1516
      ],
      "op": "DUP1",
      "path": "19"
    },
    "140": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1499,
        1513
      ],
      "op": "CALLDATASIZE",
      "path": "19"
    },
    "141": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1496,
        1497
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x0"
    },
    "143": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1493,
        1494
      ],
      "op": "DUP1",
      "path": "19"
    },
    "144": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1477,
        1491
      ],
      "op": "DUP6",
      "path": "19"
    },
    "145": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1470,
        1475
      ],
      "op": "GAS",
      "path": "19"
    },
    "146": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1465,
        1520
      ],
      "op": "CALL",
      "path": "19"
    },
    "147": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1582,
        1598
      ],
      "op": "RETURNDATASIZE",
      "path": "19"
    },
    "148": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1579,
        1580
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x0"
    },
    "150": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1576,
        1577
      ],
      "op": "DUP1",
      "path": "19"
    },
    "151": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1561,
        1599
      ],
      "op": "RETURNDATACOPY",
      "path": "19"
    },
    "152": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1614,
        1620
      ],
      "op": "DUP1",
      "path": "19"
    },
    "153": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1669,
        1721
      ],
      "op": "DUP1",
      "path": "19"
    },
    "154": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1669,
        1721
      ],
      "op": "ISZERO",
      "path": "19"
    },
    "155": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1669,
        1721
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0xA2"
    },
    "157": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1669,
        1721
      ],
      "op": "JUMPI",
      "path": "19"
    },
    "158": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1756,
        1772
      ],
      "op": "RETURNDATASIZE",
      "path": "19"
    },
    "159": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1753,
        1754
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x0"
    },
    "161": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1746,
        1773
      ],
      "op": "RETURN",
      "path": "19"
    },
    "162": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1669,
        1721
      ],
      "op": "JUMPDEST",
      "path": "19"
    },
    "163": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1696,
        1712
      ],
      "op": "RETURNDATASIZE",
      "path": "19"
    },
    "164": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1693,
        1694
      ],
      "op": "PUSH1",
      "path": "19",
      "value": "0x0"
    },
    "166": {
      "fn": "ForwardProxy._delegate",
      "offset": [
        1686,
        1713
      ],
      "op": "REVERT",
      "path": "19"
    },
    "167": {
      "op": "JUMPDEST"
    },
    "168": {
      "op": "PUSH1",
      "value": "0x0"
    },
    "170": {
      "op": "PUSH1",
      "value": "0x20"
    },
    "172": {
      "op": "DUP3"
    },
    "173": {
      "op": "DUP5"
    },
    "174": {
      "op": "SUB"
    },
    "175": {
      "op": "SLT"
    },
    "176": {
      "op": "ISZERO"
    },
    "177": {
      "op": "PUSH1",
      "value": "0xB8"
    },
    "179": {
      "op": "JUMPI"
    },
    "180": {
      "op": "PUSH1",
      "value": "0x0"
    },
    "182": {
      "op": "DUP1"
    },
    "183": {
      "op": "REVERT"
    },
    "184": {
      "op": "JUMPDEST"
    },
    "185": {
      "op": "DUP2"
    },
    "186": {
      "op": "CALLDATALOAD"
    },
    "187": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "189": {
      "op": "PUSH1",
      "value": "0x1"
    },
    "191": {
      "op": "PUSH1",
      "value": "0xA0"
    },
    "193": {
      "op": "SHL"
    },
    "194": {
      "op": "SUB"
    },
    "195": {
      "op": "DUP2"
    },
    "196": {
      "op": "AND"
    },
    "197": {
      "op": "DUP2"
    },
    "198": {
      "op": "EQ"
    },
    "199": {
      "op": "PUSH1",
      "value": "0xCE"
    },
    "201": {
      "op": "JUMPI"
    },
    "202": {
      "op": "PUSH1",
      "value": "0x0"
    },
    "204": {
      "op": "DUP1"
    },
    "205": {
      "op": "REVERT"
    },
    "206": {
      "op": "JUMPDEST"
    },
    "207": {
      "op": "SWAP4"
    },
    "208": {
      "op": "SWAP3"
    },
    "209": {
      "op": "POP"
    },
    "210": {
      "op": "POP"
    },
    "211": {
      "op": "POP"
    },
    "212": {
      "jump": "o",
      "op": "JUMP"
    }
  },
  "sha1": "a6c32702dc72a2e45474841ac2a9df9212285dd9",
  "source": "//SPDX-License-Identifier: Apache-2.0\n\npragma solidity ^0.8.0;\n\nimport {Proxy} from \"@openzeppelin/contracts/proxy/Proxy.sol\";\n\n/**\n * @dev This contract provides a fallback function that forwards all calls to another contract using the EVM\n * instruction `call`.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\ncontract ForwardProxy is Proxy {\n  address internal _forwardTo;\n\n  constructor(address forwardTo) {\n    _forwardTo = forwardTo;\n  }\n\n  /**\n   * @dev Delegates the current call to `implementation`.\n   *\n   * This function does not return to its internall call site, it will return directly to the external caller.\n   */\n  function _delegate(address implementation) internal virtual override {\n    // solhint-disable-next-line no-inline-assembly\n    assembly {\n      // Copy msg.data. We take full control of memory in this inline assembly\n      // block because it will not return to Solidity code. We overwrite the\n      // Solidity scratch pad at memory position 0.\n      calldatacopy(0, 0, calldatasize())\n\n      // Call the implementation.\n      // out and outsize are 0 because we don't know the size yet.\n      // let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n      let result := call(gas(), implementation, 0, 0, calldatasize(), 0, 0)\n\n      // Copy the returned data.\n      returndatacopy(0, 0, returndatasize())\n\n      switch result\n      // delegatecall returns 0 on error.\n      case 0 {\n        revert(0, returndatasize())\n      }\n      default {\n        return(0, returndatasize())\n      }\n    }\n  }\n\n  /**\n   * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\n   * and {_fallback} should delegate.\n   */\n  function _implementation() internal view virtual override returns (address) {\n    return _forwardTo;\n  }\n\n  function setForwardTo(address forwardTo) external {\n    _forwardTo = forwardTo;\n  }\n}\n",
  "sourceMap": "551:1606:19:-:0;;;618:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;655:10;:22;;-1:-1:-1;;;;;;655:22:19;-1:-1:-1;;;;;655:22:19;;;;;;;;;;551:1606;;14:290:114;84:6;137:2;125:9;116:7;112:23;108:32;105:2;;;153:1;150;143:12;105:2;179:16;;-1:-1:-1;;;;;224:31:114;;214:42;;204:2;;270:1;267;260:12;204:2;293:5;95:209;-1:-1:-1;;;95:209:114:o;:::-;551:1606:19;;;;;;",
  "sourcePath": "contracts/mocks/ForwardProxy.sol",
  "type": "contract"
}