{
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_vault",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "profit",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "loss",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "debtPayment",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "debtOutstanding",
          "type": "uint256"
        }
      ],
      "name": "Harvested",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "debtThreshold",
          "type": "uint256"
        }
      ],
      "name": "UpdatedDebtThreshold",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "newKeeper",
          "type": "address"
        }
      ],
      "name": "UpdatedKeeper",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "profitFactor",
          "type": "uint256"
        }
      ],
      "name": "UpdatedProfitFactor",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "delay",
          "type": "uint256"
        }
      ],
      "name": "UpdatedReportDelay",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "rewards",
          "type": "address"
        }
      ],
      "name": "UpdatedRewards",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "newStrategist",
          "type": "address"
        }
      ],
      "name": "UpdatedStrategist",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "apiVersion",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "debtThreshold",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "delegatedAssets",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "emergencyExit",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "estimatedTotalAssets",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "harvest",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "callCost",
          "type": "uint256"
        }
      ],
      "name": "harvestTrigger",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isActive",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "keeper",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_newStrategy",
          "type": "address"
        }
      ],
      "name": "migrate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "minReportDelay",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "profitFactor",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rewards",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_debtThreshold",
          "type": "uint256"
        }
      ],
      "name": "setDebtThreshold",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "setEmergencyExit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        }
      ],
      "name": "setKeeper",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_delay",
          "type": "uint256"
        }
      ],
      "name": "setMinReportDelay",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_profitFactor",
          "type": "uint256"
        }
      ],
      "name": "setProfitFactor",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_rewards",
          "type": "address"
        }
      ],
      "name": "setRewards",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_strategist",
          "type": "address"
        }
      ],
      "name": "setStrategist",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "strategist",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "sweep",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "tend",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "callCost",
          "type": "uint256"
        }
      ],
      "name": "tendTrigger",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "vault",
      "outputs": [
        {
          "internalType": "contract VaultAPI",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "want",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_amountNeeded",
          "type": "uint256"
        }
      ],
      "name": "withdraw",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_loss",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "allSourcePaths": {
    "1": "/Users/sbacha/.brownie/packages/OpenZeppelin/openzeppelin-contracts@3.1.0/contracts/math/SafeMath.sol",
    "5": "contracts/BaseStrategy.sol"
  },
  "ast": {
    "absolutePath": "contracts/BaseStrategy.sol",
    "exportedSymbols": {
      "BaseStrategy": [
        951
      ],
      "StrategyAPI": [
        149
      ],
      "StrategyParams": [
        21
      ],
      "VaultAPI": [
        87
      ]
    },
    "id": 952,
    "license": "GPL-3.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1,
        "literals": [
          "solidity",
          ">=",
          "0.6",
          ".0",
          "<",
          "0.7",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "36:31:5"
      },
      {
        "id": 2,
        "literals": [
          "experimental",
          "ABIEncoderV2"
        ],
        "nodeType": "PragmaDirective",
        "src": "68:33:5"
      },
      {
        "absolutePath": "/Users/sbacha/.brownie/packages/OpenZeppelin/openzeppelin-contracts@3.1.0/contracts/token/ERC20/IERC20.sol",
        "file": "@openzeppelin/contracts/token/ERC20/IERC20.sol",
        "id": 3,
        "nodeType": "ImportDirective",
        "scope": 952,
        "sourceUnit": 1568,
        "src": "103:56:5",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/sbacha/.brownie/packages/OpenZeppelin/openzeppelin-contracts@3.1.0/contracts/math/SafeMath.sol",
        "file": "@openzeppelin/contracts/math/SafeMath.sol",
        "id": 4,
        "nodeType": "ImportDirective",
        "scope": 952,
        "sourceUnit": 1490,
        "src": "160:51:5",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "canonicalName": "StrategyParams",
        "id": 21,
        "members": [
          {
            "constant": false,
            "id": 6,
            "mutability": "mutable",
            "name": "performanceFee",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 21,
            "src": "241:22:5",
            "stateVariable": false,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 5,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "241:7:5",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 8,
            "mutability": "mutable",
            "name": "activation",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 21,
            "src": "269:18:5",
            "stateVariable": false,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 7,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "269:7:5",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 10,
            "mutability": "mutable",
            "name": "debtLimit",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 21,
            "src": "293:17:5",
            "stateVariable": false,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 9,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "293:7:5",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 12,
            "mutability": "mutable",
            "name": "rateLimit",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 21,
            "src": "316:17:5",
            "stateVariable": false,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 11,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "316:7:5",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 14,
            "mutability": "mutable",
            "name": "lastReport",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 21,
            "src": "339:18:5",
            "stateVariable": false,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 13,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "339:7:5",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 16,
            "mutability": "mutable",
            "name": "totalDebt",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 21,
            "src": "363:17:5",
            "stateVariable": false,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 15,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "363:7:5",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 18,
            "mutability": "mutable",
            "name": "totalGain",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 21,
            "src": "386:17:5",
            "stateVariable": false,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 17,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "386:7:5",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "constant": false,
            "id": 20,
            "mutability": "mutable",
            "name": "totalLoss",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 21,
            "src": "409:17:5",
            "stateVariable": false,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 19,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "409:7:5",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "internal"
          }
        ],
        "name": "StrategyParams",
        "nodeType": "StructDefinition",
        "scope": 952,
        "src": "213:216:5",
        "visibility": "public"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 22,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1567,
              "src": "453:6:5",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$1567",
                "typeString": "contract IERC20"
              }
            },
            "id": 23,
            "nodeType": "InheritanceSpecifier",
            "src": "453:6:5"
          }
        ],
        "contractDependencies": [
          1567
        ],
        "contractKind": "interface",
        "documentation": null,
        "fullyImplemented": false,
        "id": 87,
        "linearizedBaseContracts": [
          87,
          1567
        ],
        "name": "VaultAPI",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": null,
            "documentation": null,
            "functionSelector": "25829410",
            "id": 28,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "apiVersion",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 24,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "485:2:5"
            },
            "returnParameters": {
              "id": 27,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 26,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 28,
                  "src": "511:13:5",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 25,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "511:6:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "510:15:5"
            },
            "scope": 87,
            "src": "466:60:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "functionSelector": "fc0c546a",
            "id": 33,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "token",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 29,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "546:2:5"
            },
            "returnParameters": {
              "id": 32,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 31,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 33,
                  "src": "572:7:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "572:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "571:9:5"
            },
            "scope": 87,
            "src": "532:49:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "functionSelector": "39ebf823",
            "id": 40,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "strategies",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 36,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 35,
                  "mutability": "mutable",
                  "name": "_strategy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 40,
                  "src": "607:17:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 34,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "607:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "606:19:5"
            },
            "returnParameters": {
              "id": 39,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 38,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 40,
                  "src": "649:21:5",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_StrategyParams_$21_memory_ptr",
                    "typeString": "struct StrategyParams"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 37,
                    "name": "StrategyParams",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 21,
                    "src": "649:14:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_StrategyParams_$21_storage_ptr",
                      "typeString": "struct StrategyParams"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "648:23:5"
            },
            "scope": 87,
            "src": "587:85:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": {
              "id": 41,
              "nodeType": "StructuredDocumentation",
              "src": "678:217:5",
              "text": " View how much the Vault would increase this Strategy's borrow limit,\n based on its present performance (since its last report). Can be used to\n determine expectedReturn in your Strategy."
            },
            "functionSelector": "112c1f9b",
            "id": 46,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "creditAvailable",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 42,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "924:2:5"
            },
            "returnParameters": {
              "id": 45,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 44,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 46,
                  "src": "950:7:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 43,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "950:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "949:9:5"
            },
            "scope": 87,
            "src": "900:59:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": {
              "id": 47,
              "nodeType": "StructuredDocumentation",
              "src": "965:215:5",
              "text": " View how much the Vault would like to pull back from the Strategy,\n based on its present performance (since its last report). Can be used to\n determine expectedReturn in your Strategy."
            },
            "functionSelector": "bf3759b5",
            "id": 52,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "debtOutstanding",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 48,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1209:2:5"
            },
            "returnParameters": {
              "id": 51,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 50,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 52,
                  "src": "1235:7:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 49,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1235:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1234:9:5"
            },
            "scope": 87,
            "src": "1185:59:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": {
              "id": 53,
              "nodeType": "StructuredDocumentation",
              "src": "1250:225:5",
              "text": " View how much the Vault expect this Strategy to return at the current\n block, based on its present performance (since its last report). Can be\n used to determine expectedReturn in your Strategy."
            },
            "functionSelector": "d3406abd",
            "id": 58,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "expectedReturn",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 54,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1503:2:5"
            },
            "returnParameters": {
              "id": 57,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 56,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 58,
                  "src": "1529:7:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 55,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1529:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1528:9:5"
            },
            "scope": 87,
            "src": "1480:58:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": {
              "id": 59,
              "nodeType": "StructuredDocumentation",
              "src": "1544:282:5",
              "text": " This is the main contact point where the Strategy interacts with the\n Vault. It is critical that this call is handled as intended by the\n Strategy. Therefore, this function will be called by BaseStrategy to\n make sure the integration is correct."
            },
            "functionSelector": "a1d9bafc",
            "id": 70,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "report",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 66,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 61,
                  "mutability": "mutable",
                  "name": "_gain",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 70,
                  "src": "1856:13:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 60,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1856:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 63,
                  "mutability": "mutable",
                  "name": "_loss",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 70,
                  "src": "1879:13:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 62,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1879:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 65,
                  "mutability": "mutable",
                  "name": "_debtPayment",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 70,
                  "src": "1902:20:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 64,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1902:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1846:82:5"
            },
            "returnParameters": {
              "id": 69,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 68,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 70,
                  "src": "1947:7:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 67,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1947:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1946:9:5"
            },
            "scope": 87,
            "src": "1831:125:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": {
              "id": 71,
              "nodeType": "StructuredDocumentation",
              "src": "1962:444:5",
              "text": " This function is used in the scenario where there is a newer Strategy\n that would hold the same positions as this one, and those positions are\n easily transferrable to the newer Strategy. These positions must be able\n to be transferred at the moment this call is made, if any prep is\n required to execute a full transfer in one transaction, that must be\n accounted for separately from this call."
            },
            "functionSelector": "fafa6c69",
            "id": 76,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "migrateStrategy",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 74,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 73,
                  "mutability": "mutable",
                  "name": "_newStrategy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 76,
                  "src": "2436:20:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 72,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2436:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2435:22:5"
            },
            "returnParameters": {
              "id": 75,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2466:0:5"
            },
            "scope": 87,
            "src": "2411:56:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": {
              "id": 77,
              "nodeType": "StructuredDocumentation",
              "src": "2473:583:5",
              "text": " This function should only be used in the scenario where the Strategy is\n being retired but no migration of the positions are possible, or in the\n extreme scenario that the Strategy needs to be put into \"Emergency Exit\"\n mode in order for it to exit as quickly as possible. The latter scenario\n could be for any reason that is considered \"critical\" that the Strategy\n exits its position as fast as possible, such as a sudden change in\n market conditions leading to losses, or an imminent failure in an\n external dependency."
            },
            "functionSelector": "a0e4af9a",
            "id": 80,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "revokeStrategy",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 78,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3084:2:5"
            },
            "returnParameters": {
              "id": 79,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3095:0:5"
            },
            "scope": 87,
            "src": "3061:35:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": {
              "id": 81,
              "nodeType": "StructuredDocumentation",
              "src": "3102:222:5",
              "text": " View the governance address of the Vault to assert privileged functions\n can only be called by governance. The Strategy serves the Vault, so it\n is subject to governance defined by the Vault."
            },
            "functionSelector": "5aa6e675",
            "id": 86,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "governance",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 82,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3348:2:5"
            },
            "returnParameters": {
              "id": 85,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 84,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 86,
                  "src": "3374:7:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 83,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3374:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3373:9:5"
            },
            "scope": 87,
            "src": "3329:54:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 952,
        "src": "431:2954:5"
      },
      {
        "abstract": false,
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "interface",
        "documentation": {
          "id": 88,
          "nodeType": "StructuredDocumentation",
          "src": "3387:60:5",
          "text": " This interface is here for the keeper bot to use."
        },
        "fullyImplemented": false,
        "id": 149,
        "linearizedBaseContracts": [
          149
        ],
        "name": "StrategyAPI",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": null,
            "documentation": null,
            "functionSelector": "25829410",
            "id": 93,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "apiVersion",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 89,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3495:2:5"
            },
            "returnParameters": {
              "id": 92,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 91,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 93,
                  "src": "3521:13:5",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 90,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3521:6:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3520:15:5"
            },
            "scope": 149,
            "src": "3476:60:5",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "functionSelector": "22f3e2d4",
            "id": 98,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "isActive",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 94,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3559:2:5"
            },
            "returnParameters": {
              "id": 97,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 96,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 98,
                  "src": "3585:4:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 95,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3585:4:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3584:6:5"
            },
            "scope": 149,
            "src": "3542:49:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "functionSelector": "8e6350e2",
            "id": 103,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "delegatedAssets",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 99,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3621:2:5"
            },
            "returnParameters": {
              "id": 102,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 101,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 103,
                  "src": "3655:7:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 100,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3655:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3654:9:5"
            },
            "scope": 149,
            "src": "3597:67:5",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "functionSelector": "06fdde03",
            "id": 108,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "name",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 104,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3683:2:5"
            },
            "returnParameters": {
              "id": 107,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 106,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 108,
                  "src": "3709:13:5",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 105,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3709:6:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3708:15:5"
            },
            "scope": 149,
            "src": "3670:54:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "functionSelector": "fbfa77cf",
            "id": 113,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "vault",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 109,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3744:2:5"
            },
            "returnParameters": {
              "id": 112,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 111,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 113,
                  "src": "3770:7:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 110,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3770:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3769:9:5"
            },
            "scope": 149,
            "src": "3730:49:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "functionSelector": "aced1661",
            "id": 118,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "keeper",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 114,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3800:2:5"
            },
            "returnParameters": {
              "id": 117,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 116,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 118,
                  "src": "3826:7:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 115,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3826:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3825:9:5"
            },
            "scope": 149,
            "src": "3785:50:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "functionSelector": "650d1880",
            "id": 125,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "tendTrigger",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 121,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 120,
                  "mutability": "mutable",
                  "name": "callCost",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 125,
                  "src": "3862:16:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 119,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3862:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3861:18:5"
            },
            "returnParameters": {
              "id": 124,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 123,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 125,
                  "src": "3903:4:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 122,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3903:4:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3902:6:5"
            },
            "scope": 149,
            "src": "3841:68:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "functionSelector": "440368a3",
            "id": 128,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "tend",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 126,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3928:2:5"
            },
            "returnParameters": {
              "id": 127,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3939:0:5"
            },
            "scope": 149,
            "src": "3915:25:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "functionSelector": "ed882c2b",
            "id": 135,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "harvestTrigger",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 131,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 130,
                  "mutability": "mutable",
                  "name": "callCost",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 135,
                  "src": "3970:16:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 129,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3970:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3969:18:5"
            },
            "returnParameters": {
              "id": 134,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 133,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 135,
                  "src": "4011:4:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 132,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4011:4:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4010:6:5"
            },
            "scope": 149,
            "src": "3946:71:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": null,
            "functionSelector": "4641257d",
            "id": 138,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "harvest",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 136,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4039:2:5"
            },
            "returnParameters": {
              "id": 137,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4050:0:5"
            },
            "scope": 149,
            "src": "4023:28:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 148,
            "name": "Harvested",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 147,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 140,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "profit",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 148,
                  "src": "4073:14:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 139,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4073:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 142,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "loss",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 148,
                  "src": "4089:12:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 141,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4089:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 144,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "debtPayment",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 148,
                  "src": "4103:19:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 143,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4103:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 146,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "debtOutstanding",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 148,
                  "src": "4124:23:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 145,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4124:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4072:76:5"
            },
            "src": "4057:92:5"
          }
        ],
        "scope": 952,
        "src": "3448:703:5"
      },
      {
        "abstract": true,
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 150,
          "nodeType": "StructuredDocumentation",
          "src": "4153:782:5",
          "text": " @title Yearn Base Strategy\n @author yearn.finance\n @notice\n  BaseStrategy implements all of the required functionality to interoperate\n  closely with the Vault contract. This contract should be inherited and the\n  abstract methods implemented to adapt the Strategy to the particular needs\n  it has to create a return.\n  Of special interest is the relationship between `harvest()` and\n  `vault.report()'. `harvest()` may be called simply because enough time has\n  elapsed since the last report, and not because any funds need to be moved\n  or positions adjusted. This is critical so that the Vault may maintain an\n  accurate picture of the Strategy's performance. See  `vault.report()`,\n  `harvest()`, and `harvestTrigger()` for further details."
        },
        "fullyImplemented": false,
        "id": 951,
        "linearizedBaseContracts": [
          951
        ],
        "name": "BaseStrategy",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 153,
            "libraryName": {
              "contractScope": null,
              "id": 151,
              "name": "SafeMath",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1489,
              "src": "4979:8:5",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMath_$1489",
                "typeString": "library SafeMath"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "4973:27:5",
            "typeName": {
              "id": 152,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "4992:7:5",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "body": {
              "id": 161,
              "nodeType": "Block",
              "src": "5333:31:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "302e322e32",
                    "id": 159,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5350:7:5",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_aaa3f7e061b654435f127477dc8428337d0ff23e707c95bb37d1fa43b0f2f7e4",
                      "typeString": "literal_string \"0.2.2\""
                    },
                    "value": "0.2.2"
                  },
                  "functionReturnParameters": 158,
                  "id": 160,
                  "nodeType": "Return",
                  "src": "5343:14:5"
                }
              ]
            },
            "documentation": {
              "id": 154,
              "nodeType": "StructuredDocumentation",
              "src": "5006:264:5",
              "text": " @notice\n  Used to track which version of `StrategyAPI` this Strategy\n  implements.\n @dev The Strategy's version must match the Vault's `API_VERSION`.\n @return A string which holds the current API version of this contract."
            },
            "functionSelector": "25829410",
            "id": 162,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "apiVersion",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 155,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5294:2:5"
            },
            "returnParameters": {
              "id": 158,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 157,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 162,
                  "src": "5318:13:5",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 156,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "5318:6:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5317:15:5"
            },
            "scope": 951,
            "src": "5275:89:5",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": null,
            "documentation": {
              "id": 163,
              "nodeType": "StructuredDocumentation",
              "src": "5370:289:5",
              "text": " @notice This Strategy's name.\n @dev\n  You can use this field to manage the \"version\" of this Strategy, e.g.\n  `StrategySomethingOrOtherV1`. However, \"API Version\" is managed by\n  `apiVersion()` function above.\n @return This Strategy's name."
            },
            "functionSelector": "06fdde03",
            "id": 168,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "name",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 164,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5677:2:5"
            },
            "returnParameters": {
              "id": 167,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 166,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 168,
                  "src": "5711:13:5",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 165,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "5711:6:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5710:15:5"
            },
            "scope": 951,
            "src": "5664:62:5",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "external"
          },
          {
            "body": {
              "id": 176,
              "nodeType": "Block",
              "src": "6545:25:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "30",
                    "id": 174,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "6562:1:5",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "functionReturnParameters": 173,
                  "id": 175,
                  "nodeType": "Return",
                  "src": "6555:8:5"
                }
              ]
            },
            "documentation": {
              "id": 169,
              "nodeType": "StructuredDocumentation",
              "src": "5732:741:5",
              "text": " @notice\n  The amount (priced in want) of the total assets managed by this strategy should not count\n  towards Yearn's TVL calculations.\n @dev\n  You can override this field to set it to a non-zero value if some of the assets of this\n  Strategy is somehow delegated inside another part of of Yearn's ecosystem e.g. another Vault.\n  Note that this value must be strictly less than or equal to the amount provided by\n  `estimatedTotalAssets()` below, as the TVL calc will be total assets minus delegated assets.\n @return\n  The amount of assets this strategy manages that should not be included in Yearn's Total Value\n  Locked (TVL) calculation across it's ecosystem."
            },
            "functionSelector": "8e6350e2",
            "id": 177,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "delegatedAssets",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 170,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6502:2:5"
            },
            "returnParameters": {
              "id": 173,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 172,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 177,
                  "src": "6536:7:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 171,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6536:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6535:9:5"
            },
            "scope": 951,
            "src": "6478:92:5",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "external"
          },
          {
            "constant": false,
            "functionSelector": "fbfa77cf",
            "id": 179,
            "mutability": "mutable",
            "name": "vault",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 951,
            "src": "6576:21:5",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_VaultAPI_$87",
              "typeString": "contract VaultAPI"
            },
            "typeName": {
              "contractScope": null,
              "id": 178,
              "name": "VaultAPI",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 87,
              "src": "6576:8:5",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_VaultAPI_$87",
                "typeString": "contract VaultAPI"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "1fe4a686",
            "id": 181,
            "mutability": "mutable",
            "name": "strategist",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 951,
            "src": "6603:25:5",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 180,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "6603:7:5",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "9ec5a894",
            "id": 183,
            "mutability": "mutable",
            "name": "rewards",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 951,
            "src": "6634:22:5",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 182,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "6634:7:5",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "aced1661",
            "id": 185,
            "mutability": "mutable",
            "name": "keeper",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 951,
            "src": "6662:21:5",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 184,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "6662:7:5",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "1f1fcd51",
            "id": 187,
            "mutability": "mutable",
            "name": "want",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 951,
            "src": "6690:18:5",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$1567",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 186,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1567,
              "src": "6690:6:5",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$1567",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 197,
            "name": "Harvested",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 196,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 189,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "profit",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 197,
                  "src": "6773:14:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 188,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6773:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 191,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "loss",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 197,
                  "src": "6789:12:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 190,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6789:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 193,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "debtPayment",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 197,
                  "src": "6803:19:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 192,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6803:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 195,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "debtOutstanding",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 197,
                  "src": "6824:23:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 194,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6824:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6772:76:5"
            },
            "src": "6757:92:5"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 201,
            "name": "UpdatedStrategist",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 200,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 199,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "newStrategist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 201,
                  "src": "6879:21:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 198,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6879:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6878:23:5"
            },
            "src": "6855:47:5"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 205,
            "name": "UpdatedKeeper",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 204,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 203,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "newKeeper",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 205,
                  "src": "6928:17:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 202,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6928:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6927:19:5"
            },
            "src": "6908:39:5"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 209,
            "name": "UpdatedRewards",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 208,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 207,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "rewards",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 209,
                  "src": "6974:15:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 206,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6974:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6973:17:5"
            },
            "src": "6953:38:5"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 213,
            "name": "UpdatedReportDelay",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 212,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 211,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "delay",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 213,
                  "src": "7022:13:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 210,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7022:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7021:15:5"
            },
            "src": "6997:40:5"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 217,
            "name": "UpdatedProfitFactor",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 216,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 215,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "profitFactor",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 217,
                  "src": "7069:20:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 214,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7069:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7068:22:5"
            },
            "src": "7043:48:5"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 221,
            "name": "UpdatedDebtThreshold",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 220,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 219,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "debtThreshold",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 221,
                  "src": "7124:21:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 218,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "7124:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7123:23:5"
            },
            "src": "7097:50:5"
          },
          {
            "constant": false,
            "functionSelector": "95e80c50",
            "id": 224,
            "mutability": "mutable",
            "name": "minReportDelay",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 951,
            "src": "7264:37:5",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 222,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "7264:7:5",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "3836343030",
              "id": 223,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "7296:5:5",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_86400_by_1",
                "typeString": "int_const 86400"
              },
              "value": "86400"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "8cdfe166",
            "id": 227,
            "mutability": "mutable",
            "name": "profitFactor",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 951,
            "src": "7470:33:5",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 225,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "7470:7:5",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "313030",
              "id": 226,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "7500:3:5",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_100_by_1",
                "typeString": "int_const 100"
              },
              "value": "100"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "1d12f28b",
            "id": 230,
            "mutability": "mutable",
            "name": "debtThreshold",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 951,
            "src": "7650:32:5",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 228,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "7650:7:5",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 229,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "7681:1:5",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "5641ec03",
            "id": 232,
            "mutability": "mutable",
            "name": "emergencyExit",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 951,
            "src": "7730:25:5",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bool",
              "typeString": "bool"
            },
            "typeName": {
              "id": 231,
              "name": "bool",
              "nodeType": "ElementaryTypeName",
              "src": "7730:4:5",
              "typeDescriptions": {
                "typeIdentifier": "t_bool",
                "typeString": "bool"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 249,
              "nodeType": "Block",
              "src": "7805:106:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 244,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 238,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 235,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "7823:3:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 236,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "7823:10:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 237,
                            "name": "strategist",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 181,
                            "src": "7837:10:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "7823:24:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 243,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 239,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "7851:3:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 240,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "7851:10:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 241,
                              "name": "governance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 458,
                              "src": "7865:10:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                "typeString": "function () view returns (address)"
                              }
                            },
                            "id": 242,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7865:12:5",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "7851:26:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "7823:54:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "21617574686f72697a6564",
                        "id": 245,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "7879:13:5",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_d7031b85265729c6983ea6d4e363a4efb2dd08bdad971b2517bc786f89231cb6",
                          "typeString": "literal_string \"!authorized\""
                        },
                        "value": "!authorized"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_d7031b85265729c6983ea6d4e363a4efb2dd08bdad971b2517bc786f89231cb6",
                          "typeString": "literal_string \"!authorized\""
                        }
                      ],
                      "id": 234,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "7815:7:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 246,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7815:78:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 247,
                  "nodeType": "ExpressionStatement",
                  "src": "7815:78:5"
                },
                {
                  "id": 248,
                  "nodeType": "PlaceholderStatement",
                  "src": "7903:1:5"
                }
              ]
            },
            "documentation": null,
            "id": 250,
            "name": "onlyAuthorized",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 233,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7802:2:5"
            },
            "src": "7779:132:5",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 261,
              "nodeType": "Block",
              "src": "7943:76:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 256,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 253,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "7961:3:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 254,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "7961:10:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 255,
                          "name": "strategist",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 181,
                          "src": "7975:10:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "7961:24:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "2173747261746567697374",
                        "id": 257,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "7987:13:5",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_166167a50e551d298f1db532f5b4f3e4b7ab1f87237055c55cba3762afb58fbd",
                          "typeString": "literal_string \"!strategist\""
                        },
                        "value": "!strategist"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_166167a50e551d298f1db532f5b4f3e4b7ab1f87237055c55cba3762afb58fbd",
                          "typeString": "literal_string \"!strategist\""
                        }
                      ],
                      "id": 252,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "7953:7:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 258,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7953:48:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 259,
                  "nodeType": "ExpressionStatement",
                  "src": "7953:48:5"
                },
                {
                  "id": 260,
                  "nodeType": "PlaceholderStatement",
                  "src": "8011:1:5"
                }
              ]
            },
            "documentation": null,
            "id": 262,
            "name": "onlyStrategist",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 251,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7940:2:5"
            },
            "src": "7917:102:5",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 274,
              "nodeType": "Block",
              "src": "8051:78:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 269,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 265,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "8069:3:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 266,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "8069:10:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 267,
                            "name": "governance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 458,
                            "src": "8083:10:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                              "typeString": "function () view returns (address)"
                            }
                          },
                          "id": 268,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8083:12:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "8069:26:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "21617574686f72697a6564",
                        "id": 270,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8097:13:5",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_d7031b85265729c6983ea6d4e363a4efb2dd08bdad971b2517bc786f89231cb6",
                          "typeString": "literal_string \"!authorized\""
                        },
                        "value": "!authorized"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_d7031b85265729c6983ea6d4e363a4efb2dd08bdad971b2517bc786f89231cb6",
                          "typeString": "literal_string \"!authorized\""
                        }
                      ],
                      "id": 264,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "8061:7:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 271,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8061:50:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 272,
                  "nodeType": "ExpressionStatement",
                  "src": "8061:50:5"
                },
                {
                  "id": 273,
                  "nodeType": "PlaceholderStatement",
                  "src": "8121:1:5"
                }
              ]
            },
            "documentation": null,
            "id": 275,
            "name": "onlyGovernance",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 263,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8048:2:5"
            },
            "src": "8025:104:5",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 297,
              "nodeType": "Block",
              "src": "8158:130:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 292,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 286,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 281,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 278,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "8176:3:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 279,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "8176:10:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 280,
                              "name": "keeper",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 185,
                              "src": "8190:6:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "src": "8176:20:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "||",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 285,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 282,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "8200:3:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 283,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "8200:10:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 284,
                              "name": "strategist",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 181,
                              "src": "8214:10:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "src": "8200:24:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "8176:48:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 291,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 287,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "8228:3:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 288,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "8228:10:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 289,
                              "name": "governance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 458,
                              "src": "8242:10:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                "typeString": "function () view returns (address)"
                              }
                            },
                            "id": 290,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8242:12:5",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "8228:26:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "8176:78:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "21617574686f72697a6564",
                        "id": 293,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8256:13:5",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_d7031b85265729c6983ea6d4e363a4efb2dd08bdad971b2517bc786f89231cb6",
                          "typeString": "literal_string \"!authorized\""
                        },
                        "value": "!authorized"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_d7031b85265729c6983ea6d4e363a4efb2dd08bdad971b2517bc786f89231cb6",
                          "typeString": "literal_string \"!authorized\""
                        }
                      ],
                      "id": 277,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "8168:7:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 294,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8168:102:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 295,
                  "nodeType": "ExpressionStatement",
                  "src": "8168:102:5"
                },
                {
                  "id": 296,
                  "nodeType": "PlaceholderStatement",
                  "src": "8280:1:5"
                }
              ]
            },
            "documentation": null,
            "id": 298,
            "name": "onlyKeepers",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 276,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8155:2:5"
            },
            "src": "8135:153:5",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 344,
              "nodeType": "Block",
              "src": "8586:262:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 308,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 304,
                      "name": "vault",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 179,
                      "src": "8596:5:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_VaultAPI_$87",
                        "typeString": "contract VaultAPI"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 306,
                          "name": "_vault",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 301,
                          "src": "8613:6:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 305,
                        "name": "VaultAPI",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 87,
                        "src": "8604:8:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_VaultAPI_$87_$",
                          "typeString": "type(contract VaultAPI)"
                        }
                      },
                      "id": 307,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "8604:16:5",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_VaultAPI_$87",
                        "typeString": "contract VaultAPI"
                      }
                    },
                    "src": "8596:24:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_VaultAPI_$87",
                      "typeString": "contract VaultAPI"
                    }
                  },
                  "id": 309,
                  "nodeType": "ExpressionStatement",
                  "src": "8596:24:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 316,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 310,
                      "name": "want",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 187,
                      "src": "8630:4:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$1567",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 312,
                              "name": "vault",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 179,
                              "src": "8644:5:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_VaultAPI_$87",
                                "typeString": "contract VaultAPI"
                              }
                            },
                            "id": 313,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "token",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 33,
                            "src": "8644:11:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                              "typeString": "function () view external returns (address)"
                            }
                          },
                          "id": 314,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8644:13:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 311,
                        "name": "IERC20",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1567,
                        "src": "8637:6:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_IERC20_$1567_$",
                          "typeString": "type(contract IERC20)"
                        }
                      },
                      "id": 315,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "8637:21:5",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$1567",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "8630:28:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$1567",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 317,
                  "nodeType": "ExpressionStatement",
                  "src": "8630:28:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 321,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 301,
                        "src": "8681:6:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 325,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "-",
                            "prefix": true,
                            "src": "8697:2:5",
                            "subExpression": {
                              "argumentTypes": null,
                              "hexValue": "31",
                              "id": 324,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8698:1:5",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1_by_1",
                                "typeString": "int_const 1"
                              },
                              "value": "1"
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_minus_1_by_1",
                              "typeString": "int_const -1"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_minus_1_by_1",
                              "typeString": "int_const -1"
                            }
                          ],
                          "id": 323,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "8689:7:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_uint256_$",
                            "typeString": "type(uint256)"
                          },
                          "typeName": {
                            "id": 322,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "8689:7:5",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 326,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8689:11:5",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 318,
                        "name": "want",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 187,
                        "src": "8668:4:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1567",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 320,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "approve",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1536,
                      "src": "8668:12:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 327,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8668:33:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 328,
                  "nodeType": "ExpressionStatement",
                  "src": "8668:33:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 332,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 329,
                      "name": "strategist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 181,
                      "src": "8759:10:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 330,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "8772:3:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 331,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "8772:10:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "8759:23:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 333,
                  "nodeType": "ExpressionStatement",
                  "src": "8759:23:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 337,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 334,
                      "name": "rewards",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 183,
                      "src": "8792:7:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 335,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "8802:3:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 336,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "8802:10:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "8792:20:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 338,
                  "nodeType": "ExpressionStatement",
                  "src": "8792:20:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 342,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 339,
                      "name": "keeper",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 185,
                      "src": "8822:6:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 340,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "8831:3:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 341,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "8831:10:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "8822:19:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 343,
                  "nodeType": "ExpressionStatement",
                  "src": "8822:19:5"
                }
              ]
            },
            "documentation": {
              "id": 299,
              "nodeType": "StructuredDocumentation",
              "src": "8294:252:5",
              "text": " @notice\n  Initializes the Strategy, this is called only once, when the\n  contract is deployed.\n @dev `_vault` should implement `VaultAPI`.\n @param _vault The address of the Vault responsible for this Strategy."
            },
            "id": 345,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 302,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 301,
                  "mutability": "mutable",
                  "name": "_vault",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 345,
                  "src": "8563:14:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 300,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8563:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8562:16:5"
            },
            "returnParameters": {
              "id": 303,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8586:0:5"
            },
            "scope": 951,
            "src": "8551:297:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 361,
              "nodeType": "Block",
              "src": "9140:86:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 355,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 353,
                      "name": "strategist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 181,
                      "src": "9150:10:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 354,
                      "name": "_strategist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 348,
                      "src": "9163:11:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "9150:24:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 356,
                  "nodeType": "ExpressionStatement",
                  "src": "9150:24:5"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 358,
                        "name": "_strategist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 348,
                        "src": "9207:11:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 357,
                      "name": "UpdatedStrategist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 201,
                      "src": "9189:17:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 359,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9189:30:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 360,
                  "nodeType": "EmitStatement",
                  "src": "9184:35:5"
                }
              ]
            },
            "documentation": {
              "id": 346,
              "nodeType": "StructuredDocumentation",
              "src": "8854:213:5",
              "text": " @notice\n  Used to change `strategist`.\n  This may only be called by governance or the existing strategist.\n @param _strategist The new address to assign as `strategist`."
            },
            "functionSelector": "c7b9d530",
            "id": 362,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 351,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 350,
                  "name": "onlyAuthorized",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 250,
                  "src": "9125:14:5",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "9125:14:5"
              }
            ],
            "name": "setStrategist",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 349,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 348,
                  "mutability": "mutable",
                  "name": "_strategist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 362,
                  "src": "9095:19:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 347,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9095:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9094:21:5"
            },
            "returnParameters": {
              "id": 352,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9140:0:5"
            },
            "scope": 951,
            "src": "9072:154:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 378,
              "nodeType": "Block",
              "src": "9825:70:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 372,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 370,
                      "name": "keeper",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 185,
                      "src": "9835:6:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 371,
                      "name": "_keeper",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 365,
                      "src": "9844:7:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "9835:16:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 373,
                  "nodeType": "ExpressionStatement",
                  "src": "9835:16:5"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 375,
                        "name": "_keeper",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 365,
                        "src": "9880:7:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 374,
                      "name": "UpdatedKeeper",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 205,
                      "src": "9866:13:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 376,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9866:22:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 377,
                  "nodeType": "EmitStatement",
                  "src": "9861:27:5"
                }
              ]
            },
            "documentation": {
              "id": 363,
              "nodeType": "StructuredDocumentation",
              "src": "9232:528:5",
              "text": " @notice\n  Used to change `keeper`.\n  `keeper` is the only address that may call `tend()` or `harvest()`,\n  other than `governance()` or `strategist`. However, unlike\n  `governance()` or `strategist`, `keeper` may *only* call `tend()`\n  and `harvest()`, and no other authorized functions, following the\n  principle of least privilege.\n  This may only be called by governance or the strategist.\n @param _keeper The new address to assign as `keeper`."
            },
            "functionSelector": "748747e6",
            "id": 379,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 368,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 367,
                  "name": "onlyAuthorized",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 250,
                  "src": "9810:14:5",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "9810:14:5"
              }
            ],
            "name": "setKeeper",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 366,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 365,
                  "mutability": "mutable",
                  "name": "_keeper",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 379,
                  "src": "9784:15:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 364,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9784:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9783:17:5"
            },
            "returnParameters": {
              "id": 369,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9825:0:5"
            },
            "scope": 951,
            "src": "9765:130:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 395,
              "nodeType": "Block",
              "src": "10430:74:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 389,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 387,
                      "name": "rewards",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 183,
                      "src": "10440:7:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 388,
                      "name": "_rewards",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 382,
                      "src": "10450:8:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "10440:18:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 390,
                  "nodeType": "ExpressionStatement",
                  "src": "10440:18:5"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 392,
                        "name": "_rewards",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 382,
                        "src": "10488:8:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 391,
                      "name": "UpdatedRewards",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 209,
                      "src": "10473:14:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 393,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10473:24:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 394,
                  "nodeType": "EmitStatement",
                  "src": "10468:29:5"
                }
              ]
            },
            "documentation": {
              "id": 380,
              "nodeType": "StructuredDocumentation",
              "src": "9901:462:5",
              "text": " @notice\n  Used to change `rewards`. Any distributed rewards will cease flowing\n  to the old address and begin flowing to this address once the change\n  is in effect.\n  This will not change any Strategy reports in progress, only\n  new reports made after this change goes into effect.\n  This may only be called by the strategist.\n @param _rewards The address to use for collecting rewards."
            },
            "functionSelector": "ec38a862",
            "id": 396,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 385,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 384,
                  "name": "onlyStrategist",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 262,
                  "src": "10415:14:5",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "10415:14:5"
              }
            ],
            "name": "setRewards",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 383,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 382,
                  "mutability": "mutable",
                  "name": "_rewards",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 396,
                  "src": "10388:16:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 381,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10388:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "10387:18:5"
            },
            "returnParameters": {
              "id": 386,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10430:0:5"
            },
            "scope": 951,
            "src": "10368:136:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 412,
              "nodeType": "Block",
              "src": "11093:81:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 406,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 404,
                      "name": "minReportDelay",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 224,
                      "src": "11103:14:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 405,
                      "name": "_delay",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 399,
                      "src": "11120:6:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "11103:23:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 407,
                  "nodeType": "ExpressionStatement",
                  "src": "11103:23:5"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 409,
                        "name": "_delay",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 399,
                        "src": "11160:6:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 408,
                      "name": "UpdatedReportDelay",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 213,
                      "src": "11141:18:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 410,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11141:26:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 411,
                  "nodeType": "EmitStatement",
                  "src": "11136:31:5"
                }
              ]
            },
            "documentation": {
              "id": 397,
              "nodeType": "StructuredDocumentation",
              "src": "10510:511:5",
              "text": " @notice\n  Used to change `minReportDelay`. `minReportDelay` is the minimum number\n  of blocks that should pass before `harvest()` is called.\n  For external keepers (such as the Keep3r network), this is the minimum\n  time between jobs, to prevent excessive costs. (see `harvestTrigger()`\n  for more details.)\n  This may only be called by governance or the strategist.\n @param _delay The minimum number of blocks to wait between harvests."
            },
            "functionSelector": "39a172a8",
            "id": 413,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 402,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 401,
                  "name": "onlyAuthorized",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 250,
                  "src": "11078:14:5",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "11078:14:5"
              }
            ],
            "name": "setMinReportDelay",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 400,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 399,
                  "mutability": "mutable",
                  "name": "_delay",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 413,
                  "src": "11053:14:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 398,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "11053:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11052:16:5"
            },
            "returnParameters": {
              "id": 403,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11093:0:5"
            },
            "scope": 951,
            "src": "11026:148:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 429,
              "nodeType": "Block",
              "src": "11634:94:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 423,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 421,
                      "name": "profitFactor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 227,
                      "src": "11644:12:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 422,
                      "name": "_profitFactor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 416,
                      "src": "11659:13:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "11644:28:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 424,
                  "nodeType": "ExpressionStatement",
                  "src": "11644:28:5"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 426,
                        "name": "_profitFactor",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 416,
                        "src": "11707:13:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 425,
                      "name": "UpdatedProfitFactor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 217,
                      "src": "11687:19:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 427,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11687:34:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 428,
                  "nodeType": "EmitStatement",
                  "src": "11682:39:5"
                }
              ]
            },
            "documentation": {
              "id": 414,
              "nodeType": "StructuredDocumentation",
              "src": "11180:377:5",
              "text": " @notice\n  Used to change `profitFactor`. `profitFactor` is used to determine\n  if it's worthwhile to harvest, given gas costs. (See `harvestTrigger()`\n  for more details.)\n  This may only be called by governance or the strategist.\n @param _profitFactor A ratio to multiply anticipated\n `harvest()` gas cost against."
            },
            "functionSelector": "91397ab4",
            "id": 430,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 419,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 418,
                  "name": "onlyAuthorized",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 250,
                  "src": "11619:14:5",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "11619:14:5"
              }
            ],
            "name": "setProfitFactor",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 417,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 416,
                  "mutability": "mutable",
                  "name": "_profitFactor",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 430,
                  "src": "11587:21:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 415,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "11587:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11586:23:5"
            },
            "returnParameters": {
              "id": 420,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11634:0:5"
            },
            "scope": 951,
            "src": "11562:166:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 446,
              "nodeType": "Block",
              "src": "12344:98:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 440,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 438,
                      "name": "debtThreshold",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 230,
                      "src": "12354:13:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 439,
                      "name": "_debtThreshold",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 433,
                      "src": "12370:14:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "12354:30:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 441,
                  "nodeType": "ExpressionStatement",
                  "src": "12354:30:5"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 443,
                        "name": "_debtThreshold",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 433,
                        "src": "12420:14:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 442,
                      "name": "UpdatedDebtThreshold",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 221,
                      "src": "12399:20:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 444,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12399:36:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 445,
                  "nodeType": "EmitStatement",
                  "src": "12394:41:5"
                }
              ]
            },
            "documentation": {
              "id": 431,
              "nodeType": "StructuredDocumentation",
              "src": "11734:531:5",
              "text": " @notice\n  Sets how far the Strategy can go into loss without a harvest and report\n  being required.\n  By default this is 0, meaning any losses would cause a harvest which\n  will subsequently report the loss to the Vault for tracking. (See\n  `harvestTrigger()` for more details.)\n  This may only be called by governance or the strategist.\n @param _debtThreshold How big of a loss this Strategy may carry without\n being required to report to the Vault."
            },
            "functionSelector": "0f969b87",
            "id": 447,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 436,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 435,
                  "name": "onlyAuthorized",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 250,
                  "src": "12329:14:5",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "12329:14:5"
              }
            ],
            "name": "setDebtThreshold",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 434,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 433,
                  "mutability": "mutable",
                  "name": "_debtThreshold",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 447,
                  "src": "12296:22:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 432,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12296:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "12295:24:5"
            },
            "returnParameters": {
              "id": 437,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12344:0:5"
            },
            "scope": 951,
            "src": "12270:172:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 457,
              "nodeType": "Block",
              "src": "12644:42:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 453,
                        "name": "vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 179,
                        "src": "12661:5:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_VaultAPI_$87",
                          "typeString": "contract VaultAPI"
                        }
                      },
                      "id": 454,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "governance",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 86,
                      "src": "12661:16:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                        "typeString": "function () view external returns (address)"
                      }
                    },
                    "id": 455,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12661:18:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 452,
                  "id": 456,
                  "nodeType": "Return",
                  "src": "12654:25:5"
                }
              ]
            },
            "documentation": {
              "id": 448,
              "nodeType": "StructuredDocumentation",
              "src": "12448:137:5",
              "text": " Resolve governance address from Vault contract, used to make assertions\n on protected functions in the Strategy."
            },
            "id": 458,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "governance",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 449,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12609:2:5"
            },
            "returnParameters": {
              "id": 452,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 451,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 458,
                  "src": "12635:7:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 450,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12635:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "12634:9:5"
            },
            "scope": 951,
            "src": "12590:96:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": null,
            "documentation": {
              "id": 459,
              "nodeType": "StructuredDocumentation",
              "src": "12692:1249:5",
              "text": " @notice\n  Provide an accurate estimate for the total amount of assets\n  (principle + return) that this Strategy is currently managing,\n  denominated in terms of `want` tokens.\n  This total should be \"realizable\" e.g. the total value that could\n  *actually* be obtained from this Strategy if it were to divest its\n  entire position based on current on-chain conditions.\n @dev\n  Care must be taken in using this function, since it relies on external\n  systems, which could be manipulated by the attacker to give an inflated\n  (or reduced) value produced by this function, based on current on-chain\n  conditions (e.g. this function is possible to influence through\n  flashloan attacks, oracle manipulations, or other DeFi attack\n  mechanisms).\n  It is up to governance to use this function to correctly order this\n  Strategy relative to its peers in the withdrawal queue to minimize\n  losses for the Vault based on sudden withdrawals. This value should be\n  higher than the total debt of the Strategy and higher than its expected\n  value to be \"safe\".\n @return The estimated total assets in this Strategy."
            },
            "functionSelector": "efbb5cb0",
            "id": 464,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "estimatedTotalAssets",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 460,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "13975:2:5"
            },
            "returnParameters": {
              "id": 463,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 462,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 464,
                  "src": "14007:7:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 461,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "14007:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "14006:9:5"
            },
            "scope": 951,
            "src": "13946:70:5",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": {
              "id": 485,
              "nodeType": "Block",
              "src": "14469:99:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 483,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 478,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 473,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "14511:4:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_BaseStrategy_$951",
                                    "typeString": "contract BaseStrategy"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_BaseStrategy_$951",
                                    "typeString": "contract BaseStrategy"
                                  }
                                ],
                                "id": 472,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "14503:7:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 471,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "14503:7:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 474,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14503:13:5",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 469,
                              "name": "vault",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 179,
                              "src": "14486:5:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_VaultAPI_$87",
                                "typeString": "contract VaultAPI"
                              }
                            },
                            "id": 470,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "strategies",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 40,
                            "src": "14486:16:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_struct$_StrategyParams_$21_memory_ptr_$",
                              "typeString": "function (address) view external returns (struct StrategyParams memory)"
                            }
                          },
                          "id": 475,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14486:31:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_StrategyParams_$21_memory_ptr",
                            "typeString": "struct StrategyParams memory"
                          }
                        },
                        "id": 476,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "debtLimit",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 10,
                        "src": "14486:41:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": ">",
                      "rightExpression": {
                        "argumentTypes": null,
                        "hexValue": "30",
                        "id": 477,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "14530:1:5",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_0_by_1",
                          "typeString": "int_const 0"
                        },
                        "value": "0"
                      },
                      "src": "14486:45:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "||",
                    "rightExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 482,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 479,
                          "name": "estimatedTotalAssets",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 464,
                          "src": "14535:20:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                            "typeString": "function () view returns (uint256)"
                          }
                        },
                        "id": 480,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "14535:22:5",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": ">",
                      "rightExpression": {
                        "argumentTypes": null,
                        "hexValue": "30",
                        "id": 481,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "14560:1:5",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_0_by_1",
                          "typeString": "int_const 0"
                        },
                        "value": "0"
                      },
                      "src": "14535:26:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "14486:75:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 468,
                  "id": 484,
                  "nodeType": "Return",
                  "src": "14479:82:5"
                }
              ]
            },
            "documentation": null,
            "functionSelector": "22f3e2d4",
            "id": 486,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isActive",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 465,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "14439:2:5"
            },
            "returnParameters": {
              "id": 468,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 467,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 486,
                  "src": "14463:4:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 466,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "14463:4:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "14462:6:5"
            },
            "scope": 951,
            "src": "14422:146:5",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": null,
            "documentation": {
              "id": 487,
              "nodeType": "StructuredDocumentation",
              "src": "14574:1305:5",
              "text": " Perform any Strategy unwinding or other calls necessary to capture the\n \"free return\" this Strategy has generated since the last time its core\n position(s) were adjusted. Examples include unwrapping extra rewards.\n This call is only used during \"normal operation\" of a Strategy, and\n should be optimized to minimize losses as much as possible.\n This method returns any realized profits and/or realized losses\n incurred, and should return the total amounts of profits/losses/debt\n payments (in `want` tokens) for the Vault's accounting (e.g.\n `want.balanceOf(this) >= _debtPayment + _profit - _loss`).\n `_debtOutstanding` will be 0 if the Strategy is not past the configured\n debt limit, otherwise its value will be how far past the debt limit\n the Strategy is. The Strategy's debt limit is configured in the Vault.\n NOTE: `_debtPayment` should be less than or equal to `_debtOutstanding`.\n       It is okay for it to be less than `_debtOutstanding`, as that\n       should only used as a guide for how much is left to pay back.\n       Payments should be made to minimize loss from slippage, debt,\n       withdrawal fees, etc.\n See `vault.debtOutstanding()`."
            },
            "id": 498,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "prepareReturn",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 490,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 489,
                  "mutability": "mutable",
                  "name": "_debtOutstanding",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 498,
                  "src": "15907:24:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 488,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "15907:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15906:26:5"
            },
            "returnParameters": {
              "id": 497,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 492,
                  "mutability": "mutable",
                  "name": "_profit",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 498,
                  "src": "15996:15:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 491,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "15996:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 494,
                  "mutability": "mutable",
                  "name": "_loss",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 498,
                  "src": "16025:13:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 493,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "16025:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 496,
                  "mutability": "mutable",
                  "name": "_debtPayment",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 498,
                  "src": "16052:20:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 495,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "16052:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15982:100:5"
            },
            "scope": 951,
            "src": "15884:199:5",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": null,
            "documentation": {
              "id": 499,
              "nodeType": "StructuredDocumentation",
              "src": "16089:467:5",
              "text": " Perform any adjustments to the core position(s) of this Strategy given\n what change the Vault made in the \"investable capital\" available to the\n Strategy. Note that all \"free capital\" in the Strategy after the report\n was made is available for reinvestment. Also note that this number\n could be 0, and you should handle that scenario accordingly.\n See comments regarding `_debtOutstanding` on `prepareReturn()`."
            },
            "id": 504,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "adjustPosition",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 502,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 501,
                  "mutability": "mutable",
                  "name": "_debtOutstanding",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 504,
                  "src": "16585:24:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 500,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "16585:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "16584:26:5"
            },
            "returnParameters": {
              "id": 503,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "16627:0:5"
            },
            "scope": 951,
            "src": "16561:67:5",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": null,
            "documentation": {
              "id": 505,
              "nodeType": "StructuredDocumentation",
              "src": "16634:715:5",
              "text": " Liquidate up to `_amountNeeded` of `want` of this strategy's positions,\n irregardless of slippage. Any excess will be re-invested with `adjustPosition()`.\n This function should return the amount of `want` tokens made available by the\n liquidation. If there is a difference between them, `_loss` indicates whether the\n difference is due to a realized loss, or if there is some other sitution at play\n (e.g. locked funds). This function is used during emergency exit instead of\n `prepareReturn()` to liquidate all of the Strategy's positions back to the Vault.\n NOTE: The invariant `_amountFreed + _loss <= _amountNeeded` should always be maintained"
            },
            "id": 514,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "liquidatePosition",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 508,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 507,
                  "mutability": "mutable",
                  "name": "_amountNeeded",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 514,
                  "src": "17381:21:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 506,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17381:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "17380:23:5"
            },
            "returnParameters": {
              "id": 513,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 510,
                  "mutability": "mutable",
                  "name": "_liquidatedAmount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 514,
                  "src": "17430:25:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 509,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17430:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 512,
                  "mutability": "mutable",
                  "name": "_loss",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 514,
                  "src": "17457:13:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 511,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17457:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "17429:42:5"
            },
            "scope": 951,
            "src": "17354:118:5",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 540,
              "nodeType": "Block",
              "src": "17782:245:5",
              "statements": [
                {
                  "assignments": [
                    519
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 519,
                      "mutability": "mutable",
                      "name": "balance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 540,
                      "src": "17889:15:5",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 518,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "17889:7:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 527,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 524,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "17931:4:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_BaseStrategy_$951",
                              "typeString": "contract BaseStrategy"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_BaseStrategy_$951",
                              "typeString": "contract BaseStrategy"
                            }
                          ],
                          "id": 523,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "17923:7:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 522,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "17923:7:5",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 525,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "17923:13:5",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 520,
                        "name": "vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 179,
                        "src": "17907:5:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_VaultAPI_$87",
                          "typeString": "contract VaultAPI"
                        }
                      },
                      "id": 521,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "balanceOf",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1506,
                      "src": "17907:15:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) view external returns (uint256)"
                      }
                    },
                    "id": 526,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "17907:30:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "17889:48:5"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 530,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 528,
                      "name": "balance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 519,
                      "src": "17951:7:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 529,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "17961:1:5",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "17951:11:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 539,
                  "nodeType": "IfStatement",
                  "src": "17947:74:5",
                  "trueBody": {
                    "id": 538,
                    "nodeType": "Block",
                    "src": "17964:57:5",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 534,
                              "name": "rewards",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 183,
                              "src": "17993:7:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 535,
                              "name": "balance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 519,
                              "src": "18002:7:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 531,
                              "name": "vault",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 179,
                              "src": "17978:5:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_VaultAPI_$87",
                                "typeString": "contract VaultAPI"
                              }
                            },
                            "id": 533,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1516,
                            "src": "17978:14:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 536,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17978:32:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 537,
                        "nodeType": "ExpressionStatement",
                        "src": "17978:32:5"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 515,
              "nodeType": "StructuredDocumentation",
              "src": "17478:253:5",
              "text": "  `Harvest()` calls this function after shares are created during\n  `vault.report()`. You can customize this function to any share\n  distribution mechanism you want.\n   See `vault.report()` for further details."
            },
            "id": 541,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "distributeRewards",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 516,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17762:2:5"
            },
            "returnParameters": {
              "id": 517,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17782:0:5"
            },
            "scope": 951,
            "src": "17736:291:5",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 551,
              "nodeType": "Block",
              "src": "19037:207:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "66616c7365",
                    "id": 549,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "19232:5:5",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "false"
                  },
                  "functionReturnParameters": 548,
                  "id": 550,
                  "nodeType": "Return",
                  "src": "19225:12:5"
                }
              ]
            },
            "documentation": {
              "id": 542,
              "nodeType": "StructuredDocumentation",
              "src": "18033:925:5",
              "text": " @notice\n  Provide a signal to the keeper that `tend()` should be called. The\n  keeper will provide the estimated gas cost that they would pay to call\n  `tend()`, and this function should use that estimate to make a\n  determination if calling it is \"worth it\" for the keeper. This is not\n  the only consideration into issuing this trigger, for example if the\n  position would be negatively affected if `tend()` is not called\n  shortly, then this can return `true` even if the keeper might be\n  \"at a loss\" (keepers are always reimbursed by Yearn).\n @dev\n  `callCost` must be priced in terms of `want`.\n  This call and `harvestTrigger()` should never return `true` at the same\n  time.\n @param callCost The keeper's estimated cast cost to call `tend()`.\n @return `true` if `tend()` should be called, `false` otherwise."
            },
            "functionSelector": "650d1880",
            "id": 552,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "tendTrigger",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 545,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 544,
                  "mutability": "mutable",
                  "name": "callCost",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 552,
                  "src": "18984:16:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 543,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "18984:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "18983:18:5"
            },
            "returnParameters": {
              "id": 548,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 547,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 552,
                  "src": "19031:4:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 546,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "19031:4:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "19030:6:5"
            },
            "scope": 951,
            "src": "18963:281:5",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": {
              "id": 564,
              "nodeType": "Block",
              "src": "19599:130:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "expression": {
                            "argumentTypes": null,
                            "id": 559,
                            "name": "vault",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 179,
                            "src": "19698:5:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_VaultAPI_$87",
                              "typeString": "contract VaultAPI"
                            }
                          },
                          "id": 560,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "debtOutstanding",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 52,
                          "src": "19698:21:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                            "typeString": "function () view external returns (uint256)"
                          }
                        },
                        "id": 561,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "19698:23:5",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 558,
                      "name": "adjustPosition",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 504,
                      "src": "19683:14:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 562,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "19683:39:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 563,
                  "nodeType": "ExpressionStatement",
                  "src": "19683:39:5"
                }
              ]
            },
            "documentation": {
              "id": 553,
              "nodeType": "StructuredDocumentation",
              "src": "19250:307:5",
              "text": " @notice\n  Adjust the Strategy's position. The purpose of tending isn't to\n  realize gains, but to maximize yield by reinvesting any returns.\n  See comments on `adjustPosition()`.\n  This may only be called by governance, the strategist, or the keeper."
            },
            "functionSelector": "440368a3",
            "id": 565,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 556,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 555,
                  "name": "onlyKeepers",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 298,
                  "src": "19587:11:5",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "19587:11:5"
              }
            ],
            "name": "tend",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 554,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "19575:2:5"
            },
            "returnParameters": {
              "id": 557,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "19599:0:5"
            },
            "scope": 951,
            "src": "19562:167:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 662,
              "nodeType": "Block",
              "src": "21510:1258:5",
              "statements": [
                {
                  "assignments": [
                    574
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 574,
                      "mutability": "mutable",
                      "name": "params",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 662,
                      "src": "21520:28:5",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_StrategyParams_$21_memory_ptr",
                        "typeString": "struct StrategyParams"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 573,
                        "name": "StrategyParams",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 21,
                        "src": "21520:14:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_StrategyParams_$21_storage_ptr",
                          "typeString": "struct StrategyParams"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 582,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 579,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "21576:4:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_BaseStrategy_$951",
                              "typeString": "contract BaseStrategy"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_BaseStrategy_$951",
                              "typeString": "contract BaseStrategy"
                            }
                          ],
                          "id": 578,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "21568:7:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 577,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "21568:7:5",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 580,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "21568:13:5",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 575,
                        "name": "vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 179,
                        "src": "21551:5:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_VaultAPI_$87",
                          "typeString": "contract VaultAPI"
                        }
                      },
                      "id": 576,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "strategies",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 40,
                      "src": "21551:16:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_struct$_StrategyParams_$21_memory_ptr_$",
                        "typeString": "function (address) view external returns (struct StrategyParams memory)"
                      }
                    },
                    "id": 581,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "21551:31:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_StrategyParams_$21_memory_ptr",
                      "typeString": "struct StrategyParams memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "21520:62:5"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 586,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 583,
                        "name": "params",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 574,
                        "src": "21656:6:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_StrategyParams_$21_memory_ptr",
                          "typeString": "struct StrategyParams memory"
                        }
                      },
                      "id": 584,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "activation",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 8,
                      "src": "21656:17:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 585,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "21677:1:5",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "21656:22:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 589,
                  "nodeType": "IfStatement",
                  "src": "21652:40:5",
                  "trueBody": {
                    "expression": {
                      "argumentTypes": null,
                      "hexValue": "66616c7365",
                      "id": 587,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "21687:5:5",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "functionReturnParameters": 572,
                    "id": 588,
                    "nodeType": "Return",
                    "src": "21680:12:5"
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 597,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 593,
                            "name": "params",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 574,
                            "src": "21786:6:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_StrategyParams_$21_memory_ptr",
                              "typeString": "struct StrategyParams memory"
                            }
                          },
                          "id": 594,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "lastReport",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 14,
                          "src": "21786:17:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 590,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "21766:5:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 591,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "21766:15:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 592,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sub",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1339,
                        "src": "21766:19:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 595,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "21766:38:5",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 596,
                      "name": "minReportDelay",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 224,
                      "src": "21808:14:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "21766:56:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 600,
                  "nodeType": "IfStatement",
                  "src": "21762:73:5",
                  "trueBody": {
                    "expression": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 598,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "21831:4:5",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "functionReturnParameters": 572,
                    "id": 599,
                    "nodeType": "Return",
                    "src": "21824:11:5"
                  }
                },
                {
                  "assignments": [
                    602
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 602,
                      "mutability": "mutable",
                      "name": "outstanding",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 662,
                      "src": "22108:19:5",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 601,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "22108:7:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 606,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 603,
                        "name": "vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 179,
                        "src": "22130:5:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_VaultAPI_$87",
                          "typeString": "contract VaultAPI"
                        }
                      },
                      "id": 604,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "debtOutstanding",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 52,
                      "src": "22130:21:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                        "typeString": "function () view external returns (uint256)"
                      }
                    },
                    "id": 605,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "22130:23:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "22108:45:5"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 609,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 607,
                      "name": "outstanding",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 602,
                      "src": "22167:11:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 608,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "22181:1:5",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "22167:15:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 612,
                  "nodeType": "IfStatement",
                  "src": "22163:32:5",
                  "trueBody": {
                    "expression": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 610,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "22191:4:5",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "functionReturnParameters": 572,
                    "id": 611,
                    "nodeType": "Return",
                    "src": "22184:11:5"
                  }
                },
                {
                  "assignments": [
                    614
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 614,
                      "mutability": "mutable",
                      "name": "total",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 662,
                      "src": "22246:13:5",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 613,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "22246:7:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 617,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 615,
                      "name": "estimatedTotalAssets",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 464,
                      "src": "22262:20:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                        "typeString": "function () view returns (uint256)"
                      }
                    },
                    "id": 616,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "22262:22:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "22246:38:5"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 624,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 620,
                          "name": "debtThreshold",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 230,
                          "src": "22355:13:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 618,
                          "name": "total",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 614,
                          "src": "22345:5:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 619,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 1322,
                        "src": "22345:9:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 621,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "22345:24:5",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 622,
                        "name": "params",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 574,
                        "src": "22372:6:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_StrategyParams_$21_memory_ptr",
                          "typeString": "struct StrategyParams memory"
                        }
                      },
                      "id": 623,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "totalDebt",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 16,
                      "src": "22372:16:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "22345:43:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 627,
                  "nodeType": "IfStatement",
                  "src": "22341:60:5",
                  "trueBody": {
                    "expression": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 625,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "22397:4:5",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "functionReturnParameters": 572,
                    "id": 626,
                    "nodeType": "Return",
                    "src": "22390:11:5"
                  }
                },
                {
                  "assignments": [
                    629
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 629,
                      "mutability": "mutable",
                      "name": "profit",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 662,
                      "src": "22412:14:5",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 628,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "22412:7:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 631,
                  "initialValue": {
                    "argumentTypes": null,
                    "hexValue": "30",
                    "id": 630,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "22429:1:5",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "22412:18:5"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 635,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 632,
                      "name": "total",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 614,
                      "src": "22444:5:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 633,
                        "name": "params",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 574,
                        "src": "22452:6:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_StrategyParams_$21_memory_ptr",
                          "typeString": "struct StrategyParams memory"
                        }
                      },
                      "id": 634,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "totalDebt",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 16,
                      "src": "22452:16:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "22444:24:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 644,
                  "nodeType": "IfStatement",
                  "src": "22440:66:5",
                  "trueBody": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 642,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftHandSide": {
                        "argumentTypes": null,
                        "id": 636,
                        "name": "profit",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 629,
                        "src": "22470:6:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "Assignment",
                      "operator": "=",
                      "rightHandSide": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 639,
                              "name": "params",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 574,
                              "src": "22489:6:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_StrategyParams_$21_memory_ptr",
                                "typeString": "struct StrategyParams memory"
                              }
                            },
                            "id": 640,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "totalDebt",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16,
                            "src": "22489:16:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 637,
                            "name": "total",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 614,
                            "src": "22479:5:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 638,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sub",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1339,
                          "src": "22479:9:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                          }
                        },
                        "id": 641,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "22479:27:5",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "22470:36:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 643,
                    "nodeType": "ExpressionStatement",
                    "src": "22470:36:5"
                  }
                },
                {
                  "assignments": [
                    646
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 646,
                      "mutability": "mutable",
                      "name": "credit",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 662,
                      "src": "22655:14:5",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 645,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "22655:7:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 650,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 647,
                        "name": "vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 179,
                        "src": "22672:5:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_VaultAPI_$87",
                          "typeString": "contract VaultAPI"
                        }
                      },
                      "id": 648,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "creditAvailable",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46,
                      "src": "22672:21:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                        "typeString": "function () view external returns (uint256)"
                      }
                    },
                    "id": 649,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "22672:23:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "22655:40:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 659,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 653,
                              "name": "callCost",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 568,
                              "src": "22730:8:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 651,
                              "name": "profitFactor",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 227,
                              "src": "22713:12:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 652,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mul",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1402,
                            "src": "22713:16:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 654,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22713:26:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 657,
                              "name": "profit",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 629,
                              "src": "22753:6:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 655,
                              "name": "credit",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 646,
                              "src": "22742:6:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 656,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1322,
                            "src": "22742:10:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 658,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22742:18:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "22713:47:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "id": 660,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "22712:49:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 572,
                  "id": 661,
                  "nodeType": "Return",
                  "src": "22705:56:5"
                }
              ]
            },
            "documentation": {
              "id": 566,
              "nodeType": "StructuredDocumentation",
              "src": "19735:1693:5",
              "text": " @notice\n  Provide a signal to the keeper that `harvest()` should be called. The\n  keeper will provide the estimated gas cost that they would pay to call\n  `harvest()`, and this function should use that estimate to make a\n  determination if calling it is \"worth it\" for the keeper. This is not\n  the only consideration into issuing this trigger, for example if the\n  position would be negatively affected if `harvest()` is not called\n  shortly, then this can return `true` even if the keeper might be \"at a\n  loss\" (keepers are always reimbursed by Yearn).\n @dev\n  `callCost` must be priced in terms of `want`.\n  This call and `tendTrigger` should never return `true` at the\n  same time.\n  See `minReportDelay`, `profitFactor`, `debtThreshold` to adjust the\n  strategist-controlled parameters that will influence whether this call\n  returns `true` or not. These parameters will be used in conjunction\n  with the parameters reported to the Vault (see `params`) to determine\n  if calling `harvest()` is merited.\n  It is expected that an external system will check `harvestTrigger()`.\n  This could be a script run off a desktop or cloud bot (e.g.\n  https://github.com/iearn-finance/yearn-vaults/blob/master/scripts/keep.py),\n  or via an integration with the Keep3r network (e.g.\n  https://github.com/Macarse/GenericKeep3rV2/blob/master/contracts/keep3r/GenericKeep3rV2.sol).\n @param callCost The keeper's estimated cast cost to call `harvest()`.\n @return `true` if `harvest()` should be called, `false` otherwise."
            },
            "functionSelector": "ed882c2b",
            "id": 663,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "harvestTrigger",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 569,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 568,
                  "mutability": "mutable",
                  "name": "callCost",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 663,
                  "src": "21457:16:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 567,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "21457:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "21456:18:5"
            },
            "returnParameters": {
              "id": 572,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 571,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 663,
                  "src": "21504:4:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 570,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "21504:4:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "21503:6:5"
            },
            "scope": 951,
            "src": "21433:1335:5",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": {
              "id": 757,
              "nodeType": "Block",
              "src": "23595:1410:5",
              "statements": [
                {
                  "assignments": [
                    670
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 670,
                      "mutability": "mutable",
                      "name": "profit",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 757,
                      "src": "23605:14:5",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 669,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "23605:7:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 672,
                  "initialValue": {
                    "argumentTypes": null,
                    "hexValue": "30",
                    "id": 671,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "23622:1:5",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "23605:18:5"
                },
                {
                  "assignments": [
                    674
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 674,
                      "mutability": "mutable",
                      "name": "loss",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 757,
                      "src": "23633:12:5",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 673,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "23633:7:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 676,
                  "initialValue": {
                    "argumentTypes": null,
                    "hexValue": "30",
                    "id": 675,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "23648:1:5",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "23633:16:5"
                },
                {
                  "assignments": [
                    678
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 678,
                      "mutability": "mutable",
                      "name": "debtOutstanding",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 757,
                      "src": "23659:23:5",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 677,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "23659:7:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 682,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 679,
                        "name": "vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 179,
                        "src": "23685:5:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_VaultAPI_$87",
                          "typeString": "contract VaultAPI"
                        }
                      },
                      "id": 680,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "debtOutstanding",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 52,
                      "src": "23685:21:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                        "typeString": "function () view external returns (uint256)"
                      }
                    },
                    "id": 681,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "23685:23:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "23659:49:5"
                },
                {
                  "assignments": [
                    684
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 684,
                      "mutability": "mutable",
                      "name": "debtPayment",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 757,
                      "src": "23718:19:5",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 683,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "23718:7:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 686,
                  "initialValue": {
                    "argumentTypes": null,
                    "hexValue": "30",
                    "id": 685,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "23740:1:5",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "23718:23:5"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "id": 687,
                    "name": "emergencyExit",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 232,
                    "src": "23755:13:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 732,
                    "nodeType": "Block",
                    "src": "24335:134:5",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 730,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "id": 723,
                                "name": "profit",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 670,
                                "src": "24399:6:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 724,
                                "name": "loss",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 674,
                                "src": "24407:4:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 725,
                                "name": "debtPayment",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 684,
                                "src": "24413:11:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 726,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "TupleExpression",
                            "src": "24398:27:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$",
                              "typeString": "tuple(uint256,uint256,uint256)"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 728,
                                "name": "debtOutstanding",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 678,
                                "src": "24442:15:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 727,
                              "name": "prepareReturn",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 498,
                              "src": "24428:13:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_uint256_$_t_uint256_$_t_uint256_$",
                                "typeString": "function (uint256) returns (uint256,uint256,uint256)"
                              }
                            },
                            "id": 729,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "24428:30:5",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_uint256_$",
                              "typeString": "tuple(uint256,uint256,uint256)"
                            }
                          },
                          "src": "24398:60:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 731,
                        "nodeType": "ExpressionStatement",
                        "src": "24398:60:5"
                      }
                    ]
                  },
                  "id": 733,
                  "nodeType": "IfStatement",
                  "src": "23751:718:5",
                  "trueBody": {
                    "id": 722,
                    "nodeType": "Block",
                    "src": "23770:559:5",
                    "statements": [
                      {
                        "assignments": [
                          689
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 689,
                            "mutability": "mutable",
                            "name": "totalAssets",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 722,
                            "src": "23835:19:5",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 688,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "23835:7:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 692,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 690,
                            "name": "estimatedTotalAssets",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 464,
                            "src": "23857:20:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                              "typeString": "function () view returns (uint256)"
                            }
                          },
                          "id": 691,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23857:22:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "23835:44:5"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 704,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "id": 693,
                                "name": "debtPayment",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 684,
                                "src": "23990:11:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 694,
                                "name": "loss",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 674,
                                "src": "24003:4:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 695,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "TupleExpression",
                            "src": "23989:19:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                              "typeString": "tuple(uint256,uint256)"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "condition": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 699,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 697,
                                    "name": "totalAssets",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 689,
                                    "src": "24029:11:5",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": ">",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 698,
                                    "name": "debtOutstanding",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 678,
                                    "src": "24043:15:5",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "24029:29:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "falseExpression": {
                                  "argumentTypes": null,
                                  "id": 701,
                                  "name": "debtOutstanding",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 678,
                                  "src": "24075:15:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 702,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "Conditional",
                                "src": "24029:61:5",
                                "trueExpression": {
                                  "argumentTypes": null,
                                  "id": 700,
                                  "name": "totalAssets",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 689,
                                  "src": "24061:11:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 696,
                              "name": "liquidatePosition",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 514,
                              "src": "24011:17:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_uint256_$_t_uint256_$",
                                "typeString": "function (uint256) returns (uint256,uint256)"
                              }
                            },
                            "id": 703,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "24011:80:5",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                              "typeString": "tuple(uint256,uint256)"
                            }
                          },
                          "src": "23989:102:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 705,
                        "nodeType": "ExpressionStatement",
                        "src": "23989:102:5"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 708,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 706,
                            "name": "debtPayment",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 684,
                            "src": "24167:11:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 707,
                            "name": "debtOutstanding",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 678,
                            "src": "24181:15:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "24167:29:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 721,
                        "nodeType": "IfStatement",
                        "src": "24163:156:5",
                        "trueBody": {
                          "id": 720,
                          "nodeType": "Block",
                          "src": "24198:121:5",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 714,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 709,
                                  "name": "profit",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 670,
                                  "src": "24216:6:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 712,
                                      "name": "debtOutstanding",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 678,
                                      "src": "24241:15:5",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 710,
                                      "name": "debtPayment",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 684,
                                      "src": "24225:11:5",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 711,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sub",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1339,
                                    "src": "24225:15:5",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 713,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "24225:32:5",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "24216:41:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 715,
                              "nodeType": "ExpressionStatement",
                              "src": "24216:41:5"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 718,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 716,
                                  "name": "debtPayment",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 684,
                                  "src": "24275:11:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 717,
                                  "name": "debtOutstanding",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 678,
                                  "src": "24289:15:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "24275:29:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 719,
                              "nodeType": "ExpressionStatement",
                              "src": "24275:29:5"
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 741,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 734,
                      "name": "debtOutstanding",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 678,
                      "src": "24660:15:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 737,
                          "name": "profit",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 670,
                          "src": "24691:6:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 738,
                          "name": "loss",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 674,
                          "src": "24699:4:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 739,
                          "name": "debtPayment",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 684,
                          "src": "24705:11:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 735,
                          "name": "vault",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 179,
                          "src": "24678:5:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_VaultAPI_$87",
                            "typeString": "contract VaultAPI"
                          }
                        },
                        "id": 736,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "report",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 70,
                        "src": "24678:12:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                          "typeString": "function (uint256,uint256,uint256) external returns (uint256)"
                        }
                      },
                      "id": 740,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "24678:39:5",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "24660:57:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 742,
                  "nodeType": "ExpressionStatement",
                  "src": "24660:57:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 743,
                      "name": "distributeRewards",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 541,
                      "src": "24806:17:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 744,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "24806:19:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 745,
                  "nodeType": "ExpressionStatement",
                  "src": "24806:19:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 747,
                        "name": "debtOutstanding",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 678,
                        "src": "24913:15:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 746,
                      "name": "adjustPosition",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 504,
                      "src": "24898:14:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 748,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "24898:31:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 749,
                  "nodeType": "ExpressionStatement",
                  "src": "24898:31:5"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 751,
                        "name": "profit",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 670,
                        "src": "24955:6:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 752,
                        "name": "loss",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 674,
                        "src": "24963:4:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 753,
                        "name": "debtPayment",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 684,
                        "src": "24969:11:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 754,
                        "name": "debtOutstanding",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 678,
                        "src": "24982:15:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 750,
                      "name": "Harvested",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 197,
                      "src": "24945:9:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (uint256,uint256,uint256,uint256)"
                      }
                    },
                    "id": 755,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "24945:53:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 756,
                  "nodeType": "EmitStatement",
                  "src": "24940:58:5"
                }
              ]
            },
            "documentation": {
              "id": 664,
              "nodeType": "StructuredDocumentation",
              "src": "22774:776:5",
              "text": " @notice\n  Harvests the Strategy, recognizing any profits or losses and adjusting\n  the Strategy's position.\n  In the rare case the Strategy is in emergency shutdown, this will exit\n  the Strategy's position.\n  This may only be called by governance, the strategist, or the keeper.\n @dev\n  When `harvest()` is called, the Strategy reports to the Vault (via\n  `vault.report()`), so in some cases `harvest()` must be called in order\n  to take in profits, to borrow newly available funds from the Vault, or\n  otherwise adjust its position. In other cases `harvest()` must be\n  called to report to the Vault on the Strategy's position, especially if\n  any losses have occurred."
            },
            "functionSelector": "4641257d",
            "id": 758,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 667,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 666,
                  "name": "onlyKeepers",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 298,
                  "src": "23583:11:5",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "23583:11:5"
              }
            ],
            "name": "harvest",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 665,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "23571:2:5"
            },
            "returnParameters": {
              "id": 668,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "23595:0:5"
            },
            "scope": 951,
            "src": "23555:1450:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 796,
              "nodeType": "Block",
              "src": "25313:423:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 773,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 767,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "25331:3:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 768,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "25331:10:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 771,
                              "name": "vault",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 179,
                              "src": "25353:5:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_VaultAPI_$87",
                                "typeString": "contract VaultAPI"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_VaultAPI_$87",
                                "typeString": "contract VaultAPI"
                              }
                            ],
                            "id": 770,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "25345:7:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 769,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "25345:7:5",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 772,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25345:14:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "25331:28:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "217661756c74",
                        "id": 774,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "25361:8:5",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_935dae7e2471bb42a624e3787c1dd49fe36e63fd03e67a6f90f78ba819cb3825",
                          "typeString": "literal_string \"!vault\""
                        },
                        "value": "!vault"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_935dae7e2471bb42a624e3787c1dd49fe36e63fd03e67a6f90f78ba819cb3825",
                          "typeString": "literal_string \"!vault\""
                        }
                      ],
                      "id": 766,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "25323:7:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 775,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "25323:47:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 776,
                  "nodeType": "ExpressionStatement",
                  "src": "25323:47:5"
                },
                {
                  "assignments": [
                    778
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 778,
                      "mutability": "mutable",
                      "name": "amountFreed",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 796,
                      "src": "25448:19:5",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 777,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "25448:7:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 779,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "25448:19:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 786,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "components": [
                        {
                          "argumentTypes": null,
                          "id": 780,
                          "name": "amountFreed",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 778,
                          "src": "25478:11:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 781,
                          "name": "_loss",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 764,
                          "src": "25491:5:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 782,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "TupleExpression",
                      "src": "25477:20:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                        "typeString": "tuple(uint256,uint256)"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 784,
                          "name": "_amountNeeded",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 761,
                          "src": "25518:13:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "id": 783,
                        "name": "liquidatePosition",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 514,
                        "src": "25500:17:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_uint256_$_t_uint256_$",
                          "typeString": "function (uint256) returns (uint256,uint256)"
                        }
                      },
                      "id": 785,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "25500:32:5",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                        "typeString": "tuple(uint256,uint256)"
                      }
                    },
                    "src": "25477:55:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 787,
                  "nodeType": "ExpressionStatement",
                  "src": "25477:55:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 791,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "25636:3:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 792,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "25636:10:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 793,
                        "name": "amountFreed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 778,
                        "src": "25648:11:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 788,
                        "name": "want",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 187,
                        "src": "25622:4:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1567",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 790,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1516,
                      "src": "25622:13:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 794,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "25622:38:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 795,
                  "nodeType": "ExpressionStatement",
                  "src": "25622:38:5"
                }
              ]
            },
            "documentation": {
              "id": 759,
              "nodeType": "StructuredDocumentation",
              "src": "25011:223:5",
              "text": " @notice\n  Withdraws `_amountNeeded` to `vault`.\n  This may only be called by the Vault.\n @param _amountNeeded How much `want` to withdraw.\n @return _loss Any realized losses"
            },
            "functionSelector": "2e1a7d4d",
            "id": 797,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "withdraw",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 762,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 761,
                  "mutability": "mutable",
                  "name": "_amountNeeded",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 797,
                  "src": "25257:21:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 760,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "25257:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "25256:23:5"
            },
            "returnParameters": {
              "id": 765,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 764,
                  "mutability": "mutable",
                  "name": "_loss",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 797,
                  "src": "25298:13:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 763,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "25298:7:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "25297:15:5"
            },
            "scope": 951,
            "src": "25239:497:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": {
              "id": 798,
              "nodeType": "StructuredDocumentation",
              "src": "25742:183:5",
              "text": " Do anything necessary to prepare this Strategy for migration, such as\n transferring any reserve or LP tokens, CDPs, or other tokens or stores of\n value."
            },
            "id": 803,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "prepareMigration",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 801,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 800,
                  "mutability": "mutable",
                  "name": "_newStrategy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 803,
                  "src": "25956:20:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 799,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "25956:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "25955:22:5"
            },
            "returnParameters": {
              "id": 802,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "25994:0:5"
            },
            "scope": 951,
            "src": "25930:65:5",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 852,
              "nodeType": "Block",
              "src": "26357:254:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 822,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 816,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 810,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "26375:3:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 811,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "26375:10:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 814,
                                "name": "vault",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 179,
                                "src": "26397:5:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_VaultAPI_$87",
                                  "typeString": "contract VaultAPI"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_VaultAPI_$87",
                                  "typeString": "contract VaultAPI"
                                }
                              ],
                              "id": 813,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "26389:7:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 812,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "26389:7:5",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 815,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "26389:14:5",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "26375:28:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "||",
                        "rightExpression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 821,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 817,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "26407:3:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 818,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "26407:10:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 819,
                              "name": "governance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 458,
                              "src": "26421:10:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                "typeString": "function () view returns (address)"
                              }
                            },
                            "id": 820,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "26421:12:5",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "26407:26:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "src": "26375:58:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 809,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "26367:7:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 823,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "26367:67:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 824,
                  "nodeType": "ExpressionStatement",
                  "src": "26367:67:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_contract$_VaultAPI_$87",
                          "typeString": "contract VaultAPI"
                        },
                        "id": 832,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 827,
                                  "name": "_newStrategy",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 806,
                                  "src": "26465:12:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 826,
                                "name": "BaseStrategy",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 951,
                                "src": "26452:12:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_BaseStrategy_$951_$",
                                  "typeString": "type(contract BaseStrategy)"
                                }
                              },
                              "id": 828,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "26452:26:5",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_BaseStrategy_$951",
                                "typeString": "contract BaseStrategy"
                              }
                            },
                            "id": 829,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "vault",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 179,
                            "src": "26452:32:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_contract$_VaultAPI_$87_$",
                              "typeString": "function () view external returns (contract VaultAPI)"
                            }
                          },
                          "id": 830,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26452:34:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_VaultAPI_$87",
                            "typeString": "contract VaultAPI"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 831,
                          "name": "vault",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 179,
                          "src": "26490:5:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_VaultAPI_$87",
                            "typeString": "contract VaultAPI"
                          }
                        },
                        "src": "26452:43:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 825,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "26444:7:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                        "typeString": "function (bool) pure"
                      }
                    },
                    "id": 833,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "26444:52:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 834,
                  "nodeType": "ExpressionStatement",
                  "src": "26444:52:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 836,
                        "name": "_newStrategy",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 806,
                        "src": "26523:12:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 835,
                      "name": "prepareMigration",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 803,
                      "src": "26506:16:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 837,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "26506:30:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 838,
                  "nodeType": "ExpressionStatement",
                  "src": "26506:30:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 842,
                        "name": "_newStrategy",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 806,
                        "src": "26560:12:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 847,
                                "name": "this",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -28,
                                "src": "26597:4:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_BaseStrategy_$951",
                                  "typeString": "contract BaseStrategy"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_BaseStrategy_$951",
                                  "typeString": "contract BaseStrategy"
                                }
                              ],
                              "id": 846,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "26589:7:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 845,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "26589:7:5",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 848,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "26589:13:5",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 843,
                            "name": "want",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 187,
                            "src": "26574:4:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$1567",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 844,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "balanceOf",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1506,
                          "src": "26574:14:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                            "typeString": "function (address) view external returns (uint256)"
                          }
                        },
                        "id": 849,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "26574:29:5",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 839,
                        "name": "want",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 187,
                        "src": "26546:4:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1567",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 841,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1516,
                      "src": "26546:13:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 850,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "26546:58:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 851,
                  "nodeType": "ExpressionStatement",
                  "src": "26546:58:5"
                }
              ]
            },
            "documentation": {
              "id": 804,
              "nodeType": "StructuredDocumentation",
              "src": "26001:303:5",
              "text": " @notice\n  Transfers all `want` from this Strategy to `_newStrategy`.\n  This may only be called by governance or the Vault.\n @dev\n  The new Strategy's Vault must be the same as this Strategy's Vault.\n @param _newStrategy The Strategy to migrate to."
            },
            "functionSelector": "ce5494bb",
            "id": 853,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "migrate",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 807,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 806,
                  "mutability": "mutable",
                  "name": "_newStrategy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 853,
                  "src": "26326:20:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 805,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "26326:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "26325:22:5"
            },
            "returnParameters": {
              "id": 808,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "26357:0:5"
            },
            "scope": 951,
            "src": "26309:302:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 868,
              "nodeType": "Block",
              "src": "27080:69:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 861,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 859,
                      "name": "emergencyExit",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 232,
                      "src": "27090:13:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 860,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "27106:4:5",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "27090:20:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 862,
                  "nodeType": "ExpressionStatement",
                  "src": "27090:20:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 863,
                        "name": "vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 179,
                        "src": "27120:5:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_VaultAPI_$87",
                          "typeString": "contract VaultAPI"
                        }
                      },
                      "id": 865,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "revokeStrategy",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 80,
                      "src": "27120:20:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$__$returns$__$",
                        "typeString": "function () external"
                      }
                    },
                    "id": 866,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "27120:22:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 867,
                  "nodeType": "ExpressionStatement",
                  "src": "27120:22:5"
                }
              ]
            },
            "documentation": {
              "id": 854,
              "nodeType": "StructuredDocumentation",
              "src": "26617:406:5",
              "text": " @notice\n  Activates emergency exit. Once activated, the Strategy will exit its\n  position upon the next harvest, depositing all funds into the Vault as\n  quickly as is reasonable given on-chain conditions.\n  This may only be called by governance or the strategist.\n @dev\n  See `vault.setEmergencyShutdown()` and `harvest()` for further details."
            },
            "functionSelector": "fcf2d0ad",
            "id": 869,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 857,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 856,
                  "name": "onlyAuthorized",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 250,
                  "src": "27065:14:5",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "27065:14:5"
              }
            ],
            "name": "setEmergencyExit",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 855,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "27053:2:5"
            },
            "returnParameters": {
              "id": 858,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "27080:0:5"
            },
            "scope": 951,
            "src": "27028:121:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": {
              "id": 870,
              "nodeType": "StructuredDocumentation",
              "src": "27155:590:5",
              "text": " Override this to add all tokens/tokenized positions this contract\n manages on a *persistent* basis (e.g. not just for swapping back to\n want ephemerally).\n NOTE: Do *not* include `want`, already included in `sweep` below.\n Example:\n    function protectedTokens() internal override view returns (address[] memory) {\n      address[] memory protected = new address[](3);\n      protected[0] = tokenA;\n      protected[1] = tokenB;\n      protected[2] = tokenC;\n      return protected;\n    }"
            },
            "id": 876,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "protectedTokens",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 871,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "27774:2:5"
            },
            "returnParameters": {
              "id": 875,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 874,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 876,
                  "src": "27808:16:5",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 872,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "27808:7:5",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 873,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "27808:9:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "27807:18:5"
            },
            "scope": 951,
            "src": "27750:76:5",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 949,
              "nodeType": "Block",
              "src": "28576:377:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 890,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 885,
                          "name": "_token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 879,
                          "src": "28594:6:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 888,
                              "name": "want",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 187,
                              "src": "28612:4:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1567",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$1567",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 887,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "28604:7:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 886,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "28604:7:5",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 889,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28604:13:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "28594:23:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "2177616e74",
                        "id": 891,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "28619:7:5",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_231925ccfbf9a3618a033d2154443ccdf50c96b0c7e09098443d1ee47d2e02da",
                          "typeString": "literal_string \"!want\""
                        },
                        "value": "!want"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_231925ccfbf9a3618a033d2154443ccdf50c96b0c7e09098443d1ee47d2e02da",
                          "typeString": "literal_string \"!want\""
                        }
                      ],
                      "id": 884,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "28586:7:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 892,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "28586:41:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 893,
                  "nodeType": "ExpressionStatement",
                  "src": "28586:41:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 900,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 895,
                          "name": "_token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 879,
                          "src": "28645:6:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 898,
                              "name": "vault",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 179,
                              "src": "28663:5:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_VaultAPI_$87",
                                "typeString": "contract VaultAPI"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_VaultAPI_$87",
                                "typeString": "contract VaultAPI"
                              }
                            ],
                            "id": 897,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "28655:7:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 896,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "28655:7:5",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 899,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28655:14:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "28645:24:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "21736861726573",
                        "id": 901,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "28671:9:5",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_a260e14e85f4708f0331ef286c142a0afbf558408b64fafd24a23e404c959d74",
                          "typeString": "literal_string \"!shares\""
                        },
                        "value": "!shares"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_a260e14e85f4708f0331ef286c142a0afbf558408b64fafd24a23e404c959d74",
                          "typeString": "literal_string \"!shares\""
                        }
                      ],
                      "id": 894,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "28637:7:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 902,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "28637:44:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 903,
                  "nodeType": "ExpressionStatement",
                  "src": "28637:44:5"
                },
                {
                  "assignments": [
                    908
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 908,
                      "mutability": "mutable",
                      "name": "_protectedTokens",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 949,
                      "src": "28692:33:5",
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                        "typeString": "address[]"
                      },
                      "typeName": {
                        "baseType": {
                          "id": 906,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28692:7:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 907,
                        "length": null,
                        "nodeType": "ArrayTypeName",
                        "src": "28692:9:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                          "typeString": "address[]"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 911,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 909,
                      "name": "protectedTokens",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 876,
                      "src": "28728:15:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$__$returns$_t_array$_t_address_$dyn_memory_ptr_$",
                        "typeString": "function () view returns (address[] memory)"
                      }
                    },
                    "id": 910,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "28728:17:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                      "typeString": "address[] memory"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "28692:53:5"
                },
                {
                  "body": {
                    "expression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 927,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 923,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 879,
                            "src": "28813:6:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 924,
                              "name": "_protectedTokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 908,
                              "src": "28823:16:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                "typeString": "address[] memory"
                              }
                            },
                            "id": 926,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 925,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 913,
                              "src": "28840:1:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "28823:19:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "28813:29:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "hexValue": "2170726f746563746564",
                          "id": 928,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "string",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "28844:12:5",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_stringliteral_e46755f6c68e6862a804f66019fefa4d62a5dcf5b8a7dfad5123628363623eae",
                            "typeString": "literal_string \"!protected\""
                          },
                          "value": "!protected"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          {
                            "typeIdentifier": "t_stringliteral_e46755f6c68e6862a804f66019fefa4d62a5dcf5b8a7dfad5123628363623eae",
                            "typeString": "literal_string \"!protected\""
                          }
                        ],
                        "id": 922,
                        "name": "require",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [
                          -18,
                          -18
                        ],
                        "referencedDeclaration": -18,
                        "src": "28805:7:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                          "typeString": "function (bool,string memory) pure"
                        }
                      },
                      "id": 929,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "28805:52:5",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 930,
                    "nodeType": "ExpressionStatement",
                    "src": "28805:52:5"
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 918,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 915,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 913,
                      "src": "28771:1:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 916,
                        "name": "_protectedTokens",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 908,
                        "src": "28775:16:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[] memory"
                        }
                      },
                      "id": 917,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "28775:23:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "28771:27:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 931,
                  "initializationExpression": {
                    "assignments": [
                      913
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 913,
                        "mutability": "mutable",
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 931,
                        "src": "28760:9:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 912,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28760:7:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 914,
                    "initialValue": null,
                    "nodeType": "VariableDeclarationStatement",
                    "src": "28760:9:5"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 920,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "28800:3:5",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 919,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 913,
                        "src": "28800:1:5",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 921,
                    "nodeType": "ExpressionStatement",
                    "src": "28800:3:5"
                  },
                  "nodeType": "ForStatement",
                  "src": "28755:102:5"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 936,
                          "name": "governance",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 458,
                          "src": "28892:10:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                            "typeString": "function () view returns (address)"
                          }
                        },
                        "id": 937,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "28892:12:5",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 944,
                                "name": "this",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -28,
                                "src": "28939:4:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_BaseStrategy_$951",
                                  "typeString": "contract BaseStrategy"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_BaseStrategy_$951",
                                  "typeString": "contract BaseStrategy"
                                }
                              ],
                              "id": 943,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "28931:7:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 942,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "28931:7:5",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 945,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "28931:13:5",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 939,
                                "name": "_token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 879,
                                "src": "28913:6:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 938,
                              "name": "IERC20",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1567,
                              "src": "28906:6:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_IERC20_$1567_$",
                                "typeString": "type(contract IERC20)"
                              }
                            },
                            "id": 940,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "28906:14:5",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$1567",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 941,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "balanceOf",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 1506,
                          "src": "28906:24:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                            "typeString": "function (address) view external returns (uint256)"
                          }
                        },
                        "id": 946,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "28906:39:5",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 933,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 879,
                            "src": "28875:6:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 932,
                          "name": "IERC20",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1567,
                          "src": "28868:6:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IERC20_$1567_$",
                            "typeString": "type(contract IERC20)"
                          }
                        },
                        "id": 934,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "28868:14:5",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1567",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 935,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 1516,
                      "src": "28868:23:5",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 947,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "28868:78:5",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 948,
                  "nodeType": "ExpressionStatement",
                  "src": "28868:78:5"
                }
              ]
            },
            "documentation": {
              "id": 877,
              "nodeType": "StructuredDocumentation",
              "src": "27832:684:5",
              "text": " @notice\n  Removes tokens from this Strategy that are not the type of tokens\n  managed by this Strategy. This may be used in case of accidentally\n  sending the wrong kind of token to this Strategy.\n  Tokens will be sent to `governance()`.\n  This will fail if an attempt is made to sweep `want`, or any tokens\n  that are protected by this Strategy.\n  This may only be called by governance.\n @dev\n  Implement `protectedTokens()` to specify any additional tokens that\n  should be protected from sweeping in addition to `want`.\n @param _token The token to transfer out of this vault."
            },
            "functionSelector": "01681a62",
            "id": 950,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 882,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 881,
                  "name": "onlyGovernance",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 275,
                  "src": "28561:14:5",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "28561:14:5"
              }
            ],
            "name": "sweep",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 880,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 879,
                  "mutability": "mutable",
                  "name": "_token",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 950,
                  "src": "28536:14:5",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 878,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "28536:7:5",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "28535:16:5"
            },
            "returnParameters": {
              "id": 883,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "28576:0:5"
            },
            "scope": 951,
            "src": "28521:432:5",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 952,
        "src": "4936:24019:5"
      }
    ],
    "src": "36:28920:5"
  },
  "bytecode": "",
  "bytecodeSha1": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
  "compiler": {
    "evm_version": "istanbul",
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "version": "0.6.12"
  },
  "contractName": "BaseStrategy",
  "coverageMap": {
    "branches": {},
    "statements": {}
  },
  "dependencies": [
    "SafeMath"
  ],
  "deployedBytecode": "",
  "deployedSourceMap": "",
  "language": "Solidity",
  "natspec": {
    "author": "yearn.finance",
    "kind": "dev",
    "methods": {
      "apiVersion()": {
        "details": "The Strategy's version must match the Vault's `API_VERSION`.",
        "notice": "Used to track which version of `StrategyAPI` this Strategy  implements.",
        "returns": {
          "_0": "A string which holds the current API version of this contract."
        }
      },
      "constructor": {
        "details": "`_vault` should implement `VaultAPI`.",
        "params": {
          "_vault": "The address of the Vault responsible for this Strategy."
        }
      },
      "delegatedAssets()": {
        "details": "You can override this field to set it to a non-zero value if some of the assets of this  Strategy is somehow delegated inside another part of of Yearn's ecosystem e.g. another Vault.  Note that this value must be strictly less than or equal to the amount provided by  `estimatedTotalAssets()` below, as the TVL calc will be total assets minus delegated assets.",
        "notice": "The amount (priced in want) of the total assets managed by this strategy should not count  towards Yearn's TVL calculations.",
        "returns": {
          "_0": "The amount of assets this strategy manages that should not be included in Yearn's Total Value  Locked (TVL) calculation across it's ecosystem."
        }
      },
      "estimatedTotalAssets()": {
        "details": "Care must be taken in using this function, since it relies on external  systems, which could be manipulated by the attacker to give an inflated  (or reduced) value produced by this function, based on current on-chain  conditions (e.g. this function is possible to influence through  flashloan attacks, oracle manipulations, or other DeFi attack  mechanisms).  It is up to governance to use this function to correctly order this  Strategy relative to its peers in the withdrawal queue to minimize  losses for the Vault based on sudden withdrawals. This value should be  higher than the total debt of the Strategy and higher than its expected  value to be \"safe\".",
        "notice": "Provide an accurate estimate for the total amount of assets  (principle + return) that this Strategy is currently managing,  denominated in terms of `want` tokens.  This total should be \"realizable\" e.g. the total value that could  *actually* be obtained from this Strategy if it were to divest its  entire position based on current on-chain conditions.",
        "returns": {
          "_0": "The estimated total assets in this Strategy."
        }
      },
      "harvest()": {
        "details": "When `harvest()` is called, the Strategy reports to the Vault (via  `vault.report()`), so in some cases `harvest()` must be called in order  to take in profits, to borrow newly available funds from the Vault, or  otherwise adjust its position. In other cases `harvest()` must be  called to report to the Vault on the Strategy's position, especially if  any losses have occurred.",
        "notice": "Harvests the Strategy, recognizing any profits or losses and adjusting  the Strategy's position.  In the rare case the Strategy is in emergency shutdown, this will exit  the Strategy's position.  This may only be called by governance, the strategist, or the keeper."
      },
      "harvestTrigger(uint256)": {
        "details": "`callCost` must be priced in terms of `want`.  This call and `tendTrigger` should never return `true` at the  same time.  See `minReportDelay`, `profitFactor`, `debtThreshold` to adjust the  strategist-controlled parameters that will influence whether this call  returns `true` or not. These parameters will be used in conjunction  with the parameters reported to the Vault (see `params`) to determine  if calling `harvest()` is merited.  It is expected that an external system will check `harvestTrigger()`.  This could be a script run off a desktop or cloud bot (e.g.  https://github.com/iearn-finance/yearn-vaults/blob/master/scripts/keep.py),  or via an integration with the Keep3r network (e.g.  https://github.com/Macarse/GenericKeep3rV2/blob/master/contracts/keep3r/GenericKeep3rV2.sol).",
        "notice": "Provide a signal to the keeper that `harvest()` should be called. The  keeper will provide the estimated gas cost that they would pay to call  `harvest()`, and this function should use that estimate to make a  determination if calling it is \"worth it\" for the keeper. This is not  the only consideration into issuing this trigger, for example if the  position would be negatively affected if `harvest()` is not called  shortly, then this can return `true` even if the keeper might be \"at a  loss\" (keepers are always reimbursed by Yearn).",
        "params": {
          "callCost": "The keeper's estimated cast cost to call `harvest()`."
        },
        "returns": {
          "_0": "`true` if `harvest()` should be called, `false` otherwise."
        }
      },
      "migrate(address)": {
        "details": "The new Strategy's Vault must be the same as this Strategy's Vault.",
        "notice": "Transfers all `want` from this Strategy to `_newStrategy`.  This may only be called by governance or the Vault.",
        "params": {
          "_newStrategy": "The Strategy to migrate to."
        }
      },
      "name()": {
        "details": "You can use this field to manage the \"version\" of this Strategy, e.g.  `StrategySomethingOrOtherV1`. However, \"API Version\" is managed by  `apiVersion()` function above.",
        "notice": "This Strategy's name.",
        "returns": {
          "_0": "This Strategy's name."
        }
      },
      "setDebtThreshold(uint256)": {
        "notice": "Sets how far the Strategy can go into loss without a harvest and report  being required.  By default this is 0, meaning any losses would cause a harvest which  will subsequently report the loss to the Vault for tracking. (See  `harvestTrigger()` for more details.)  This may only be called by governance or the strategist.",
        "params": {
          "_debtThreshold": "How big of a loss this Strategy may carry without being required to report to the Vault."
        }
      },
      "setEmergencyExit()": {
        "details": "See `vault.setEmergencyShutdown()` and `harvest()` for further details.",
        "notice": "Activates emergency exit. Once activated, the Strategy will exit its  position upon the next harvest, depositing all funds into the Vault as  quickly as is reasonable given on-chain conditions.  This may only be called by governance or the strategist."
      },
      "setKeeper(address)": {
        "notice": "Used to change `keeper`.  `keeper` is the only address that may call `tend()` or `harvest()`,  other than `governance()` or `strategist`. However, unlike  `governance()` or `strategist`, `keeper` may *only* call `tend()`  and `harvest()`, and no other authorized functions, following the  principle of least privilege.  This may only be called by governance or the strategist.",
        "params": {
          "_keeper": "The new address to assign as `keeper`."
        }
      },
      "setMinReportDelay(uint256)": {
        "notice": "Used to change `minReportDelay`. `minReportDelay` is the minimum number  of blocks that should pass before `harvest()` is called.  For external keepers (such as the Keep3r network), this is the minimum  time between jobs, to prevent excessive costs. (see `harvestTrigger()`  for more details.)  This may only be called by governance or the strategist.",
        "params": {
          "_delay": "The minimum number of blocks to wait between harvests."
        }
      },
      "setProfitFactor(uint256)": {
        "notice": "Used to change `profitFactor`. `profitFactor` is used to determine  if it's worthwhile to harvest, given gas costs. (See `harvestTrigger()`  for more details.)  This may only be called by governance or the strategist.",
        "params": {
          "_profitFactor": "A ratio to multiply anticipated `harvest()` gas cost against."
        }
      },
      "setRewards(address)": {
        "notice": "Used to change `rewards`. Any distributed rewards will cease flowing  to the old address and begin flowing to this address once the change  is in effect.  This will not change any Strategy reports in progress, only  new reports made after this change goes into effect.  This may only be called by the strategist.",
        "params": {
          "_rewards": "The address to use for collecting rewards."
        }
      },
      "setStrategist(address)": {
        "notice": "Used to change `strategist`.  This may only be called by governance or the existing strategist.",
        "params": {
          "_strategist": "The new address to assign as `strategist`."
        }
      },
      "sweep(address)": {
        "details": "Implement `protectedTokens()` to specify any additional tokens that  should be protected from sweeping in addition to `want`.",
        "notice": "Removes tokens from this Strategy that are not the type of tokens  managed by this Strategy. This may be used in case of accidentally  sending the wrong kind of token to this Strategy.  Tokens will be sent to `governance()`.  This will fail if an attempt is made to sweep `want`, or any tokens  that are protected by this Strategy.  This may only be called by governance.",
        "params": {
          "_token": "The token to transfer out of this vault."
        }
      },
      "tend()": {
        "notice": "Adjust the Strategy's position. The purpose of tending isn't to  realize gains, but to maximize yield by reinvesting any returns.  See comments on `adjustPosition()`.  This may only be called by governance, the strategist, or the keeper."
      },
      "tendTrigger(uint256)": {
        "details": "`callCost` must be priced in terms of `want`.  This call and `harvestTrigger()` should never return `true` at the same  time.",
        "notice": "Provide a signal to the keeper that `tend()` should be called. The  keeper will provide the estimated gas cost that they would pay to call  `tend()`, and this function should use that estimate to make a  determination if calling it is \"worth it\" for the keeper. This is not  the only consideration into issuing this trigger, for example if the  position would be negatively affected if `tend()` is not called  shortly, then this can return `true` even if the keeper might be  \"at a loss\" (keepers are always reimbursed by Yearn).",
        "params": {
          "callCost": "The keeper's estimated cast cost to call `tend()`."
        },
        "returns": {
          "_0": "`true` if `tend()` should be called, `false` otherwise."
        }
      },
      "withdraw(uint256)": {
        "notice": "Withdraws `_amountNeeded` to `vault`.  This may only be called by the Vault.",
        "params": {
          "_amountNeeded": "How much `want` to withdraw."
        },
        "returns": {
          "_loss": "Any realized losses"
        }
      }
    },
    "notice": "BaseStrategy implements all of the required functionality to interoperate  closely with the Vault contract. This contract should be inherited and the  abstract methods implemented to adapt the Strategy to the particular needs  it has to create a return.  Of special interest is the relationship between `harvest()` and  `vault.report()'. `harvest()` may be called simply because enough time has  elapsed since the last report, and not because any funds need to be moved  or positions adjusted. This is critical so that the Vault may maintain an  accurate picture of the Strategy's performance. See  `vault.report()`,  `harvest()`, and `harvestTrigger()` for further details.",
    "title": "Yearn Base Strategy",
    "version": 1
  },
  "offset": [
    4936,
    28955
  ],
  "opcodes": "",
  "pcMap": {},
  "sha1": "9c13f01cb636c2c22c5cb75d302a1936b381638e",
  "source": "// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.6.0 <0.7.0;\npragma experimental ABIEncoderV2;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/math/SafeMath.sol\";\n\nstruct StrategyParams {\n    uint256 performanceFee;\n    uint256 activation;\n    uint256 debtLimit;\n    uint256 rateLimit;\n    uint256 lastReport;\n    uint256 totalDebt;\n    uint256 totalGain;\n    uint256 totalLoss;\n}\n\ninterface VaultAPI is IERC20 {\n    function apiVersion() external view returns (string memory);\n\n    function token() external view returns (address);\n\n    function strategies(address _strategy) external view returns (StrategyParams memory);\n\n    /**\n     * View how much the Vault would increase this Strategy's borrow limit,\n     * based on its present performance (since its last report). Can be used to\n     * determine expectedReturn in your Strategy.\n     */\n    function creditAvailable() external view returns (uint256);\n\n    /**\n     * View how much the Vault would like to pull back from the Strategy,\n     * based on its present performance (since its last report). Can be used to\n     * determine expectedReturn in your Strategy.\n     */\n    function debtOutstanding() external view returns (uint256);\n\n    /**\n     * View how much the Vault expect this Strategy to return at the current\n     * block, based on its present performance (since its last report). Can be\n     * used to determine expectedReturn in your Strategy.\n     */\n    function expectedReturn() external view returns (uint256);\n\n    /**\n     * This is the main contact point where the Strategy interacts with the\n     * Vault. It is critical that this call is handled as intended by the\n     * Strategy. Therefore, this function will be called by BaseStrategy to\n     * make sure the integration is correct.\n     */\n    function report(\n        uint256 _gain,\n        uint256 _loss,\n        uint256 _debtPayment\n    ) external returns (uint256);\n\n    /**\n     * This function is used in the scenario where there is a newer Strategy\n     * that would hold the same positions as this one, and those positions are\n     * easily transferrable to the newer Strategy. These positions must be able\n     * to be transferred at the moment this call is made, if any prep is\n     * required to execute a full transfer in one transaction, that must be\n     * accounted for separately from this call.\n     */\n    function migrateStrategy(address _newStrategy) external;\n\n    /**\n     * This function should only be used in the scenario where the Strategy is\n     * being retired but no migration of the positions are possible, or in the\n     * extreme scenario that the Strategy needs to be put into \"Emergency Exit\"\n     * mode in order for it to exit as quickly as possible. The latter scenario\n     * could be for any reason that is considered \"critical\" that the Strategy\n     * exits its position as fast as possible, such as a sudden change in\n     * market conditions leading to losses, or an imminent failure in an\n     * external dependency.\n     */\n    function revokeStrategy() external;\n\n    /**\n     * View the governance address of the Vault to assert privileged functions\n     * can only be called by governance. The Strategy serves the Vault, so it\n     * is subject to governance defined by the Vault.\n     */\n    function governance() external view returns (address);\n}\n\n/**\n * This interface is here for the keeper bot to use.\n */\ninterface StrategyAPI {\n    function apiVersion() external pure returns (string memory);\n\n    function isActive() external view returns (bool);\n\n    function delegatedAssets() external virtual view returns (uint256);\n\n    function name() external view returns (string memory);\n\n    function vault() external view returns (address);\n\n    function keeper() external view returns (address);\n\n    function tendTrigger(uint256 callCost) external view returns (bool);\n\n    function tend() external;\n\n    function harvestTrigger(uint256 callCost) external view returns (bool);\n\n    function harvest() external;\n\n    event Harvested(uint256 profit, uint256 loss, uint256 debtPayment, uint256 debtOutstanding);\n}\n\n/**\n * @title Yearn Base Strategy\n * @author yearn.finance\n * @notice\n *  BaseStrategy implements all of the required functionality to interoperate\n *  closely with the Vault contract. This contract should be inherited and the\n *  abstract methods implemented to adapt the Strategy to the particular needs\n *  it has to create a return.\n *\n *  Of special interest is the relationship between `harvest()` and\n *  `vault.report()'. `harvest()` may be called simply because enough time has\n *  elapsed since the last report, and not because any funds need to be moved\n *  or positions adjusted. This is critical so that the Vault may maintain an\n *  accurate picture of the Strategy's performance. See  `vault.report()`,\n *  `harvest()`, and `harvestTrigger()` for further details.\n */\nabstract contract BaseStrategy {\n    using SafeMath for uint256;\n\n    /**\n     * @notice\n     *  Used to track which version of `StrategyAPI` this Strategy\n     *  implements.\n     * @dev The Strategy's version must match the Vault's `API_VERSION`.\n     * @return A string which holds the current API version of this contract.\n     */\n    function apiVersion() public pure returns (string memory) {\n        return \"0.2.2\";\n    }\n\n    /**\n     * @notice This Strategy's name.\n     * @dev\n     *  You can use this field to manage the \"version\" of this Strategy, e.g.\n     *  `StrategySomethingOrOtherV1`. However, \"API Version\" is managed by\n     *  `apiVersion()` function above.\n     * @return This Strategy's name.\n     */\n    function name() external virtual view returns (string memory);\n\n    /**\n     * @notice\n     *  The amount (priced in want) of the total assets managed by this strategy should not count\n     *  towards Yearn's TVL calculations.\n     * @dev\n     *  You can override this field to set it to a non-zero value if some of the assets of this\n     *  Strategy is somehow delegated inside another part of of Yearn's ecosystem e.g. another Vault.\n     *  Note that this value must be strictly less than or equal to the amount provided by\n     *  `estimatedTotalAssets()` below, as the TVL calc will be total assets minus delegated assets.\n     * @return\n     *  The amount of assets this strategy manages that should not be included in Yearn's Total Value\n     *  Locked (TVL) calculation across it's ecosystem.\n     */\n    function delegatedAssets() external virtual view returns (uint256) {\n        return 0;\n    }\n\n    VaultAPI public vault;\n    address public strategist;\n    address public rewards;\n    address public keeper;\n\n    IERC20 public want;\n\n    // So indexers can keep track of this\n    event Harvested(uint256 profit, uint256 loss, uint256 debtPayment, uint256 debtOutstanding);\n\n    event UpdatedStrategist(address newStrategist);\n\n    event UpdatedKeeper(address newKeeper);\n\n    event UpdatedRewards(address rewards);\n\n    event UpdatedReportDelay(uint256 delay);\n\n    event UpdatedProfitFactor(uint256 profitFactor);\n\n    event UpdatedDebtThreshold(uint256 debtThreshold);\n\n    // The minimum number of seconds between harvest calls. See\n    // `setMinReportDelay()` for more details.\n    uint256 public minReportDelay = 86400; // ~ once a day\n\n    // The minimum multiple that `callCost` must be above the credit/profit to\n    // be \"justifiable\". See `setProfitFactor()` for more details.\n    uint256 public profitFactor = 100;\n\n    // Use this to adjust the threshold at which running a debt causes a\n    // harvest trigger. See `setDebtThreshold()` for more details.\n    uint256 public debtThreshold = 0;\n\n    // See note on `setEmergencyExit()`.\n    bool public emergencyExit;\n\n    // modifiers\n    modifier onlyAuthorized() {\n        require(msg.sender == strategist || msg.sender == governance(), \"!authorized\");\n        _;\n    }\n\n    modifier onlyStrategist() {\n        require(msg.sender == strategist, \"!strategist\");\n        _;\n    }\n\n    modifier onlyGovernance() {\n        require(msg.sender == governance(), \"!authorized\");\n        _;\n    }\n\n    modifier onlyKeepers() {\n        require(msg.sender == keeper || msg.sender == strategist || msg.sender == governance(), \"!authorized\");\n        _;\n    }\n\n    /**\n     * @notice\n     *  Initializes the Strategy, this is called only once, when the\n     *  contract is deployed.\n     * @dev `_vault` should implement `VaultAPI`.\n     * @param _vault The address of the Vault responsible for this Strategy.\n     */\n    constructor(address _vault) public {\n        vault = VaultAPI(_vault);\n        want = IERC20(vault.token());\n        want.approve(_vault, uint256(-1)); // Give Vault unlimited access (might save gas)\n        strategist = msg.sender;\n        rewards = msg.sender;\n        keeper = msg.sender;\n    }\n\n    /**\n     * @notice\n     *  Used to change `strategist`.\n     *\n     *  This may only be called by governance or the existing strategist.\n     * @param _strategist The new address to assign as `strategist`.\n     */\n    function setStrategist(address _strategist) external onlyAuthorized {\n        strategist = _strategist;\n        emit UpdatedStrategist(_strategist);\n    }\n\n    /**\n     * @notice\n     *  Used to change `keeper`.\n     *\n     *  `keeper` is the only address that may call `tend()` or `harvest()`,\n     *  other than `governance()` or `strategist`. However, unlike\n     *  `governance()` or `strategist`, `keeper` may *only* call `tend()`\n     *  and `harvest()`, and no other authorized functions, following the\n     *  principle of least privilege.\n     *\n     *  This may only be called by governance or the strategist.\n     * @param _keeper The new address to assign as `keeper`.\n     */\n    function setKeeper(address _keeper) external onlyAuthorized {\n        keeper = _keeper;\n        emit UpdatedKeeper(_keeper);\n    }\n\n    /**\n     * @notice\n     *  Used to change `rewards`. Any distributed rewards will cease flowing\n     *  to the old address and begin flowing to this address once the change\n     *  is in effect.\n     *\n     *  This will not change any Strategy reports in progress, only\n     *  new reports made after this change goes into effect.\n     *\n     *  This may only be called by the strategist.\n     * @param _rewards The address to use for collecting rewards.\n     */\n    function setRewards(address _rewards) external onlyStrategist {\n        rewards = _rewards;\n        emit UpdatedRewards(_rewards);\n    }\n\n    /**\n     * @notice\n     *  Used to change `minReportDelay`. `minReportDelay` is the minimum number\n     *  of blocks that should pass before `harvest()` is called.\n     *\n     *  For external keepers (such as the Keep3r network), this is the minimum\n     *  time between jobs, to prevent excessive costs. (see `harvestTrigger()`\n     *  for more details.)\n     *\n     *  This may only be called by governance or the strategist.\n     * @param _delay The minimum number of blocks to wait between harvests.\n     */\n    function setMinReportDelay(uint256 _delay) external onlyAuthorized {\n        minReportDelay = _delay;\n        emit UpdatedReportDelay(_delay);\n    }\n\n    /**\n     * @notice\n     *  Used to change `profitFactor`. `profitFactor` is used to determine\n     *  if it's worthwhile to harvest, given gas costs. (See `harvestTrigger()`\n     *  for more details.)\n     *\n     *  This may only be called by governance or the strategist.\n     * @param _profitFactor A ratio to multiply anticipated\n     * `harvest()` gas cost against.\n     */\n    function setProfitFactor(uint256 _profitFactor) external onlyAuthorized {\n        profitFactor = _profitFactor;\n        emit UpdatedProfitFactor(_profitFactor);\n    }\n\n    /**\n     * @notice\n     *  Sets how far the Strategy can go into loss without a harvest and report\n     *  being required.\n     *\n     *  By default this is 0, meaning any losses would cause a harvest which\n     *  will subsequently report the loss to the Vault for tracking. (See\n     *  `harvestTrigger()` for more details.)\n     *\n     *  This may only be called by governance or the strategist.\n     * @param _debtThreshold How big of a loss this Strategy may carry without\n     * being required to report to the Vault.\n     */\n    function setDebtThreshold(uint256 _debtThreshold) external onlyAuthorized {\n        debtThreshold = _debtThreshold;\n        emit UpdatedDebtThreshold(_debtThreshold);\n    }\n\n    /**\n     * Resolve governance address from Vault contract, used to make assertions\n     * on protected functions in the Strategy.\n     */\n    function governance() internal view returns (address) {\n        return vault.governance();\n    }\n\n    /**\n     * @notice\n     *  Provide an accurate estimate for the total amount of assets\n     *  (principle + return) that this Strategy is currently managing,\n     *  denominated in terms of `want` tokens.\n     *\n     *  This total should be \"realizable\" e.g. the total value that could\n     *  *actually* be obtained from this Strategy if it were to divest its\n     *  entire position based on current on-chain conditions.\n     * @dev\n     *  Care must be taken in using this function, since it relies on external\n     *  systems, which could be manipulated by the attacker to give an inflated\n     *  (or reduced) value produced by this function, based on current on-chain\n     *  conditions (e.g. this function is possible to influence through\n     *  flashloan attacks, oracle manipulations, or other DeFi attack\n     *  mechanisms).\n     *\n     *  It is up to governance to use this function to correctly order this\n     *  Strategy relative to its peers in the withdrawal queue to minimize\n     *  losses for the Vault based on sudden withdrawals. This value should be\n     *  higher than the total debt of the Strategy and higher than its expected\n     *  value to be \"safe\".\n     * @return The estimated total assets in this Strategy.\n     */\n    function estimatedTotalAssets() public virtual view returns (uint256);\n\n    /*\n     * @notice\n     *  Provide an indication of whether this strategy is currently \"active\"\n     *  in that it is managing an active position, or will manage a position in\n     *  the future. This should correlate to `harvest()` activity, so that Harvest\n     *  events can be tracked externally by indexing agents.\n     * @return True if the strategy is actively managing a position.\n     */\n    function isActive() public view returns (bool) {\n        return vault.strategies(address(this)).debtLimit > 0 || estimatedTotalAssets() > 0;\n    }\n\n    /**\n     * Perform any Strategy unwinding or other calls necessary to capture the\n     * \"free return\" this Strategy has generated since the last time its core\n     * position(s) were adjusted. Examples include unwrapping extra rewards.\n     * This call is only used during \"normal operation\" of a Strategy, and\n     * should be optimized to minimize losses as much as possible.\n     *\n     * This method returns any realized profits and/or realized losses\n     * incurred, and should return the total amounts of profits/losses/debt\n     * payments (in `want` tokens) for the Vault's accounting (e.g.\n     * `want.balanceOf(this) >= _debtPayment + _profit - _loss`).\n     *\n     * `_debtOutstanding` will be 0 if the Strategy is not past the configured\n     * debt limit, otherwise its value will be how far past the debt limit\n     * the Strategy is. The Strategy's debt limit is configured in the Vault.\n     *\n     * NOTE: `_debtPayment` should be less than or equal to `_debtOutstanding`.\n     *       It is okay for it to be less than `_debtOutstanding`, as that\n     *       should only used as a guide for how much is left to pay back.\n     *       Payments should be made to minimize loss from slippage, debt,\n     *       withdrawal fees, etc.\n     *\n     * See `vault.debtOutstanding()`.\n     */\n    function prepareReturn(uint256 _debtOutstanding)\n        internal\n        virtual\n        returns (\n            uint256 _profit,\n            uint256 _loss,\n            uint256 _debtPayment\n        );\n\n    /**\n     * Perform any adjustments to the core position(s) of this Strategy given\n     * what change the Vault made in the \"investable capital\" available to the\n     * Strategy. Note that all \"free capital\" in the Strategy after the report\n     * was made is available for reinvestment. Also note that this number\n     * could be 0, and you should handle that scenario accordingly.\n     *\n     * See comments regarding `_debtOutstanding` on `prepareReturn()`.\n     */\n    function adjustPosition(uint256 _debtOutstanding) internal virtual;\n\n    /**\n     * Liquidate up to `_amountNeeded` of `want` of this strategy's positions,\n     * irregardless of slippage. Any excess will be re-invested with `adjustPosition()`.\n     * This function should return the amount of `want` tokens made available by the\n     * liquidation. If there is a difference between them, `_loss` indicates whether the\n     * difference is due to a realized loss, or if there is some other sitution at play\n     * (e.g. locked funds). This function is used during emergency exit instead of\n     * `prepareReturn()` to liquidate all of the Strategy's positions back to the Vault.\n     *\n     * NOTE: The invariant `_amountFreed + _loss <= _amountNeeded` should always be maintained\n     */\n    function liquidatePosition(uint256 _amountNeeded) internal virtual returns (uint256 _liquidatedAmount, uint256 _loss);\n\n    /**\n     *  `Harvest()` calls this function after shares are created during\n     *  `vault.report()`. You can customize this function to any share\n     *  distribution mechanism you want.\n     *\n     *   See `vault.report()` for further details.\n     */\n    function distributeRewards() internal virtual {\n        // Transfer 100% of newly-minted shares awarded to this contract to the rewards address.\n        uint256 balance = vault.balanceOf(address(this));\n        if (balance > 0) {\n            vault.transfer(rewards, balance);\n        }\n    }\n\n    /**\n     * @notice\n     *  Provide a signal to the keeper that `tend()` should be called. The\n     *  keeper will provide the estimated gas cost that they would pay to call\n     *  `tend()`, and this function should use that estimate to make a\n     *  determination if calling it is \"worth it\" for the keeper. This is not\n     *  the only consideration into issuing this trigger, for example if the\n     *  position would be negatively affected if `tend()` is not called\n     *  shortly, then this can return `true` even if the keeper might be\n     *  \"at a loss\" (keepers are always reimbursed by Yearn).\n     * @dev\n     *  `callCost` must be priced in terms of `want`.\n     *\n     *  This call and `harvestTrigger()` should never return `true` at the same\n     *  time.\n     * @param callCost The keeper's estimated cast cost to call `tend()`.\n     * @return `true` if `tend()` should be called, `false` otherwise.\n     */\n    function tendTrigger(uint256 callCost) public virtual view returns (bool) {\n        // We usually don't need tend, but if there are positions that need\n        // active maintainence, overriding this function is how you would\n        // signal for that.\n        return false;\n    }\n\n    /**\n     * @notice\n     *  Adjust the Strategy's position. The purpose of tending isn't to\n     *  realize gains, but to maximize yield by reinvesting any returns.\n     *\n     *  See comments on `adjustPosition()`.\n     *\n     *  This may only be called by governance, the strategist, or the keeper.\n     */\n    function tend() external onlyKeepers {\n        // Don't take profits with this call, but adjust for better gains\n        adjustPosition(vault.debtOutstanding());\n    }\n\n    /**\n     * @notice\n     *  Provide a signal to the keeper that `harvest()` should be called. The\n     *  keeper will provide the estimated gas cost that they would pay to call\n     *  `harvest()`, and this function should use that estimate to make a\n     *  determination if calling it is \"worth it\" for the keeper. This is not\n     *  the only consideration into issuing this trigger, for example if the\n     *  position would be negatively affected if `harvest()` is not called\n     *  shortly, then this can return `true` even if the keeper might be \"at a\n     *  loss\" (keepers are always reimbursed by Yearn).\n     * @dev\n     *  `callCost` must be priced in terms of `want`.\n     *\n     *  This call and `tendTrigger` should never return `true` at the\n     *  same time.\n     *\n     *  See `minReportDelay`, `profitFactor`, `debtThreshold` to adjust the\n     *  strategist-controlled parameters that will influence whether this call\n     *  returns `true` or not. These parameters will be used in conjunction\n     *  with the parameters reported to the Vault (see `params`) to determine\n     *  if calling `harvest()` is merited.\n     *\n     *  It is expected that an external system will check `harvestTrigger()`.\n     *  This could be a script run off a desktop or cloud bot (e.g.\n     *  https://github.com/iearn-finance/yearn-vaults/blob/master/scripts/keep.py),\n     *  or via an integration with the Keep3r network (e.g.\n     *  https://github.com/Macarse/GenericKeep3rV2/blob/master/contracts/keep3r/GenericKeep3rV2.sol).\n     * @param callCost The keeper's estimated cast cost to call `harvest()`.\n     * @return `true` if `harvest()` should be called, `false` otherwise.\n     */\n    function harvestTrigger(uint256 callCost) public virtual view returns (bool) {\n        StrategyParams memory params = vault.strategies(address(this));\n\n        // Should not trigger if Strategy is not activated\n        if (params.activation == 0) return false;\n\n        // Should trigger if hasn't been called in a while\n        if (block.timestamp.sub(params.lastReport) >= minReportDelay) return true;\n\n        // If some amount is owed, pay it back\n        // NOTE: Since debt is adjusted in step-wise fashion, it is appropriate\n        //       to always trigger here, because the resulting change should be\n        //       large (might not always be the case).\n        uint256 outstanding = vault.debtOutstanding();\n        if (outstanding > 0) return true;\n\n        // Check for profits and losses\n        uint256 total = estimatedTotalAssets();\n        // Trigger if we have a loss to report\n        if (total.add(debtThreshold) < params.totalDebt) return true;\n\n        uint256 profit = 0;\n        if (total > params.totalDebt) profit = total.sub(params.totalDebt); // We've earned a profit!\n\n        // Otherwise, only trigger if it \"makes sense\" economically (gas cost\n        // is <N% of value moved)\n        uint256 credit = vault.creditAvailable();\n        return (profitFactor.mul(callCost) < credit.add(profit));\n    }\n\n    /**\n     * @notice\n     *  Harvests the Strategy, recognizing any profits or losses and adjusting\n     *  the Strategy's position.\n     *\n     *  In the rare case the Strategy is in emergency shutdown, this will exit\n     *  the Strategy's position.\n     *\n     *  This may only be called by governance, the strategist, or the keeper.\n     * @dev\n     *  When `harvest()` is called, the Strategy reports to the Vault (via\n     *  `vault.report()`), so in some cases `harvest()` must be called in order\n     *  to take in profits, to borrow newly available funds from the Vault, or\n     *  otherwise adjust its position. In other cases `harvest()` must be\n     *  called to report to the Vault on the Strategy's position, especially if\n     *  any losses have occurred.\n     */\n    function harvest() external onlyKeepers {\n        uint256 profit = 0;\n        uint256 loss = 0;\n        uint256 debtOutstanding = vault.debtOutstanding();\n        uint256 debtPayment = 0;\n        if (emergencyExit) {\n            // Free up as much capital as possible\n            uint256 totalAssets = estimatedTotalAssets();\n            // NOTE: use the larger of total assets or debt outstanding to book losses properly\n            (debtPayment, loss) = liquidatePosition(totalAssets > debtOutstanding ? totalAssets : debtOutstanding);\n            // NOTE: take up any remainder here as profit\n            if (debtPayment > debtOutstanding) {\n                profit = debtPayment.sub(debtOutstanding);\n                debtPayment = debtOutstanding;\n            }\n        } else {\n            // Free up returns for Vault to pull\n            (profit, loss, debtPayment) = prepareReturn(debtOutstanding);\n        }\n\n        // Allow Vault to take up to the \"harvested\" balance of this contract,\n        // which is the amount it has earned since the last time it reported to\n        // the Vault.\n        debtOutstanding = vault.report(profit, loss, debtPayment);\n\n        // Distribute any reward shares earned by the strategy on this report\n        distributeRewards();\n\n        // Check if free returns are left, and re-invest them\n        adjustPosition(debtOutstanding);\n\n        emit Harvested(profit, loss, debtPayment, debtOutstanding);\n    }\n\n    /**\n     * @notice\n     *  Withdraws `_amountNeeded` to `vault`.\n     *\n     *  This may only be called by the Vault.\n     * @param _amountNeeded How much `want` to withdraw.\n     * @return _loss Any realized losses\n     */\n    function withdraw(uint256 _amountNeeded) external returns (uint256 _loss) {\n        require(msg.sender == address(vault), \"!vault\");\n        // Liquidate as much as possible to `want`, up to `_amount`\n        uint256 amountFreed;\n        (amountFreed, _loss) = liquidatePosition(_amountNeeded);\n        // Send it directly back (NOTE: Using `msg.sender` saves some gas here)\n        want.transfer(msg.sender, amountFreed);\n        // NOTE: Reinvest anything leftover on next `tend`/`harvest`\n    }\n\n    /**\n     * Do anything necessary to prepare this Strategy for migration, such as\n     * transferring any reserve or LP tokens, CDPs, or other tokens or stores of\n     * value.\n     */\n    function prepareMigration(address _newStrategy) internal virtual;\n\n    /**\n     * @notice\n     *  Transfers all `want` from this Strategy to `_newStrategy`.\n     *\n     *  This may only be called by governance or the Vault.\n     * @dev\n     *  The new Strategy's Vault must be the same as this Strategy's Vault.\n     * @param _newStrategy The Strategy to migrate to.\n     */\n    function migrate(address _newStrategy) external {\n        require(msg.sender == address(vault) || msg.sender == governance());\n        require(BaseStrategy(_newStrategy).vault() == vault);\n        prepareMigration(_newStrategy);\n        want.transfer(_newStrategy, want.balanceOf(address(this)));\n    }\n\n    /**\n     * @notice\n     *  Activates emergency exit. Once activated, the Strategy will exit its\n     *  position upon the next harvest, depositing all funds into the Vault as\n     *  quickly as is reasonable given on-chain conditions.\n     *\n     *  This may only be called by governance or the strategist.\n     * @dev\n     *  See `vault.setEmergencyShutdown()` and `harvest()` for further details.\n     */\n    function setEmergencyExit() external onlyAuthorized {\n        emergencyExit = true;\n        vault.revokeStrategy();\n    }\n\n    /**\n     * Override this to add all tokens/tokenized positions this contract\n     * manages on a *persistent* basis (e.g. not just for swapping back to\n     * want ephemerally).\n     *\n     * NOTE: Do *not* include `want`, already included in `sweep` below.\n     *\n     * Example:\n     *\n     *    function protectedTokens() internal override view returns (address[] memory) {\n     *      address[] memory protected = new address[](3);\n     *      protected[0] = tokenA;\n     *      protected[1] = tokenB;\n     *      protected[2] = tokenC;\n     *      return protected;\n     *    }\n     */\n    function protectedTokens() internal virtual view returns (address[] memory);\n\n    /**\n     * @notice\n     *  Removes tokens from this Strategy that are not the type of tokens\n     *  managed by this Strategy. This may be used in case of accidentally\n     *  sending the wrong kind of token to this Strategy.\n     *\n     *  Tokens will be sent to `governance()`.\n     *\n     *  This will fail if an attempt is made to sweep `want`, or any tokens\n     *  that are protected by this Strategy.\n     *\n     *  This may only be called by governance.\n     * @dev\n     *  Implement `protectedTokens()` to specify any additional tokens that\n     *  should be protected from sweeping in addition to `want`.\n     * @param _token The token to transfer out of this vault.\n     */\n    function sweep(address _token) external onlyGovernance {\n        require(_token != address(want), \"!want\");\n        require(_token != address(vault), \"!shares\");\n\n        address[] memory _protectedTokens = protectedTokens();\n        for (uint256 i; i < _protectedTokens.length; i++) require(_token != _protectedTokens[i], \"!protected\");\n\n        IERC20(_token).transfer(governance(), IERC20(_token).balanceOf(address(this)));\n    }\n}\n",
  "sourceMap": "",
  "sourcePath": "contracts/BaseStrategy.sol",
  "type": "contract"
}