{
  "contractName": "IAllocationStrategy",
  "abi": [
    {
      "constant": true,
      "inputs": [],
      "name": "underlying",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "exchangeRateStored",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "accrueInterest",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "investAmount",
          "type": "uint256"
        }
      ],
      "name": "investUnderlying",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "redeemAmount",
          "type": "uint256"
        }
      ],
      "name": "redeemUnderlying",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "redeemAll",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "savingsAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "underlyingAmount",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.5.12+commit.7709ece9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[],\"name\":\"accrueInterest\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"exchangeRateStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"investAmount\",\"type\":\"uint256\"}],\"name\":\"investUnderlying\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"redeemAll\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"savingsAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"redeemAmount\",\"type\":\"uint256\"}],\"name\":\"redeemUnderlying\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"underlying\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{\"accrueInterest()\":{\"details\":\"This should calculates interest accrued from the last checkpointed     block up to the current block and writes new checkpoint to storage.\",\"return\":\"bool success(true) or failure(false)\"},\"exchangeRateStored()\":{\"return\":\"uint256 Calculated exchange rate scaled by 1e18     * NOTE:     *   underlying = savingAssets \\u00d7 exchangeRate\"},\"investUnderlying(uint256)\":{\"details\":\"Interst shall be accrued\",\"params\":{\"investAmount\":\"The amount of the underlying asset to supply\"},\"return\":\"uint256 Amount of saving assets created\"},\"redeemAll()\":{\"details\":\"Interst shall be accrued\",\"return\":\"uint256 savingsAmount Amount of savings redeemeduint256 underlyingAmount Amount of underlying redeemed\"},\"redeemUnderlying(uint256)\":{\"details\":\"Interst shall be accrued\",\"params\":{\"redeemAmount\":\"The amount of underlying to redeem\"},\"return\":\"uint256 Amount of saving assets burned\"},\"underlying()\":{\"return\":\"address Underlying asset address\"}}},\"userdoc\":{\"methods\":{\"accrueInterest()\":{\"notice\":\"Applies accrued interest to all savings\"},\"exchangeRateStored()\":{\"notice\":\"Calculates the exchange rate from underlying to saving assets\"},\"investUnderlying(uint256)\":{\"notice\":\"Sender supplies underlying assets into the market and receives saving assets in exchange\"},\"redeemAll()\":{\"notice\":\"Owner redeems all saving assets\"},\"redeemUnderlying(uint256)\":{\"notice\":\"Sender redeems saving assets in exchange for a specified amount of underlying asset\"},\"underlying()\":{\"notice\":\"Underlying asset for the strategy\"}},\"notice\":\"Allocation strategy for assets.        - It invests the underlying assets into some yield generating contracts,          usually lending contracts, in return it gets new assets aka. saving assets.        - Savings assets can be redeemed back to the underlying assets plus interest any time.\"}},\"settings\":{\"compilationTarget\":{\"/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/contracts/IAllocationStrategy.sol\":\"IAllocationStrategy\"},\"evmVersion\":\"petersburg\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/contracts/IAllocationStrategy.sol\":{\"keccak256\":\"0xe6771d9a3f2c4719d6b2c60cd8abf03686d8cdddf5d359ccf7ab58d17d9e1380\",\"urls\":[\"bzz-raw://80f212859923c044b4ef360dc19776149f2aacbb27c994f6b76b9cc8260a41f7\",\"dweb:/ipfs/QmWPsojno4n63Drh9WvBtCM89aovwDuabHppDh1LVgmgkY\"]}},\"version\":1}",
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "sourceMap": "",
  "deployedSourceMap": "",
  "source": "pragma solidity ^0.5.8;\n\n/**\n * @notice Allocation strategy for assets.\n *         - It invests the underlying assets into some yield generating contracts,\n *           usually lending contracts, in return it gets new assets aka. saving assets.\n *         - Savings assets can be redeemed back to the underlying assets plus interest any time.\n */\ninterface IAllocationStrategy {\n\n    /**\n     * @notice Underlying asset for the strategy\n     * @return address Underlying asset address\n     */\n    function underlying() external view returns (address);\n\n    /**\n     * @notice Calculates the exchange rate from underlying to saving assets\n     * @return uint256 Calculated exchange rate scaled by 1e18\n     *\n     * NOTE:\n     *\n     *   underlying = savingAssets × exchangeRate\n     */\n    function exchangeRateStored() external view returns (uint256);\n\n    /**\n      * @notice Applies accrued interest to all savings\n      * @dev This should calculates interest accrued from the last checkpointed\n      *      block up to the current block and writes new checkpoint to storage.\n      * @return bool success(true) or failure(false)\n      */\n    function accrueInterest() external returns (bool);\n\n    /**\n     * @notice Sender supplies underlying assets into the market and receives saving assets in exchange\n     * @dev Interst shall be accrued\n     * @param investAmount The amount of the underlying asset to supply\n     * @return uint256 Amount of saving assets created\n     */\n    function investUnderlying(uint256 investAmount) external returns (uint256);\n\n    /**\n     * @notice Sender redeems saving assets in exchange for a specified amount of underlying asset\n     * @dev Interst shall be accrued\n     * @param redeemAmount The amount of underlying to redeem\n     * @return uint256 Amount of saving assets burned\n     */\n    function redeemUnderlying(uint256 redeemAmount) external returns (uint256);\n\n    /**\n     * @notice Owner redeems all saving assets\n     * @dev Interst shall be accrued\n     * @return uint256 savingsAmount Amount of savings redeemed\n     * @return uint256 underlyingAmount Amount of underlying redeemed\n     */\n    function redeemAll() external returns (uint256 savingsAmount, uint256 underlyingAmount);\n\n}\n",
  "sourcePath": "/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/contracts/IAllocationStrategy.sol",
  "ast": {
    "absolutePath": "/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/contracts/IAllocationStrategy.sol",
    "exportedSymbols": {
      "IAllocationStrategy": [
        6133
      ]
    },
    "id": 6134,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 6096,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".8"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:12"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "interface",
        "documentation": "@notice Allocation strategy for assets.\n        - It invests the underlying assets into some yield generating contracts,\n          usually lending contracts, in return it gets new assets aka. saving assets.\n        - Savings assets can be redeemed back to the underlying assets plus interest any time.",
        "fullyImplemented": false,
        "id": 6133,
        "linearizedBaseContracts": [
          6133
        ],
        "name": "IAllocationStrategy",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": null,
            "documentation": "@notice Underlying asset for the strategy\n@return address Underlying asset address",
            "id": 6101,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "underlying",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6097,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "516:2:12"
            },
            "returnParameters": {
              "id": 6100,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6099,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6101,
                  "src": "542:7:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6098,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "542:7:12",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "541:9:12"
            },
            "scope": 6133,
            "src": "497:54:12",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@notice Calculates the exchange rate from underlying to saving assets\n@return uint256 Calculated exchange rate scaled by 1e18\n     * NOTE:\n     *   underlying = savingAssets × exchangeRate",
            "id": 6106,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "exchangeRateStored",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6102,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "818:2:12"
            },
            "returnParameters": {
              "id": 6105,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6104,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6106,
                  "src": "844:7:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6103,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "844:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "843:9:12"
            },
            "scope": 6133,
            "src": "791:62:12",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@notice Applies accrued interest to all savings\n@dev This should calculates interest accrued from the last checkpointed\n     block up to the current block and writes new checkpoint to storage.\n@return bool success(true) or failure(false)",
            "id": 6111,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "accrueInterest",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6107,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1169:2:12"
            },
            "returnParameters": {
              "id": 6110,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6109,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6111,
                  "src": "1190:4:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 6108,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1190:4:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1189:6:12"
            },
            "scope": 6133,
            "src": "1146:50:12",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@notice Sender supplies underlying assets into the market and receives saving assets in exchange\n@dev Interst shall be accrued\n@param investAmount The amount of the underlying asset to supply\n@return uint256 Amount of saving assets created",
            "id": 6118,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "investUnderlying",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6114,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6113,
                  "name": "investAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6118,
                  "src": "1512:20:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6112,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1512:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1511:22:12"
            },
            "returnParameters": {
              "id": 6117,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6116,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6118,
                  "src": "1552:7:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6115,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1552:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1551:9:12"
            },
            "scope": 6133,
            "src": "1486:75:12",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@notice Sender redeems saving assets in exchange for a specified amount of underlying asset\n@dev Interst shall be accrued\n@param redeemAmount The amount of underlying to redeem\n@return uint256 Amount of saving assets burned",
            "id": 6125,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "redeemUnderlying",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6121,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6120,
                  "name": "redeemAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6125,
                  "src": "1861:20:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6119,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1861:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1860:22:12"
            },
            "returnParameters": {
              "id": 6124,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6123,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6125,
                  "src": "1901:7:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6122,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1901:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1900:9:12"
            },
            "scope": 6133,
            "src": "1835:75:12",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@notice Owner redeems all saving assets\n@dev Interst shall be accrued\n@return uint256 savingsAmount Amount of savings redeemed\n@return uint256 underlyingAmount Amount of underlying redeemed",
            "id": 6132,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "redeemAll",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6126,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2168:2:12"
            },
            "returnParameters": {
              "id": 6131,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6128,
                  "name": "savingsAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6132,
                  "src": "2189:21:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6127,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2189:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6130,
                  "name": "underlyingAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6132,
                  "src": "2212:24:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6129,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2212:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2188:49:12"
            },
            "scope": 6133,
            "src": "2150:88:12",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          }
        ],
        "scope": 6134,
        "src": "347:1894:12"
      }
    ],
    "src": "0:2242:12"
  },
  "legacyAST": {
    "absolutePath": "/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/contracts/IAllocationStrategy.sol",
    "exportedSymbols": {
      "IAllocationStrategy": [
        6133
      ]
    },
    "id": 6134,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 6096,
        "literals": [
          "solidity",
          "^",
          "0.5",
          ".8"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:12"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "interface",
        "documentation": "@notice Allocation strategy for assets.\n        - It invests the underlying assets into some yield generating contracts,\n          usually lending contracts, in return it gets new assets aka. saving assets.\n        - Savings assets can be redeemed back to the underlying assets plus interest any time.",
        "fullyImplemented": false,
        "id": 6133,
        "linearizedBaseContracts": [
          6133
        ],
        "name": "IAllocationStrategy",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": null,
            "documentation": "@notice Underlying asset for the strategy\n@return address Underlying asset address",
            "id": 6101,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "underlying",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6097,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "516:2:12"
            },
            "returnParameters": {
              "id": 6100,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6099,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6101,
                  "src": "542:7:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6098,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "542:7:12",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "541:9:12"
            },
            "scope": 6133,
            "src": "497:54:12",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@notice Calculates the exchange rate from underlying to saving assets\n@return uint256 Calculated exchange rate scaled by 1e18\n     * NOTE:\n     *   underlying = savingAssets × exchangeRate",
            "id": 6106,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "exchangeRateStored",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6102,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "818:2:12"
            },
            "returnParameters": {
              "id": 6105,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6104,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6106,
                  "src": "844:7:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6103,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "844:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "843:9:12"
            },
            "scope": 6133,
            "src": "791:62:12",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@notice Applies accrued interest to all savings\n@dev This should calculates interest accrued from the last checkpointed\n     block up to the current block and writes new checkpoint to storage.\n@return bool success(true) or failure(false)",
            "id": 6111,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "accrueInterest",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6107,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1169:2:12"
            },
            "returnParameters": {
              "id": 6110,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6109,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6111,
                  "src": "1190:4:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 6108,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1190:4:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1189:6:12"
            },
            "scope": 6133,
            "src": "1146:50:12",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@notice Sender supplies underlying assets into the market and receives saving assets in exchange\n@dev Interst shall be accrued\n@param investAmount The amount of the underlying asset to supply\n@return uint256 Amount of saving assets created",
            "id": 6118,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "investUnderlying",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6114,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6113,
                  "name": "investAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6118,
                  "src": "1512:20:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6112,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1512:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1511:22:12"
            },
            "returnParameters": {
              "id": 6117,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6116,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6118,
                  "src": "1552:7:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6115,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1552:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1551:9:12"
            },
            "scope": 6133,
            "src": "1486:75:12",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@notice Sender redeems saving assets in exchange for a specified amount of underlying asset\n@dev Interst shall be accrued\n@param redeemAmount The amount of underlying to redeem\n@return uint256 Amount of saving assets burned",
            "id": 6125,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "redeemUnderlying",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6121,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6120,
                  "name": "redeemAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6125,
                  "src": "1861:20:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6119,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1861:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1860:22:12"
            },
            "returnParameters": {
              "id": 6124,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6123,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6125,
                  "src": "1901:7:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6122,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1901:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1900:9:12"
            },
            "scope": 6133,
            "src": "1835:75:12",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": null,
            "documentation": "@notice Owner redeems all saving assets\n@dev Interst shall be accrued\n@return uint256 savingsAmount Amount of savings redeemed\n@return uint256 underlyingAmount Amount of underlying redeemed",
            "id": 6132,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "redeemAll",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6126,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2168:2:12"
            },
            "returnParameters": {
              "id": 6131,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6128,
                  "name": "savingsAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6132,
                  "src": "2189:21:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6127,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2189:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6130,
                  "name": "underlyingAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6132,
                  "src": "2212:24:12",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6129,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2212:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2188:49:12"
            },
            "scope": 6133,
            "src": "2150:88:12",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          }
        ],
        "scope": 6134,
        "src": "347:1894:12"
      }
    ],
    "src": "0:2242:12"
  },
  "compiler": {
    "name": "solc",
    "version": "0.5.12+commit.7709ece9.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.0.21",
  "updatedAt": "2020-04-22T17:31:54.530Z",
  "devdoc": {
    "methods": {
      "accrueInterest()": {
        "details": "This should calculates interest accrued from the last checkpointed     block up to the current block and writes new checkpoint to storage.",
        "return": "bool success(true) or failure(false)"
      },
      "exchangeRateStored()": {
        "return": "uint256 Calculated exchange rate scaled by 1e18     * NOTE:     *   underlying = savingAssets × exchangeRate"
      },
      "investUnderlying(uint256)": {
        "details": "Interst shall be accrued",
        "params": {
          "investAmount": "The amount of the underlying asset to supply"
        },
        "return": "uint256 Amount of saving assets created"
      },
      "redeemAll()": {
        "details": "Interst shall be accrued",
        "return": "uint256 savingsAmount Amount of savings redeemeduint256 underlyingAmount Amount of underlying redeemed"
      },
      "redeemUnderlying(uint256)": {
        "details": "Interst shall be accrued",
        "params": {
          "redeemAmount": "The amount of underlying to redeem"
        },
        "return": "uint256 Amount of saving assets burned"
      },
      "underlying()": {
        "return": "address Underlying asset address"
      }
    }
  },
  "userdoc": {
    "methods": {
      "accrueInterest()": {
        "notice": "Applies accrued interest to all savings"
      },
      "exchangeRateStored()": {
        "notice": "Calculates the exchange rate from underlying to saving assets"
      },
      "investUnderlying(uint256)": {
        "notice": "Sender supplies underlying assets into the market and receives saving assets in exchange"
      },
      "redeemAll()": {
        "notice": "Owner redeems all saving assets"
      },
      "redeemUnderlying(uint256)": {
        "notice": "Sender redeems saving assets in exchange for a specified amount of underlying asset"
      },
      "underlying()": {
        "notice": "Underlying asset for the strategy"
      }
    },
    "notice": "Allocation strategy for assets.        - It invests the underlying assets into some yield generating contracts,          usually lending contracts, in return it gets new assets aka. saving assets.        - Savings assets can be redeemed back to the underlying assets plus interest any time."
  }
}