{
  "contractName": "CompoundAllocationStrategy",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract CErc20Interface",
          "name": "cToken_",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "isOwner",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "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\":[{\"inputs\":[{\"internalType\":\"contract CErc20Interface\",\"name\":\"cToken_\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"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\":true,\"inputs\":[],\"name\":\"isOwner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"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\":false,\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"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\":\"ISavingStrategy.accrueInterest implementation\"},\"exchangeRateStored()\":{\"details\":\"ISavingStrategy.exchangeRateStored implementation\"},\"investUnderlying(uint256)\":{\"details\":\"ISavingStrategy.investUnderlying implementation\"},\"isOwner()\":{\"details\":\"Returns true if the caller is the current owner.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"redeemAll()\":{\"details\":\"ISavingStrategy.redeemAll implementation\"},\"redeemUnderlying(uint256)\":{\"details\":\"ISavingStrategy.redeemUnderlying implementation\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner.     * NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"underlying()\":{\"details\":\"ISavingStrategy.underlying implementation\"}}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/contracts/CompoundAllocationStrategy.sol\":\"CompoundAllocationStrategy\"},\"evmVersion\":\"petersburg\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/compound/contracts/CErc20Interface.sol\":{\"keccak256\":\"0x3832bb8f3c0e83622c95e8e7f71597bc8241a2f5f393b662455e2c84f33aca0f\",\"urls\":[\"bzz-raw://265795e913b977f65f12af7b17c8de1c04fe12a993e439ed8a9b3ec8f47ff0b5\",\"dweb:/ipfs/QmXtrEgxbSFGwmirLvpbYo1ZeQ3Puze78UJ8MwLxKaUPTB\"]},\"/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/contracts/CompoundAllocationStrategy.sol\":{\"keccak256\":\"0x3be4d54de2735548d7f23ededa851692d17bad80f2f2c59a24aa0508040b9b97\",\"urls\":[\"bzz-raw://4a734933e0f93d4cd4bb29d0b4b6a2871ebee95606ef5252108ea1543649ef75\",\"dweb:/ipfs/QmdS3ko9NwKyRRSBvLghaqFwsuhLR16MVEnnTvRkMQymZs\"]},\"/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/contracts/IAllocationStrategy.sol\":{\"keccak256\":\"0xe6771d9a3f2c4719d6b2c60cd8abf03686d8cdddf5d359ccf7ab58d17d9e1380\",\"urls\":[\"bzz-raw://80f212859923c044b4ef360dc19776149f2aacbb27c994f6b76b9cc8260a41f7\",\"dweb:/ipfs/QmWPsojno4n63Drh9WvBtCM89aovwDuabHppDh1LVgmgkY\"]},\"@openzeppelin/contracts/GSN/Context.sol\":{\"keccak256\":\"0x90a3995645af7562d84b9d69363ffa5ae7217714ab61e951bf7bc450f40e4061\",\"urls\":[\"bzz-raw://216ef9d6b614db4eb46970b4e84903f2534a45572dd30a79f0041f1a5830f436\",\"dweb:/ipfs/QmNPrJ4MWKUAWzKXpUqeyKRUfosaoANZAqXgvepdrCwZAG\"]},\"@openzeppelin/contracts/ownership/Ownable.sol\":{\"keccak256\":\"0xecd8ab29d9a5771c3964d0cd1788c4a5098a0081b20fb275da850a22b1c59806\",\"urls\":[\"bzz-raw://696a75bc2c55407ce8251ccc7d19ecb1b7b2be1796a160a6524312babcc7e3d4\",\"dweb:/ipfs/QmQViKEp3y99h9uhRssE29TmjBKRnFMaoz3eJZ4eggggg2\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe5bb0f57cff3e299f360052ba50f1ea0fff046df2be070b6943e0e3c3fdad8a9\",\"urls\":[\"bzz-raw://59fd025151435da35faa8093a5c7a17de02de9d08ad27275c5cdf05050820d91\",\"dweb:/ipfs/QmQMvwEcPhoRXzbXyrdoeRtvLoifUW9Qh7Luho7bmUPRkc\"]}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b50604051610f39380380610f398339818101604052602081101561003357600080fd5b50516100466001600160e01b0361015416565b600080546001600160a01b0319166001600160a01b03928316178082556040519216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600180546001600160a01b0319166001600160a01b038381169190911791829055604080517f6f307dc300000000000000000000000000000000000000000000000000000000815290519290911691636f307dc391600480820192602092909190829003018186803b15801561010357600080fd5b505afa158015610117573d6000803e3d6000fd5b505050506040513d602081101561012d57600080fd5b5051600280546001600160a01b0319166001600160a01b0390921691909117905550610158565b3390565b610dd2806101676000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80638da5cb5b116100665780638da5cb5b146101295780638f32d59b14610131578063a6afed951461014d578063c17693c014610155578063f2fde38b146101725761009e565b8063182df0f5146100a35780632f4350c2146100bd5780636f307dc3146100de578063715018a614610102578063852a12e31461010c575b600080fd5b6100ab610198565b60408051918252519081900360200190f35b6100c561020e565b6040805192835260208301919091528051918290030190f35b6100e6610495565b604080516001600160a01b039092168252519081900360200190f35b61010a6104da565b005b6100ab6004803603602081101561012257600080fd5b503561056b565b6100e6610833565b610139610842565b604080519115158252519081900360200190f35b610139610866565b6100ab6004803603602081101561016b57600080fd5b50356108de565b61010a6004803603602081101561018857600080fd5b50356001600160a01b0316610c1c565b6001546040805163182df0f560e01b815290516000926001600160a01b03169163182df0f5916004808301926020929190829003018186803b1580156101dd57600080fd5b505afa1580156101f1573d6000803e3d6000fd5b505050506040513d602081101561020757600080fd5b5051905090565b600080610219610842565b610258576040805162461bcd60e51b81526020600482018190526024820152600080516020610d5b833981519152604482015290519081900360640190fd5b600154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b50516001546040805163db006a7560e01b81526004810184905290519294506001600160a01b039091169163db006a75916024808201926020929091908290030181600087803b15801561032057600080fd5b505af1158015610334573d6000803e3d6000fd5b505050506040513d602081101561034a57600080fd5b505115610395576040805162461bcd60e51b815260206004820152601460248201527318d51bdad95b8b9c995919595b4819985a5b195960621b604482015290519081900360640190fd5b600254604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156103e057600080fd5b505afa1580156103f4573d6000803e3d6000fd5b505050506040513d602081101561040a57600080fd5b50516002546040805163a9059cbb60e01b81523360048201526024810184905290519293506001600160a01b039091169163a9059cbb916044808201926020929091908290030181600087803b15801561046357600080fd5b505af1158015610477573d6000803e3d6000fd5b505050506040513d602081101561048d57600080fd5b509192909150565b60015460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b1580156101dd57600080fd5b6104e2610842565b610521576040805162461bcd60e51b81526020600482018190526024820152600080516020610d5b833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610575610842565b6105b4576040805162461bcd60e51b81526020600482018190526024820152600080516020610d5b833981519152604482015290519081900360640190fd5b600154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156105f957600080fd5b505afa15801561060d573d6000803e3d6000fd5b505050506040513d602081101561062357600080fd5b50516001546040805163852a12e360e01b81526004810187905290519293506001600160a01b039091169163852a12e3916024808201926020929091908290030181600087803b15801561067657600080fd5b505af115801561068a573d6000803e3d6000fd5b505050506040513d60208110156106a057600080fd5b5051156106f4576040805162461bcd60e51b815260206004820152601e60248201527f63546f6b656e2e72656465656d556e6465726c79696e67206661696c65640000604482015290519081900360640190fd5b600154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561073957600080fd5b505afa15801561074d573d6000803e3d6000fd5b505050506040513d602081101561076357600080fd5b505190506000828211156107a85760405162461bcd60e51b8152600401808060200182810382526023815260200180610d7b6023913960400191505060405180910390fd5b506002546040805163a9059cbb60e01b8152336004820152602481018790529051838503926001600160a01b03169163a9059cbb9160448083019260209291908290030181600087803b1580156107fe57600080fd5b505af1158015610812573d6000803e3d6000fd5b505050506040513d602081101561082857600080fd5b509095945050505050565b6000546001600160a01b031690565b600080546001600160a01b0316610857610c6f565b6001600160a01b031614905090565b6001546040805163a6afed9560e01b815290516000926001600160a01b03169163a6afed9591600480830192602092919082900301818787803b1580156108ac57600080fd5b505af11580156108c0573d6000803e3d6000fd5b505050506040513d60208110156108d657600080fd5b505115905090565b60006108e8610842565b610927576040805162461bcd60e51b81526020600482018190526024820152600080516020610d5b833981519152604482015290519081900360640190fd5b600254604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561098157600080fd5b505af1158015610995573d6000803e3d6000fd5b505050506040513d60208110156109ab57600080fd5b50506002546001546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b158015610a0657600080fd5b505af1158015610a1a573d6000803e3d6000fd5b505050506040513d6020811015610a3057600080fd5b5050600154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015610a7757600080fd5b505afa158015610a8b573d6000803e3d6000fd5b505050506040513d6020811015610aa157600080fd5b50516001546040805163140e25ad60e31b81526004810187905290519293506001600160a01b039091169163a0712d68916024808201926020929091908290030181600087803b158015610af457600080fd5b505af1158015610b08573d6000803e3d6000fd5b505050506040513d6020811015610b1e57600080fd5b505115610b60576040805162461bcd60e51b815260206004820152600b60248201526a1b5a5b9d0819985a5b195960aa1b604482015290519081900360640190fd5b600154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015610ba557600080fd5b505afa158015610bb9573d6000803e3d6000fd5b505050506040513d6020811015610bcf57600080fd5b50519050600082821015610c145760405162461bcd60e51b8152600401808060200182810382526021815260200180610d3a6021913960400191505060405180910390fd5b500392915050565b610c24610842565b610c63576040805162461bcd60e51b81526020600482018190526024820152600080516020610d5b833981519152604482015290519081900360640190fd5b610c6c81610c73565b50565b3390565b6001600160a01b038116610cb85760405162461bcd60e51b8152600401808060200182810382526026815260200180610d146026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b039290921691909117905556fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373436f6d706f756e64206d696e746564206e6567617469766520616d6f756e74213f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6d706f756e642072656465656d6564206e6567617469766520616d6f756e74213fa265627a7a723158208107cb86673e896fadd0408d398ae6940fe0dc4f5e8c93b0987383596875b17164736f6c634300050c0032",
  "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80638da5cb5b116100665780638da5cb5b146101295780638f32d59b14610131578063a6afed951461014d578063c17693c014610155578063f2fde38b146101725761009e565b8063182df0f5146100a35780632f4350c2146100bd5780636f307dc3146100de578063715018a614610102578063852a12e31461010c575b600080fd5b6100ab610198565b60408051918252519081900360200190f35b6100c561020e565b6040805192835260208301919091528051918290030190f35b6100e6610495565b604080516001600160a01b039092168252519081900360200190f35b61010a6104da565b005b6100ab6004803603602081101561012257600080fd5b503561056b565b6100e6610833565b610139610842565b604080519115158252519081900360200190f35b610139610866565b6100ab6004803603602081101561016b57600080fd5b50356108de565b61010a6004803603602081101561018857600080fd5b50356001600160a01b0316610c1c565b6001546040805163182df0f560e01b815290516000926001600160a01b03169163182df0f5916004808301926020929190829003018186803b1580156101dd57600080fd5b505afa1580156101f1573d6000803e3d6000fd5b505050506040513d602081101561020757600080fd5b5051905090565b600080610219610842565b610258576040805162461bcd60e51b81526020600482018190526024820152600080516020610d5b833981519152604482015290519081900360640190fd5b600154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156102a357600080fd5b505afa1580156102b7573d6000803e3d6000fd5b505050506040513d60208110156102cd57600080fd5b50516001546040805163db006a7560e01b81526004810184905290519294506001600160a01b039091169163db006a75916024808201926020929091908290030181600087803b15801561032057600080fd5b505af1158015610334573d6000803e3d6000fd5b505050506040513d602081101561034a57600080fd5b505115610395576040805162461bcd60e51b815260206004820152601460248201527318d51bdad95b8b9c995919595b4819985a5b195960621b604482015290519081900360640190fd5b600254604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156103e057600080fd5b505afa1580156103f4573d6000803e3d6000fd5b505050506040513d602081101561040a57600080fd5b50516002546040805163a9059cbb60e01b81523360048201526024810184905290519293506001600160a01b039091169163a9059cbb916044808201926020929091908290030181600087803b15801561046357600080fd5b505af1158015610477573d6000803e3d6000fd5b505050506040513d602081101561048d57600080fd5b509192909150565b60015460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b1580156101dd57600080fd5b6104e2610842565b610521576040805162461bcd60e51b81526020600482018190526024820152600080516020610d5b833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610575610842565b6105b4576040805162461bcd60e51b81526020600482018190526024820152600080516020610d5b833981519152604482015290519081900360640190fd5b600154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156105f957600080fd5b505afa15801561060d573d6000803e3d6000fd5b505050506040513d602081101561062357600080fd5b50516001546040805163852a12e360e01b81526004810187905290519293506001600160a01b039091169163852a12e3916024808201926020929091908290030181600087803b15801561067657600080fd5b505af115801561068a573d6000803e3d6000fd5b505050506040513d60208110156106a057600080fd5b5051156106f4576040805162461bcd60e51b815260206004820152601e60248201527f63546f6b656e2e72656465656d556e6465726c79696e67206661696c65640000604482015290519081900360640190fd5b600154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561073957600080fd5b505afa15801561074d573d6000803e3d6000fd5b505050506040513d602081101561076357600080fd5b505190506000828211156107a85760405162461bcd60e51b8152600401808060200182810382526023815260200180610d7b6023913960400191505060405180910390fd5b506002546040805163a9059cbb60e01b8152336004820152602481018790529051838503926001600160a01b03169163a9059cbb9160448083019260209291908290030181600087803b1580156107fe57600080fd5b505af1158015610812573d6000803e3d6000fd5b505050506040513d602081101561082857600080fd5b509095945050505050565b6000546001600160a01b031690565b600080546001600160a01b0316610857610c6f565b6001600160a01b031614905090565b6001546040805163a6afed9560e01b815290516000926001600160a01b03169163a6afed9591600480830192602092919082900301818787803b1580156108ac57600080fd5b505af11580156108c0573d6000803e3d6000fd5b505050506040513d60208110156108d657600080fd5b505115905090565b60006108e8610842565b610927576040805162461bcd60e51b81526020600482018190526024820152600080516020610d5b833981519152604482015290519081900360640190fd5b600254604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561098157600080fd5b505af1158015610995573d6000803e3d6000fd5b505050506040513d60208110156109ab57600080fd5b50506002546001546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b158015610a0657600080fd5b505af1158015610a1a573d6000803e3d6000fd5b505050506040513d6020811015610a3057600080fd5b5050600154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015610a7757600080fd5b505afa158015610a8b573d6000803e3d6000fd5b505050506040513d6020811015610aa157600080fd5b50516001546040805163140e25ad60e31b81526004810187905290519293506001600160a01b039091169163a0712d68916024808201926020929091908290030181600087803b158015610af457600080fd5b505af1158015610b08573d6000803e3d6000fd5b505050506040513d6020811015610b1e57600080fd5b505115610b60576040805162461bcd60e51b815260206004820152600b60248201526a1b5a5b9d0819985a5b195960aa1b604482015290519081900360640190fd5b600154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015610ba557600080fd5b505afa158015610bb9573d6000803e3d6000fd5b505050506040513d6020811015610bcf57600080fd5b50519050600082821015610c145760405162461bcd60e51b8152600401808060200182810382526021815260200180610d3a6021913960400191505060405180910390fd5b500392915050565b610c24610842565b610c63576040805162461bcd60e51b81526020600482018190526024820152600080516020610d5b833981519152604482015290519081900360640190fd5b610c6c81610c73565b50565b3390565b6001600160a01b038116610cb85760405162461bcd60e51b8152600401808060200182810382526026815260200180610d146026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b039290921691909117905556fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373436f6d706f756e64206d696e746564206e6567617469766520616d6f756e74213f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6d706f756e642072656465656d6564206e6567617469766520616d6f756e74213fa265627a7a723158208107cb86673e896fadd0408d398ae6940fe0dc4f5e8c93b0987383596875b17164736f6c634300050c0032",
  "sourceMap": "315:2543:11:-;;;453:122;8:9:-1;5:2;;;30:1;27;20:12;5:2;453:122:11;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;453:122:11;707:12:34;-1:-1:-1;;;;;707:10:34;:12;:::i;:::-;698:6;:21;;-1:-1:-1;;;;;;698:21:34;-1:-1:-1;;;;;698:21:34;;;;;;;734:40;;767:6;;;734:40;;698:6;;734:40;507:6:11;:16;;-1:-1:-1;;;;;;507:16:11;-1:-1:-1;;;;;507:16:11;;;;;;;;;;;548:19;;;;;;;;:6;;;;;:17;;:19;;;;;;;;;;;;;;;:6;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;548:19:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;548:19:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;548:19:11;533:5;:35;;-1:-1:-1;;;;;;533:35:11;-1:-1:-1;;;;;533:35:11;;;;;;;;;-1:-1:-1;315:2543:11;;788:96:30;867:10;788:96;:::o;315:2543:11:-;;;;;;;",
  "deployedSourceMap": "315:2543:11:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;315:2543:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;802:113;;;:::i;:::-;;;;;;;;;;;;;;;;2496:359;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;636:97;;;:::i;:::-;;;;-1:-1:-1;;;;;636:97:11;;;;;;;;;;;;;;1642:137:34;;;:::i;:::-;;1847:589:11;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1847:589:11;;:::i;857:77:34:-;;;:::i;1208:92::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;980:102:11;;;:::i;1149:631::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1149:631:11;;:::i;1928:107:34:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1928:107:34;-1:-1:-1;;;;;1928:107:34;;:::i;802:113:11:-;881:6;;:27;;;-1:-1:-1;;;881:27:11;;;;855:7;;-1:-1:-1;;;;;881:6:11;;:25;;:27;;;;;;;;;;;;;;:6;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;881:27:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;881:27:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;881:27:11;;-1:-1:-1;802:113:11;:::o;2496:359::-;2553:21;2576:24;1061:9:34;:7;:9::i;:::-;1053:54;;;;;-1:-1:-1;;;1053:54:34;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1053:54:34;;;;;;;;;;;;;;;2628:6:11;;:31;;;-1:-1:-1;;;2628:31:11;;2653:4;2628:31;;;;;;-1:-1:-1;;;;;2628:6:11;;;;:16;;:31;;;;;;;;;;;;;;;:6;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;2628:31:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2628:31:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2628:31:11;2677:6;;:28;;;-1:-1:-1;;;2677:28:11;;;;;;;;;;2628:31;;-1:-1:-1;;;;;;2677:6:11;;;;:13;;:28;;;;;2628:31;;2677:28;;;;;;;;:6;;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;2677:28:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2677:28:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2677:28:11;:33;2669:66;;;;;-1:-1:-1;;;2669:66:11;;;;;;;;;;;;-1:-1:-1;;;2669:66:11;;;;;;;;;;;;;;;2764:5;;:30;;;-1:-1:-1;;;2764:30:11;;2788:4;2764:30;;;;;;-1:-1:-1;;;;;2764:5:11;;;;:15;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;2764:30:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2764:30:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2764:30:11;2804:5;;:44;;;-1:-1:-1;;;2804:44:11;;2819:10;2804:44;;;;;;;;;;;;2764:30;;-1:-1:-1;;;;;;2804:5:11;;;;:14;;:44;;;;;2764:30;;2804:44;;;;;;;;:5;;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;2804:44:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2804:44:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2496:359:11;;;;-1:-1:-1;2496:359:11:o;636:97::-;707:6;;:19;;;-1:-1:-1;;;707:19:11;;;;681:7;;-1:-1:-1;;;;;707:6:11;;:17;;:19;;;;;;;;;;;;;;:6;:19;;;5:2:-1;;;;30:1;27;20:12;1642:137:34;1061:9;:7;:9::i;:::-;1053:54;;;;;-1:-1:-1;;;1053:54:34;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1053:54:34;;;;;;;;;;;;;;;1740:1;1724:6;;1703:40;;-1:-1:-1;;;;;1724:6:34;;;;1703:40;;1740:1;;1703:40;1770:1;1753:19;;-1:-1:-1;;;;;;1753:19:34;;;1642:137::o;1847:589:11:-;1923:7;1061:9:34;:7;:9::i;:::-;1053:54;;;;;-1:-1:-1;;;1053:54:34;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1053:54:34;;;;;;;;;;;;;;;1965:6:11;;:20;;;-1:-1:-1;;;1965:20:11;;;;1942;;-1:-1:-1;;;;;1965:6:11;;:18;;:20;;;;;;;;;;;;;;:6;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;1965:20:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1965:20:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1965:20:11;2052:6;;:37;;;-1:-1:-1;;;2052:37:11;;;;;;;;;;1965:20;;-1:-1:-1;;;;;;2052:6:11;;;;:23;;:37;;;;;1965:20;;2052:37;;;;;;;;:6;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;2052:37:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2052:37:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2052:37:11;:42;2044:85;;;;;-1:-1:-1;;;2044:85:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;2161:6;;:20;;;-1:-1:-1;;;2161:20:11;;;;2139:19;;-1:-1:-1;;;;;2161:6:11;;:18;;:20;;;;;;;;;;;;;;:6;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;2161:20:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2161:20:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2161:20:11;;-1:-1:-1;2191:21:11;2230:27;;;;2222:75;;;;-1:-1:-1;;;2222:75:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2359:5:11;;:40;;;-1:-1:-1;;;2359:40:11;;2374:10;2359:40;;;;;;;;;;;;2323:26;;;;-1:-1:-1;;;;;2359:5:11;;:14;;:40;;;;;;;;;;;;;;:5;;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;2359:40:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2359:40:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2416:13:11;;1847:589;-1:-1:-1;;;;;1847:589:11:o;857:77:34:-;895:7;921:6;-1:-1:-1;;;;;921:6:34;857:77;:::o;1208:92::-;1248:4;1287:6;;-1:-1:-1;;;;;1287:6:34;1271:12;:10;:12::i;:::-;-1:-1:-1;;;;;1271:22:34;;1264:29;;1208:92;:::o;980:102:11:-;1047:6;;:23;;;-1:-1:-1;;;1047:23:11;;;;1024:4;;-1:-1:-1;;;;;1047:6:11;;:21;;:23;;;;;;;;;;;;;;1024:4;1047:6;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;1047:23:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1047:23:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1047:23:11;:28;;-1:-1:-1;980:102:11;:::o;1149:631::-;1225:7;1061:9:34;:7;:9::i;:::-;1053:54;;;;;-1:-1:-1;;;1053:54:34;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1053:54:34;;;;;;;;;;;;;;;1244:5:11;;:59;;;-1:-1:-1;;;1244:59:11;;1263:10;1244:59;;;;1283:4;1244:59;;;;;;;;;;;;-1:-1:-1;;;;;1244:5:11;;;;:18;;:59;;;;;;;;;;;;;;;:5;;:59;;;5:2:-1;;;;30:1;27;20:12;5:2;1244:59:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1244:59:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;1313:5:11;;;1335:6;1313:44;;;-1:-1:-1;;;1313:44:11;;-1:-1:-1;;;;;1335:6:11;;;1313:44;;;;;;;;;;;;:5;;;;;:13;;:44;;;;;1244:59;;1313:44;;;;;;;:5;;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;1313:44:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1313:44:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;1390:6:11;;:20;;;-1:-1:-1;;;1390:20:11;;;;1367;;-1:-1:-1;;;;;1390:6:11;;:18;;:20;;;;;1313:44;;1390:20;;;;;;;:6;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;1390:20:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1390:20:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1390:20:11;1475:6;;:25;;;-1:-1:-1;;;1475:25:11;;;;;;;;;;1390:20;;-1:-1:-1;;;;;;1475:6:11;;;;:11;;:25;;;;;1390:20;;1475:25;;;;;;;;:6;;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;1475:25:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1475:25:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1475:25:11;:30;1467:54;;;;;-1:-1:-1;;;1467:54:11;;;;;;;;;;;;-1:-1:-1;;;1467:54:11;;;;;;;;;;;;;;;1553:6;;:20;;;-1:-1:-1;;;1553:20:11;;;;1531:19;;-1:-1:-1;;;;;1553:6:11;;:18;;:20;;;;;;;;;;;;;;:6;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;1553:20:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1553:20:11;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1553:20:11;;-1:-1:-1;1583:22:11;1624:27;;;;1615:74;;;;-1:-1:-1;;;1615:74:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1716:26:11;;1149:631;-1:-1:-1;;1149:631:11:o;1928:107:34:-;1061:9;:7;:9::i;:::-;1053:54;;;;;-1:-1:-1;;;1053:54:34;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1053:54:34;;;;;;;;;;;;;;;2000:28;2019:8;2000:18;:28::i;:::-;1928:107;:::o;788:96:30:-;867:10;788:96;:::o;2136:225:34:-;-1:-1:-1;;;;;2209:22:34;;2201:73;;;;-1:-1:-1;;;2201:73:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:6;;;2289:38;;-1:-1:-1;;;;;2289:38:34;;;;2310:6;;;2289:38;;;2337:6;:17;;-1:-1:-1;;;;;;2337:17:34;-1:-1:-1;;;;;2337:17:34;;;;;;;;;;2136:225::o",
  "source": "pragma solidity >=0.5.10 <0.6.0;\n\nimport {IAllocationStrategy} from \"./IAllocationStrategy.sol\";\nimport {Ownable} from \"@openzeppelin/contracts/ownership/Ownable.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {CErc20Interface} from \"../compound/contracts/CErc20Interface.sol\";\n\ncontract CompoundAllocationStrategy is IAllocationStrategy, Ownable {\n\n    CErc20Interface private cToken;\n    IERC20 private token;\n\n    constructor(CErc20Interface cToken_) public {\n        cToken = cToken_;\n        token = IERC20(cToken.underlying());\n    }\n\n    /// @dev ISavingStrategy.underlying implementation\n    function underlying() external view returns (address) {\n        return cToken.underlying();\n    }\n\n    /// @dev ISavingStrategy.exchangeRateStored implementation\n    function exchangeRateStored() external view returns (uint256) {\n        return cToken.exchangeRateStored();\n    }\n\n    /// @dev ISavingStrategy.accrueInterest implementation\n    function accrueInterest() external returns (bool) {\n        return cToken.accrueInterest() == 0;\n    }\n\n    /// @dev ISavingStrategy.investUnderlying implementation\n    function investUnderlying(uint256 investAmount) external onlyOwner returns (uint256) {\n        token.transferFrom(msg.sender, address(this), investAmount);\n        token.approve(address(cToken), investAmount);\n        uint256 cTotalBefore = cToken.totalSupply();\n        // TODO should we handle mint failure?\n        require(cToken.mint(investAmount) == 0, \"mint failed\");\n        uint256 cTotalAfter = cToken.totalSupply();\n        uint256 cCreatedAmount;\n        require (cTotalAfter >= cTotalBefore, \"Compound minted negative amount!?\");\n        cCreatedAmount = cTotalAfter - cTotalBefore;\n        return cCreatedAmount;\n    }\n\n    /// @dev ISavingStrategy.redeemUnderlying implementation\n    function redeemUnderlying(uint256 redeemAmount) external onlyOwner returns (uint256) {\n        uint256 cTotalBefore = cToken.totalSupply();\n        // TODO should we handle redeem failure?\n        require(cToken.redeemUnderlying(redeemAmount) == 0, \"cToken.redeemUnderlying failed\");\n        uint256 cTotalAfter = cToken.totalSupply();\n        uint256 cBurnedAmount;\n        require(cTotalAfter <= cTotalBefore, \"Compound redeemed negative amount!?\");\n        cBurnedAmount = cTotalBefore - cTotalAfter;\n        token.transfer(msg.sender, redeemAmount);\n        return cBurnedAmount;\n    }\n\n    /// @dev ISavingStrategy.redeemAll implementation\n    function redeemAll() external onlyOwner\n        returns (uint256 savingsAmount, uint256 underlyingAmount) {\n        savingsAmount = cToken.balanceOf(address(this));\n        require(cToken.redeem(savingsAmount) == 0, \"cToken.redeem failed\");\n        underlyingAmount = token.balanceOf(address(this));\n        token.transfer(msg.sender, underlyingAmount);\n    }\n\n}\n",
  "sourcePath": "/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/contracts/CompoundAllocationStrategy.sol",
  "ast": {
    "absolutePath": "/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/contracts/CompoundAllocationStrategy.sol",
    "exportedSymbols": {
      "CompoundAllocationStrategy": [
        6094
      ]
    },
    "id": 6095,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 5853,
        "literals": [
          "solidity",
          ">=",
          "0.5",
          ".10",
          "<",
          "0.6",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:32:11"
      },
      {
        "absolutePath": "/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/contracts/IAllocationStrategy.sol",
        "file": "./IAllocationStrategy.sol",
        "id": 5855,
        "nodeType": "ImportDirective",
        "scope": 6095,
        "sourceUnit": 6134,
        "src": "34:62:11",
        "symbolAliases": [
          {
            "foreign": 5854,
            "local": null
          }
        ],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/ownership/Ownable.sol",
        "file": "@openzeppelin/contracts/ownership/Ownable.sol",
        "id": 5857,
        "nodeType": "ImportDirective",
        "scope": 6095,
        "sourceUnit": 10969,
        "src": "97:70:11",
        "symbolAliases": [
          {
            "foreign": 5856,
            "local": null
          }
        ],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/token/ERC20/IERC20.sol",
        "file": "@openzeppelin/contracts/token/ERC20/IERC20.sol",
        "id": 5859,
        "nodeType": "ImportDirective",
        "scope": 6095,
        "sourceUnit": 11471,
        "src": "168:70:11",
        "symbolAliases": [
          {
            "foreign": 5858,
            "local": null
          }
        ],
        "unitAlias": ""
      },
      {
        "absolutePath": "/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/compound/contracts/CErc20Interface.sol",
        "file": "../compound/contracts/CErc20Interface.sol",
        "id": 5861,
        "nodeType": "ImportDirective",
        "scope": 6095,
        "sourceUnit": 701,
        "src": "239:74:11",
        "symbolAliases": [
          {
            "foreign": 5860,
            "local": null
          }
        ],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 5862,
              "name": "IAllocationStrategy",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 6133,
              "src": "354:19:11",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IAllocationStrategy_$6133",
                "typeString": "contract IAllocationStrategy"
              }
            },
            "id": 5863,
            "nodeType": "InheritanceSpecifier",
            "src": "354:19:11"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 5864,
              "name": "Ownable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 10968,
              "src": "375:7:11",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Ownable_$10968",
                "typeString": "contract Ownable"
              }
            },
            "id": 5865,
            "nodeType": "InheritanceSpecifier",
            "src": "375:7:11"
          }
        ],
        "contractDependencies": [
          6133,
          10479,
          10968
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 6094,
        "linearizedBaseContracts": [
          6094,
          10968,
          10479,
          6133
        ],
        "name": "CompoundAllocationStrategy",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 5867,
            "name": "cToken",
            "nodeType": "VariableDeclaration",
            "scope": 6094,
            "src": "390:30:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_CErc20Interface_$700",
              "typeString": "contract CErc20Interface"
            },
            "typeName": {
              "contractScope": null,
              "id": 5866,
              "name": "CErc20Interface",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 700,
              "src": "390:15:11",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_CErc20Interface_$700",
                "typeString": "contract CErc20Interface"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 5869,
            "name": "token",
            "nodeType": "VariableDeclaration",
            "scope": 6094,
            "src": "426:20:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$11470",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 5868,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 11470,
              "src": "426:6:11",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$11470",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 5886,
              "nodeType": "Block",
              "src": "497:78:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5876,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 5874,
                      "name": "cToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5867,
                      "src": "507:6:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_CErc20Interface_$700",
                        "typeString": "contract CErc20Interface"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5875,
                      "name": "cToken_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5871,
                      "src": "516:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_CErc20Interface_$700",
                        "typeString": "contract CErc20Interface"
                      }
                    },
                    "src": "507:16:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_CErc20Interface_$700",
                      "typeString": "contract CErc20Interface"
                    }
                  },
                  "id": 5877,
                  "nodeType": "ExpressionStatement",
                  "src": "507:16:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5884,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 5878,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5869,
                      "src": "533:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$11470",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5880,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5867,
                              "src": "548:6:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CErc20Interface_$700",
                                "typeString": "contract CErc20Interface"
                              }
                            },
                            "id": 5881,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "underlying",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 403,
                            "src": "548:17:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                              "typeString": "function () view external returns (address)"
                            }
                          },
                          "id": 5882,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "548:19:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 5879,
                        "name": "IERC20",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11470,
                        "src": "541:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_IERC20_$11470_$",
                          "typeString": "type(contract IERC20)"
                        }
                      },
                      "id": 5883,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "541:27:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$11470",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "533:35:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$11470",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 5885,
                  "nodeType": "ExpressionStatement",
                  "src": "533:35:11"
                }
              ]
            },
            "documentation": null,
            "id": 5887,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5872,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5871,
                  "name": "cToken_",
                  "nodeType": "VariableDeclaration",
                  "scope": 5887,
                  "src": "465:23:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_CErc20Interface_$700",
                    "typeString": "contract CErc20Interface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 5870,
                    "name": "CErc20Interface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 700,
                    "src": "465:15:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_CErc20Interface_$700",
                      "typeString": "contract CErc20Interface"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "464:25:11"
            },
            "returnParameters": {
              "id": 5873,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "497:0:11"
            },
            "scope": 6094,
            "src": "453:122:11",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5896,
              "nodeType": "Block",
              "src": "690:43:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5892,
                        "name": "cToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5867,
                        "src": "707:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CErc20Interface_$700",
                          "typeString": "contract CErc20Interface"
                        }
                      },
                      "id": 5893,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "underlying",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 403,
                      "src": "707:17:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                        "typeString": "function () view external returns (address)"
                      }
                    },
                    "id": 5894,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "707:19:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5891,
                  "id": 5895,
                  "nodeType": "Return",
                  "src": "700:26:11"
                }
              ]
            },
            "documentation": "@dev ISavingStrategy.underlying implementation",
            "id": 5897,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "underlying",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5888,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "655:2:11"
            },
            "returnParameters": {
              "id": 5891,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5890,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5897,
                  "src": "681:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5889,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "681:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "680:9:11"
            },
            "scope": 6094,
            "src": "636:97:11",
            "stateMutability": "view",
            "superFunction": 6101,
            "visibility": "external"
          },
          {
            "body": {
              "id": 5906,
              "nodeType": "Block",
              "src": "864:51:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5902,
                        "name": "cToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5867,
                        "src": "881:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CErc20Interface_$700",
                          "typeString": "contract CErc20Interface"
                        }
                      },
                      "id": 5903,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "exchangeRateStored",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 322,
                      "src": "881:25:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                        "typeString": "function () view external returns (uint256)"
                      }
                    },
                    "id": 5904,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "881:27:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 5901,
                  "id": 5905,
                  "nodeType": "Return",
                  "src": "874:34:11"
                }
              ]
            },
            "documentation": "@dev ISavingStrategy.exchangeRateStored implementation",
            "id": 5907,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "exchangeRateStored",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5898,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "829:2:11"
            },
            "returnParameters": {
              "id": 5901,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5900,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5907,
                  "src": "855:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5899,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "855:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "854:9:11"
            },
            "scope": 6094,
            "src": "802:113:11",
            "stateMutability": "view",
            "superFunction": 6106,
            "visibility": "external"
          },
          {
            "body": {
              "id": 5918,
              "nodeType": "Block",
              "src": "1030:52:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5916,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "expression": {
                          "argumentTypes": null,
                          "id": 5912,
                          "name": "cToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5867,
                          "src": "1047:6:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CErc20Interface_$700",
                            "typeString": "contract CErc20Interface"
                          }
                        },
                        "id": 5913,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "accrueInterest",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 451,
                        "src": "1047:21:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_nonpayable$__$returns$_t_uint256_$",
                          "typeString": "function () external returns (uint256)"
                        }
                      },
                      "id": 5914,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1047:23:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 5915,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1074:1:11",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "1047:28:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 5911,
                  "id": 5917,
                  "nodeType": "Return",
                  "src": "1040:35:11"
                }
              ]
            },
            "documentation": "@dev ISavingStrategy.accrueInterest implementation",
            "id": 5919,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "accrueInterest",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5908,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1003:2:11"
            },
            "returnParameters": {
              "id": 5911,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5910,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5919,
                  "src": "1024:4:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5909,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1024:4:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1023:6:11"
            },
            "scope": 6094,
            "src": "980:102:11",
            "stateMutability": "nonpayable",
            "superFunction": 6111,
            "visibility": "external"
          },
          {
            "body": {
              "id": 5988,
              "nodeType": "Block",
              "src": "1234:546:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 5931,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11485,
                          "src": "1263:3:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 5932,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1263:10:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5934,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11531,
                            "src": "1283:4:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CompoundAllocationStrategy_$6094",
                              "typeString": "contract CompoundAllocationStrategy"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_CompoundAllocationStrategy_$6094",
                              "typeString": "contract CompoundAllocationStrategy"
                            }
                          ],
                          "id": 5933,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1275:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5935,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1275:13:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 5936,
                        "name": "investAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5921,
                        "src": "1290:12:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5928,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5869,
                        "src": "1244:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$11470",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 5930,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 11453,
                      "src": "1244:18:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,address,uint256) external returns (bool)"
                      }
                    },
                    "id": 5937,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1244:59:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5938,
                  "nodeType": "ExpressionStatement",
                  "src": "1244:59:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5943,
                            "name": "cToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5867,
                            "src": "1335:6:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CErc20Interface_$700",
                              "typeString": "contract CErc20Interface"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_CErc20Interface_$700",
                              "typeString": "contract CErc20Interface"
                            }
                          ],
                          "id": 5942,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1327:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5944,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1327:15:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 5945,
                        "name": "investAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5921,
                        "src": "1344:12:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5939,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5869,
                        "src": "1313:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$11470",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 5941,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "approve",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 11442,
                      "src": "1313:13:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 5946,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1313:44:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5947,
                  "nodeType": "ExpressionStatement",
                  "src": "1313:44:11"
                },
                {
                  "assignments": [
                    5949
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5949,
                      "name": "cTotalBefore",
                      "nodeType": "VariableDeclaration",
                      "scope": 5988,
                      "src": "1367:20:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5948,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1367:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5953,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5950,
                        "name": "cToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5867,
                        "src": "1390:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CErc20Interface_$700",
                          "typeString": "contract CErc20Interface"
                        }
                      },
                      "id": 5951,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "totalSupply",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 317,
                      "src": "1390:18:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                        "typeString": "function () view external returns (uint256)"
                      }
                    },
                    "id": 5952,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1390:20:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1367:43:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 5960,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5957,
                              "name": "investAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5921,
                              "src": "1487:12:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5955,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5867,
                              "src": "1475:6:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CErc20Interface_$700",
                                "typeString": "contract CErc20Interface"
                              }
                            },
                            "id": 5956,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mint",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 446,
                            "src": "1475:11:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) external returns (uint256)"
                            }
                          },
                          "id": 5958,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1475:25:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 5959,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1504:1:11",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "1475:30:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6d696e74206661696c6564",
                        "id": 5961,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1507:13:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_594ff2dfc35e5b8979a04d047bc1811cd0832013e67a9ef5bc97a173e7a27efb",
                          "typeString": "literal_string \"mint failed\""
                        },
                        "value": "mint failed"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_594ff2dfc35e5b8979a04d047bc1811cd0832013e67a9ef5bc97a173e7a27efb",
                          "typeString": "literal_string \"mint failed\""
                        }
                      ],
                      "id": 5954,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        11488,
                        11489
                      ],
                      "referencedDeclaration": 11489,
                      "src": "1467:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5962,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1467:54:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5963,
                  "nodeType": "ExpressionStatement",
                  "src": "1467:54:11"
                },
                {
                  "assignments": [
                    5965
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5965,
                      "name": "cTotalAfter",
                      "nodeType": "VariableDeclaration",
                      "scope": 5988,
                      "src": "1531:19:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5964,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1531:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5969,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5966,
                        "name": "cToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5867,
                        "src": "1553:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CErc20Interface_$700",
                          "typeString": "contract CErc20Interface"
                        }
                      },
                      "id": 5967,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "totalSupply",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 317,
                      "src": "1553:18:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                        "typeString": "function () view external returns (uint256)"
                      }
                    },
                    "id": 5968,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1553:20:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1531:42:11"
                },
                {
                  "assignments": [
                    5971
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5971,
                      "name": "cCreatedAmount",
                      "nodeType": "VariableDeclaration",
                      "scope": 5988,
                      "src": "1583:22:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5970,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1583:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5972,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1583:22:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 5976,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 5974,
                          "name": "cTotalAfter",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5965,
                          "src": "1624:11:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 5975,
                          "name": "cTotalBefore",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5949,
                          "src": "1639:12:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "1624:27:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "436f6d706f756e64206d696e746564206e6567617469766520616d6f756e74213f",
                        "id": 5977,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1653:35:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_24b1726633e20294c191278b3a064860df0d5c729481b76b9c4095bb00d70226",
                          "typeString": "literal_string \"Compound minted negative amount!?\""
                        },
                        "value": "Compound minted negative amount!?"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_24b1726633e20294c191278b3a064860df0d5c729481b76b9c4095bb00d70226",
                          "typeString": "literal_string \"Compound minted negative amount!?\""
                        }
                      ],
                      "id": 5973,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        11488,
                        11489
                      ],
                      "referencedDeclaration": 11489,
                      "src": "1615:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5978,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1615:74:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5979,
                  "nodeType": "ExpressionStatement",
                  "src": "1615:74:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5984,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 5980,
                      "name": "cCreatedAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5971,
                      "src": "1699:14:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 5983,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 5981,
                        "name": "cTotalAfter",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5965,
                        "src": "1716:11:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "-",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 5982,
                        "name": "cTotalBefore",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5949,
                        "src": "1730:12:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "1716:26:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "1699:43:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5985,
                  "nodeType": "ExpressionStatement",
                  "src": "1699:43:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5986,
                    "name": "cCreatedAmount",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 5971,
                    "src": "1759:14:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 5927,
                  "id": 5987,
                  "nodeType": "Return",
                  "src": "1752:21:11"
                }
              ]
            },
            "documentation": "@dev ISavingStrategy.investUnderlying implementation",
            "id": 5989,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 5924,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 5923,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 10901,
                  "src": "1206:9:11",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1206:9:11"
              }
            ],
            "name": "investUnderlying",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5922,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5921,
                  "name": "investAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 5989,
                  "src": "1175:20:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5920,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1175:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1174:22:11"
            },
            "returnParameters": {
              "id": 5927,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5926,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5989,
                  "src": "1225:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5925,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1225:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1224:9:11"
            },
            "scope": 6094,
            "src": "1149:631:11",
            "stateMutability": "nonpayable",
            "superFunction": 6118,
            "visibility": "external"
          },
          {
            "body": {
              "id": 6046,
              "nodeType": "Block",
              "src": "1932:504:11",
              "statements": [
                {
                  "assignments": [
                    5999
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5999,
                      "name": "cTotalBefore",
                      "nodeType": "VariableDeclaration",
                      "scope": 6046,
                      "src": "1942:20:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5998,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1942:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6003,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6000,
                        "name": "cToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5867,
                        "src": "1965:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CErc20Interface_$700",
                          "typeString": "contract CErc20Interface"
                        }
                      },
                      "id": 6001,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "totalSupply",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 317,
                      "src": "1965:18:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                        "typeString": "function () view external returns (uint256)"
                      }
                    },
                    "id": 6002,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1965:20:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1942:43:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 6010,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6007,
                              "name": "redeemAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5991,
                              "src": "2076:12:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6005,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5867,
                              "src": "2052:6:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CErc20Interface_$700",
                                "typeString": "contract CErc20Interface"
                              }
                            },
                            "id": 6006,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "redeemUnderlying",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 422,
                            "src": "2052:23:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) external returns (uint256)"
                            }
                          },
                          "id": 6008,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2052:37:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 6009,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2093:1:11",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "2052:42:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "63546f6b656e2e72656465656d556e6465726c79696e67206661696c6564",
                        "id": 6011,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2096:32:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f84dd453bde49cd5069e23538066239c0f863e0c5f8242fbe0cdb0ba9937b35e",
                          "typeString": "literal_string \"cToken.redeemUnderlying failed\""
                        },
                        "value": "cToken.redeemUnderlying failed"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f84dd453bde49cd5069e23538066239c0f863e0c5f8242fbe0cdb0ba9937b35e",
                          "typeString": "literal_string \"cToken.redeemUnderlying failed\""
                        }
                      ],
                      "id": 6004,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        11488,
                        11489
                      ],
                      "referencedDeclaration": 11489,
                      "src": "2044:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6012,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2044:85:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6013,
                  "nodeType": "ExpressionStatement",
                  "src": "2044:85:11"
                },
                {
                  "assignments": [
                    6015
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6015,
                      "name": "cTotalAfter",
                      "nodeType": "VariableDeclaration",
                      "scope": 6046,
                      "src": "2139:19:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6014,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "2139:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6019,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6016,
                        "name": "cToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5867,
                        "src": "2161:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CErc20Interface_$700",
                          "typeString": "contract CErc20Interface"
                        }
                      },
                      "id": 6017,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "totalSupply",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 317,
                      "src": "2161:18:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                        "typeString": "function () view external returns (uint256)"
                      }
                    },
                    "id": 6018,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2161:20:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2139:42:11"
                },
                {
                  "assignments": [
                    6021
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6021,
                      "name": "cBurnedAmount",
                      "nodeType": "VariableDeclaration",
                      "scope": 6046,
                      "src": "2191:21:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6020,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "2191:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6022,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2191:21:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 6026,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 6024,
                          "name": "cTotalAfter",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6015,
                          "src": "2230:11:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 6025,
                          "name": "cTotalBefore",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5999,
                          "src": "2245:12:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "2230:27:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "436f6d706f756e642072656465656d6564206e6567617469766520616d6f756e74213f",
                        "id": 6027,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2259:37:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_e62359ab1c41a9f58776254e080eedac247beff16dcf9f0893cffc5d5c234aea",
                          "typeString": "literal_string \"Compound redeemed negative amount!?\""
                        },
                        "value": "Compound redeemed negative amount!?"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_e62359ab1c41a9f58776254e080eedac247beff16dcf9f0893cffc5d5c234aea",
                          "typeString": "literal_string \"Compound redeemed negative amount!?\""
                        }
                      ],
                      "id": 6023,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        11488,
                        11489
                      ],
                      "referencedDeclaration": 11489,
                      "src": "2222:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6028,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2222:75:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6029,
                  "nodeType": "ExpressionStatement",
                  "src": "2222:75:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6034,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 6030,
                      "name": "cBurnedAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6021,
                      "src": "2307:13:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 6033,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 6031,
                        "name": "cTotalBefore",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5999,
                        "src": "2323:12:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "-",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 6032,
                        "name": "cTotalAfter",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6015,
                        "src": "2338:11:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "2323:26:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2307:42:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 6035,
                  "nodeType": "ExpressionStatement",
                  "src": "2307:42:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 6039,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11485,
                          "src": "2374:3:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 6040,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2374:10:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6041,
                        "name": "redeemAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5991,
                        "src": "2386:12:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6036,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5869,
                        "src": "2359:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$11470",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 6038,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 11424,
                      "src": "2359:14:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 6042,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2359:40:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 6043,
                  "nodeType": "ExpressionStatement",
                  "src": "2359:40:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6044,
                    "name": "cBurnedAmount",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 6021,
                    "src": "2416:13:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 5997,
                  "id": 6045,
                  "nodeType": "Return",
                  "src": "2409:20:11"
                }
              ]
            },
            "documentation": "@dev ISavingStrategy.redeemUnderlying implementation",
            "id": 6047,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 5994,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 5993,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 10901,
                  "src": "1904:9:11",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1904:9:11"
              }
            ],
            "name": "redeemUnderlying",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5992,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5991,
                  "name": "redeemAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6047,
                  "src": "1873:20:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5990,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1873:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1872:22:11"
            },
            "returnParameters": {
              "id": 5997,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5996,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6047,
                  "src": "1923:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5995,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1923:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1922:9:11"
            },
            "scope": 6094,
            "src": "1847:589:11",
            "stateMutability": "nonpayable",
            "superFunction": 6125,
            "visibility": "external"
          },
          {
            "body": {
              "id": 6092,
              "nodeType": "Block",
              "src": "2602:253:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6063,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 6056,
                      "name": "savingsAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6052,
                      "src": "2612:13:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6060,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11531,
                              "src": "2653:4:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CompoundAllocationStrategy_$6094",
                                "typeString": "contract CompoundAllocationStrategy"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_CompoundAllocationStrategy_$6094",
                                "typeString": "contract CompoundAllocationStrategy"
                              }
                            ],
                            "id": 6059,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2645:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 6061,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2645:13:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 6057,
                          "name": "cToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5867,
                          "src": "2628:6:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CErc20Interface_$700",
                            "typeString": "contract CErc20Interface"
                          }
                        },
                        "id": 6058,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balanceOf",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 410,
                        "src": "2628:16:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view external returns (uint256)"
                        }
                      },
                      "id": 6062,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2628:31:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2612:47:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 6064,
                  "nodeType": "ExpressionStatement",
                  "src": "2612:47:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 6071,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6068,
                              "name": "savingsAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6052,
                              "src": "2691:13:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6066,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5867,
                              "src": "2677:6:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CErc20Interface_$700",
                                "typeString": "contract CErc20Interface"
                              }
                            },
                            "id": 6067,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "redeem",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 520,
                            "src": "2677:13:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) external returns (uint256)"
                            }
                          },
                          "id": 6069,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2677:28:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 6070,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2709:1:11",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "2677:33:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "63546f6b656e2e72656465656d206661696c6564",
                        "id": 6072,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2712:22:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_80d44e8ff0f570ac54ec05a0af3616b464d988de7dcc75f87a0e3332cd94b6b6",
                          "typeString": "literal_string \"cToken.redeem failed\""
                        },
                        "value": "cToken.redeem failed"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_80d44e8ff0f570ac54ec05a0af3616b464d988de7dcc75f87a0e3332cd94b6b6",
                          "typeString": "literal_string \"cToken.redeem failed\""
                        }
                      ],
                      "id": 6065,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        11488,
                        11489
                      ],
                      "referencedDeclaration": 11489,
                      "src": "2669:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6073,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2669:66:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6074,
                  "nodeType": "ExpressionStatement",
                  "src": "2669:66:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6082,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 6075,
                      "name": "underlyingAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6054,
                      "src": "2745:16:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6079,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11531,
                              "src": "2788:4:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CompoundAllocationStrategy_$6094",
                                "typeString": "contract CompoundAllocationStrategy"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_CompoundAllocationStrategy_$6094",
                                "typeString": "contract CompoundAllocationStrategy"
                              }
                            ],
                            "id": 6078,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2780:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 6080,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2780:13:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 6076,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5869,
                          "src": "2764:5:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$11470",
                            "typeString": "contract IERC20"
                          }
                        },
                        "id": 6077,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balanceOf",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 11415,
                        "src": "2764:15:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view external returns (uint256)"
                        }
                      },
                      "id": 6081,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2764:30:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2745:49:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 6083,
                  "nodeType": "ExpressionStatement",
                  "src": "2745:49:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 6087,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11485,
                          "src": "2819:3:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 6088,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2819:10:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6089,
                        "name": "underlyingAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6054,
                        "src": "2831:16:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6084,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5869,
                        "src": "2804:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$11470",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 6086,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 11424,
                      "src": "2804:14:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 6090,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2804:44:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 6091,
                  "nodeType": "ExpressionStatement",
                  "src": "2804:44:11"
                }
              ]
            },
            "documentation": "@dev ISavingStrategy.redeemAll implementation",
            "id": 6093,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 6050,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 6049,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 10901,
                  "src": "2526:9:11",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2526:9:11"
              }
            ],
            "name": "redeemAll",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6048,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2514:2:11"
            },
            "returnParameters": {
              "id": 6055,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6052,
                  "name": "savingsAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6093,
                  "src": "2553:21:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6051,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2553:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6054,
                  "name": "underlyingAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6093,
                  "src": "2576:24:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6053,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2576:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2552:49:11"
            },
            "scope": 6094,
            "src": "2496:359:11",
            "stateMutability": "nonpayable",
            "superFunction": 6132,
            "visibility": "external"
          }
        ],
        "scope": 6095,
        "src": "315:2543:11"
      }
    ],
    "src": "0:2859:11"
  },
  "legacyAST": {
    "absolutePath": "/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/contracts/CompoundAllocationStrategy.sol",
    "exportedSymbols": {
      "CompoundAllocationStrategy": [
        6094
      ]
    },
    "id": 6095,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 5853,
        "literals": [
          "solidity",
          ">=",
          "0.5",
          ".10",
          "<",
          "0.6",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:32:11"
      },
      {
        "absolutePath": "/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/contracts/IAllocationStrategy.sol",
        "file": "./IAllocationStrategy.sol",
        "id": 5855,
        "nodeType": "ImportDirective",
        "scope": 6095,
        "sourceUnit": 6134,
        "src": "34:62:11",
        "symbolAliases": [
          {
            "foreign": 5854,
            "local": null
          }
        ],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/ownership/Ownable.sol",
        "file": "@openzeppelin/contracts/ownership/Ownable.sol",
        "id": 5857,
        "nodeType": "ImportDirective",
        "scope": 6095,
        "sourceUnit": 10969,
        "src": "97:70:11",
        "symbolAliases": [
          {
            "foreign": 5856,
            "local": null
          }
        ],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts/token/ERC20/IERC20.sol",
        "file": "@openzeppelin/contracts/token/ERC20/IERC20.sol",
        "id": 5859,
        "nodeType": "ImportDirective",
        "scope": 6095,
        "sourceUnit": 11471,
        "src": "168:70:11",
        "symbolAliases": [
          {
            "foreign": 5858,
            "local": null
          }
        ],
        "unitAlias": ""
      },
      {
        "absolutePath": "/home/runner/work/rtoken-contracts/rtoken-contracts/packages/contracts/compound/contracts/CErc20Interface.sol",
        "file": "../compound/contracts/CErc20Interface.sol",
        "id": 5861,
        "nodeType": "ImportDirective",
        "scope": 6095,
        "sourceUnit": 701,
        "src": "239:74:11",
        "symbolAliases": [
          {
            "foreign": 5860,
            "local": null
          }
        ],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 5862,
              "name": "IAllocationStrategy",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 6133,
              "src": "354:19:11",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IAllocationStrategy_$6133",
                "typeString": "contract IAllocationStrategy"
              }
            },
            "id": 5863,
            "nodeType": "InheritanceSpecifier",
            "src": "354:19:11"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 5864,
              "name": "Ownable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 10968,
              "src": "375:7:11",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Ownable_$10968",
                "typeString": "contract Ownable"
              }
            },
            "id": 5865,
            "nodeType": "InheritanceSpecifier",
            "src": "375:7:11"
          }
        ],
        "contractDependencies": [
          6133,
          10479,
          10968
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 6094,
        "linearizedBaseContracts": [
          6094,
          10968,
          10479,
          6133
        ],
        "name": "CompoundAllocationStrategy",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 5867,
            "name": "cToken",
            "nodeType": "VariableDeclaration",
            "scope": 6094,
            "src": "390:30:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_CErc20Interface_$700",
              "typeString": "contract CErc20Interface"
            },
            "typeName": {
              "contractScope": null,
              "id": 5866,
              "name": "CErc20Interface",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 700,
              "src": "390:15:11",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_CErc20Interface_$700",
                "typeString": "contract CErc20Interface"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 5869,
            "name": "token",
            "nodeType": "VariableDeclaration",
            "scope": 6094,
            "src": "426:20:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$11470",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 5868,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 11470,
              "src": "426:6:11",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$11470",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 5886,
              "nodeType": "Block",
              "src": "497:78:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5876,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 5874,
                      "name": "cToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5867,
                      "src": "507:6:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_CErc20Interface_$700",
                        "typeString": "contract CErc20Interface"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 5875,
                      "name": "cToken_",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5871,
                      "src": "516:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_CErc20Interface_$700",
                        "typeString": "contract CErc20Interface"
                      }
                    },
                    "src": "507:16:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_CErc20Interface_$700",
                      "typeString": "contract CErc20Interface"
                    }
                  },
                  "id": 5877,
                  "nodeType": "ExpressionStatement",
                  "src": "507:16:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5884,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 5878,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5869,
                      "src": "533:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$11470",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5880,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5867,
                              "src": "548:6:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CErc20Interface_$700",
                                "typeString": "contract CErc20Interface"
                              }
                            },
                            "id": 5881,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "underlying",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 403,
                            "src": "548:17:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                              "typeString": "function () view external returns (address)"
                            }
                          },
                          "id": 5882,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "548:19:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 5879,
                        "name": "IERC20",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11470,
                        "src": "541:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_IERC20_$11470_$",
                          "typeString": "type(contract IERC20)"
                        }
                      },
                      "id": 5883,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "541:27:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$11470",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "533:35:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$11470",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 5885,
                  "nodeType": "ExpressionStatement",
                  "src": "533:35:11"
                }
              ]
            },
            "documentation": null,
            "id": 5887,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5872,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5871,
                  "name": "cToken_",
                  "nodeType": "VariableDeclaration",
                  "scope": 5887,
                  "src": "465:23:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_CErc20Interface_$700",
                    "typeString": "contract CErc20Interface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 5870,
                    "name": "CErc20Interface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 700,
                    "src": "465:15:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_CErc20Interface_$700",
                      "typeString": "contract CErc20Interface"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "464:25:11"
            },
            "returnParameters": {
              "id": 5873,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "497:0:11"
            },
            "scope": 6094,
            "src": "453:122:11",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5896,
              "nodeType": "Block",
              "src": "690:43:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5892,
                        "name": "cToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5867,
                        "src": "707:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CErc20Interface_$700",
                          "typeString": "contract CErc20Interface"
                        }
                      },
                      "id": 5893,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "underlying",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 403,
                      "src": "707:17:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                        "typeString": "function () view external returns (address)"
                      }
                    },
                    "id": 5894,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "707:19:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5891,
                  "id": 5895,
                  "nodeType": "Return",
                  "src": "700:26:11"
                }
              ]
            },
            "documentation": "@dev ISavingStrategy.underlying implementation",
            "id": 5897,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "underlying",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5888,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "655:2:11"
            },
            "returnParameters": {
              "id": 5891,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5890,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5897,
                  "src": "681:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5889,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "681:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "680:9:11"
            },
            "scope": 6094,
            "src": "636:97:11",
            "stateMutability": "view",
            "superFunction": 6101,
            "visibility": "external"
          },
          {
            "body": {
              "id": 5906,
              "nodeType": "Block",
              "src": "864:51:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5902,
                        "name": "cToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5867,
                        "src": "881:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CErc20Interface_$700",
                          "typeString": "contract CErc20Interface"
                        }
                      },
                      "id": 5903,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "exchangeRateStored",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 322,
                      "src": "881:25:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                        "typeString": "function () view external returns (uint256)"
                      }
                    },
                    "id": 5904,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "881:27:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 5901,
                  "id": 5905,
                  "nodeType": "Return",
                  "src": "874:34:11"
                }
              ]
            },
            "documentation": "@dev ISavingStrategy.exchangeRateStored implementation",
            "id": 5907,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "exchangeRateStored",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5898,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "829:2:11"
            },
            "returnParameters": {
              "id": 5901,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5900,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5907,
                  "src": "855:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5899,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "855:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "854:9:11"
            },
            "scope": 6094,
            "src": "802:113:11",
            "stateMutability": "view",
            "superFunction": 6106,
            "visibility": "external"
          },
          {
            "body": {
              "id": 5918,
              "nodeType": "Block",
              "src": "1030:52:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5916,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "expression": {
                          "argumentTypes": null,
                          "id": 5912,
                          "name": "cToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5867,
                          "src": "1047:6:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CErc20Interface_$700",
                            "typeString": "contract CErc20Interface"
                          }
                        },
                        "id": 5913,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "accrueInterest",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 451,
                        "src": "1047:21:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_nonpayable$__$returns$_t_uint256_$",
                          "typeString": "function () external returns (uint256)"
                        }
                      },
                      "id": 5914,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1047:23:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 5915,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1074:1:11",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "1047:28:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 5911,
                  "id": 5917,
                  "nodeType": "Return",
                  "src": "1040:35:11"
                }
              ]
            },
            "documentation": "@dev ISavingStrategy.accrueInterest implementation",
            "id": 5919,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "accrueInterest",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5908,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1003:2:11"
            },
            "returnParameters": {
              "id": 5911,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5910,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5919,
                  "src": "1024:4:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5909,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1024:4:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1023:6:11"
            },
            "scope": 6094,
            "src": "980:102:11",
            "stateMutability": "nonpayable",
            "superFunction": 6111,
            "visibility": "external"
          },
          {
            "body": {
              "id": 5988,
              "nodeType": "Block",
              "src": "1234:546:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 5931,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11485,
                          "src": "1263:3:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 5932,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1263:10:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5934,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11531,
                            "src": "1283:4:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CompoundAllocationStrategy_$6094",
                              "typeString": "contract CompoundAllocationStrategy"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_CompoundAllocationStrategy_$6094",
                              "typeString": "contract CompoundAllocationStrategy"
                            }
                          ],
                          "id": 5933,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1275:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5935,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1275:13:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 5936,
                        "name": "investAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5921,
                        "src": "1290:12:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5928,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5869,
                        "src": "1244:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$11470",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 5930,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 11453,
                      "src": "1244:18:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,address,uint256) external returns (bool)"
                      }
                    },
                    "id": 5937,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1244:59:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5938,
                  "nodeType": "ExpressionStatement",
                  "src": "1244:59:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 5943,
                            "name": "cToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5867,
                            "src": "1335:6:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CErc20Interface_$700",
                              "typeString": "contract CErc20Interface"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_CErc20Interface_$700",
                              "typeString": "contract CErc20Interface"
                            }
                          ],
                          "id": 5942,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1327:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 5944,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1327:15:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 5945,
                        "name": "investAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5921,
                        "src": "1344:12:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5939,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5869,
                        "src": "1313:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$11470",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 5941,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "approve",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 11442,
                      "src": "1313:13:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 5946,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1313:44:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5947,
                  "nodeType": "ExpressionStatement",
                  "src": "1313:44:11"
                },
                {
                  "assignments": [
                    5949
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5949,
                      "name": "cTotalBefore",
                      "nodeType": "VariableDeclaration",
                      "scope": 5988,
                      "src": "1367:20:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5948,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1367:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5953,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5950,
                        "name": "cToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5867,
                        "src": "1390:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CErc20Interface_$700",
                          "typeString": "contract CErc20Interface"
                        }
                      },
                      "id": 5951,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "totalSupply",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 317,
                      "src": "1390:18:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                        "typeString": "function () view external returns (uint256)"
                      }
                    },
                    "id": 5952,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1390:20:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1367:43:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 5960,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5957,
                              "name": "investAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5921,
                              "src": "1487:12:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5955,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5867,
                              "src": "1475:6:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CErc20Interface_$700",
                                "typeString": "contract CErc20Interface"
                              }
                            },
                            "id": 5956,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mint",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 446,
                            "src": "1475:11:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) external returns (uint256)"
                            }
                          },
                          "id": 5958,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1475:25:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 5959,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1504:1:11",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "1475:30:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "6d696e74206661696c6564",
                        "id": 5961,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1507:13:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_594ff2dfc35e5b8979a04d047bc1811cd0832013e67a9ef5bc97a173e7a27efb",
                          "typeString": "literal_string \"mint failed\""
                        },
                        "value": "mint failed"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_594ff2dfc35e5b8979a04d047bc1811cd0832013e67a9ef5bc97a173e7a27efb",
                          "typeString": "literal_string \"mint failed\""
                        }
                      ],
                      "id": 5954,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        11488,
                        11489
                      ],
                      "referencedDeclaration": 11489,
                      "src": "1467:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5962,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1467:54:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5963,
                  "nodeType": "ExpressionStatement",
                  "src": "1467:54:11"
                },
                {
                  "assignments": [
                    5965
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5965,
                      "name": "cTotalAfter",
                      "nodeType": "VariableDeclaration",
                      "scope": 5988,
                      "src": "1531:19:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5964,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1531:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5969,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 5966,
                        "name": "cToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5867,
                        "src": "1553:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CErc20Interface_$700",
                          "typeString": "contract CErc20Interface"
                        }
                      },
                      "id": 5967,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "totalSupply",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 317,
                      "src": "1553:18:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                        "typeString": "function () view external returns (uint256)"
                      }
                    },
                    "id": 5968,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1553:20:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1531:42:11"
                },
                {
                  "assignments": [
                    5971
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5971,
                      "name": "cCreatedAmount",
                      "nodeType": "VariableDeclaration",
                      "scope": 5988,
                      "src": "1583:22:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5970,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1583:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5972,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1583:22:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 5976,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 5974,
                          "name": "cTotalAfter",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5965,
                          "src": "1624:11:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 5975,
                          "name": "cTotalBefore",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5949,
                          "src": "1639:12:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "1624:27:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "436f6d706f756e64206d696e746564206e6567617469766520616d6f756e74213f",
                        "id": 5977,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1653:35:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_24b1726633e20294c191278b3a064860df0d5c729481b76b9c4095bb00d70226",
                          "typeString": "literal_string \"Compound minted negative amount!?\""
                        },
                        "value": "Compound minted negative amount!?"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_24b1726633e20294c191278b3a064860df0d5c729481b76b9c4095bb00d70226",
                          "typeString": "literal_string \"Compound minted negative amount!?\""
                        }
                      ],
                      "id": 5973,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        11488,
                        11489
                      ],
                      "referencedDeclaration": 11489,
                      "src": "1615:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5978,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1615:74:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5979,
                  "nodeType": "ExpressionStatement",
                  "src": "1615:74:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5984,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 5980,
                      "name": "cCreatedAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5971,
                      "src": "1699:14:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 5983,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 5981,
                        "name": "cTotalAfter",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5965,
                        "src": "1716:11:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "-",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 5982,
                        "name": "cTotalBefore",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5949,
                        "src": "1730:12:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "1716:26:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "1699:43:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5985,
                  "nodeType": "ExpressionStatement",
                  "src": "1699:43:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 5986,
                    "name": "cCreatedAmount",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 5971,
                    "src": "1759:14:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 5927,
                  "id": 5987,
                  "nodeType": "Return",
                  "src": "1752:21:11"
                }
              ]
            },
            "documentation": "@dev ISavingStrategy.investUnderlying implementation",
            "id": 5989,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 5924,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 5923,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 10901,
                  "src": "1206:9:11",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1206:9:11"
              }
            ],
            "name": "investUnderlying",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5922,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5921,
                  "name": "investAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 5989,
                  "src": "1175:20:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5920,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1175:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1174:22:11"
            },
            "returnParameters": {
              "id": 5927,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5926,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 5989,
                  "src": "1225:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5925,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1225:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1224:9:11"
            },
            "scope": 6094,
            "src": "1149:631:11",
            "stateMutability": "nonpayable",
            "superFunction": 6118,
            "visibility": "external"
          },
          {
            "body": {
              "id": 6046,
              "nodeType": "Block",
              "src": "1932:504:11",
              "statements": [
                {
                  "assignments": [
                    5999
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5999,
                      "name": "cTotalBefore",
                      "nodeType": "VariableDeclaration",
                      "scope": 6046,
                      "src": "1942:20:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5998,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1942:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6003,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6000,
                        "name": "cToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5867,
                        "src": "1965:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CErc20Interface_$700",
                          "typeString": "contract CErc20Interface"
                        }
                      },
                      "id": 6001,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "totalSupply",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 317,
                      "src": "1965:18:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                        "typeString": "function () view external returns (uint256)"
                      }
                    },
                    "id": 6002,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1965:20:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1942:43:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 6010,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6007,
                              "name": "redeemAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5991,
                              "src": "2076:12:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6005,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5867,
                              "src": "2052:6:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CErc20Interface_$700",
                                "typeString": "contract CErc20Interface"
                              }
                            },
                            "id": 6006,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "redeemUnderlying",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 422,
                            "src": "2052:23:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) external returns (uint256)"
                            }
                          },
                          "id": 6008,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2052:37:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 6009,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2093:1:11",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "2052:42:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "63546f6b656e2e72656465656d556e6465726c79696e67206661696c6564",
                        "id": 6011,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2096:32:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f84dd453bde49cd5069e23538066239c0f863e0c5f8242fbe0cdb0ba9937b35e",
                          "typeString": "literal_string \"cToken.redeemUnderlying failed\""
                        },
                        "value": "cToken.redeemUnderlying failed"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f84dd453bde49cd5069e23538066239c0f863e0c5f8242fbe0cdb0ba9937b35e",
                          "typeString": "literal_string \"cToken.redeemUnderlying failed\""
                        }
                      ],
                      "id": 6004,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        11488,
                        11489
                      ],
                      "referencedDeclaration": 11489,
                      "src": "2044:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6012,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2044:85:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6013,
                  "nodeType": "ExpressionStatement",
                  "src": "2044:85:11"
                },
                {
                  "assignments": [
                    6015
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6015,
                      "name": "cTotalAfter",
                      "nodeType": "VariableDeclaration",
                      "scope": 6046,
                      "src": "2139:19:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6014,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "2139:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6019,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6016,
                        "name": "cToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5867,
                        "src": "2161:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CErc20Interface_$700",
                          "typeString": "contract CErc20Interface"
                        }
                      },
                      "id": 6017,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "totalSupply",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 317,
                      "src": "2161:18:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                        "typeString": "function () view external returns (uint256)"
                      }
                    },
                    "id": 6018,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2161:20:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2139:42:11"
                },
                {
                  "assignments": [
                    6021
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6021,
                      "name": "cBurnedAmount",
                      "nodeType": "VariableDeclaration",
                      "scope": 6046,
                      "src": "2191:21:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6020,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "2191:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 6022,
                  "initialValue": null,
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2191:21:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 6026,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 6024,
                          "name": "cTotalAfter",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6015,
                          "src": "2230:11:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 6025,
                          "name": "cTotalBefore",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5999,
                          "src": "2245:12:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "2230:27:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "436f6d706f756e642072656465656d6564206e6567617469766520616d6f756e74213f",
                        "id": 6027,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2259:37:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_e62359ab1c41a9f58776254e080eedac247beff16dcf9f0893cffc5d5c234aea",
                          "typeString": "literal_string \"Compound redeemed negative amount!?\""
                        },
                        "value": "Compound redeemed negative amount!?"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_e62359ab1c41a9f58776254e080eedac247beff16dcf9f0893cffc5d5c234aea",
                          "typeString": "literal_string \"Compound redeemed negative amount!?\""
                        }
                      ],
                      "id": 6023,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        11488,
                        11489
                      ],
                      "referencedDeclaration": 11489,
                      "src": "2222:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6028,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2222:75:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6029,
                  "nodeType": "ExpressionStatement",
                  "src": "2222:75:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6034,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 6030,
                      "name": "cBurnedAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6021,
                      "src": "2307:13:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 6033,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 6031,
                        "name": "cTotalBefore",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5999,
                        "src": "2323:12:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "-",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 6032,
                        "name": "cTotalAfter",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6015,
                        "src": "2338:11:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "2323:26:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2307:42:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 6035,
                  "nodeType": "ExpressionStatement",
                  "src": "2307:42:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 6039,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11485,
                          "src": "2374:3:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 6040,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2374:10:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6041,
                        "name": "redeemAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5991,
                        "src": "2386:12:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6036,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5869,
                        "src": "2359:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$11470",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 6038,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 11424,
                      "src": "2359:14:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 6042,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2359:40:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 6043,
                  "nodeType": "ExpressionStatement",
                  "src": "2359:40:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6044,
                    "name": "cBurnedAmount",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 6021,
                    "src": "2416:13:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 5997,
                  "id": 6045,
                  "nodeType": "Return",
                  "src": "2409:20:11"
                }
              ]
            },
            "documentation": "@dev ISavingStrategy.redeemUnderlying implementation",
            "id": 6047,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 5994,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 5993,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 10901,
                  "src": "1904:9:11",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1904:9:11"
              }
            ],
            "name": "redeemUnderlying",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5992,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5991,
                  "name": "redeemAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6047,
                  "src": "1873:20:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5990,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1873:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1872:22:11"
            },
            "returnParameters": {
              "id": 5997,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5996,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 6047,
                  "src": "1923:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5995,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1923:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1922:9:11"
            },
            "scope": 6094,
            "src": "1847:589:11",
            "stateMutability": "nonpayable",
            "superFunction": 6125,
            "visibility": "external"
          },
          {
            "body": {
              "id": 6092,
              "nodeType": "Block",
              "src": "2602:253:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6063,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 6056,
                      "name": "savingsAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6052,
                      "src": "2612:13:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6060,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11531,
                              "src": "2653:4:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CompoundAllocationStrategy_$6094",
                                "typeString": "contract CompoundAllocationStrategy"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_CompoundAllocationStrategy_$6094",
                                "typeString": "contract CompoundAllocationStrategy"
                              }
                            ],
                            "id": 6059,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2645:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 6061,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2645:13:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 6057,
                          "name": "cToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5867,
                          "src": "2628:6:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CErc20Interface_$700",
                            "typeString": "contract CErc20Interface"
                          }
                        },
                        "id": 6058,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balanceOf",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 410,
                        "src": "2628:16:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view external returns (uint256)"
                        }
                      },
                      "id": 6062,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2628:31:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2612:47:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 6064,
                  "nodeType": "ExpressionStatement",
                  "src": "2612:47:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 6071,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6068,
                              "name": "savingsAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6052,
                              "src": "2691:13:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6066,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5867,
                              "src": "2677:6:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CErc20Interface_$700",
                                "typeString": "contract CErc20Interface"
                              }
                            },
                            "id": 6067,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "redeem",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 520,
                            "src": "2677:13:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) external returns (uint256)"
                            }
                          },
                          "id": 6069,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2677:28:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 6070,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2709:1:11",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "2677:33:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "63546f6b656e2e72656465656d206661696c6564",
                        "id": 6072,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2712:22:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_80d44e8ff0f570ac54ec05a0af3616b464d988de7dcc75f87a0e3332cd94b6b6",
                          "typeString": "literal_string \"cToken.redeem failed\""
                        },
                        "value": "cToken.redeem failed"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_80d44e8ff0f570ac54ec05a0af3616b464d988de7dcc75f87a0e3332cd94b6b6",
                          "typeString": "literal_string \"cToken.redeem failed\""
                        }
                      ],
                      "id": 6065,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        11488,
                        11489
                      ],
                      "referencedDeclaration": 11489,
                      "src": "2669:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6073,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2669:66:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6074,
                  "nodeType": "ExpressionStatement",
                  "src": "2669:66:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6082,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 6075,
                      "name": "underlyingAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6054,
                      "src": "2745:16:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6079,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11531,
                              "src": "2788:4:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CompoundAllocationStrategy_$6094",
                                "typeString": "contract CompoundAllocationStrategy"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_CompoundAllocationStrategy_$6094",
                                "typeString": "contract CompoundAllocationStrategy"
                              }
                            ],
                            "id": 6078,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2780:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 6080,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2780:13:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 6076,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5869,
                          "src": "2764:5:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$11470",
                            "typeString": "contract IERC20"
                          }
                        },
                        "id": 6077,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balanceOf",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 11415,
                        "src": "2764:15:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view external returns (uint256)"
                        }
                      },
                      "id": 6081,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2764:30:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2745:49:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 6083,
                  "nodeType": "ExpressionStatement",
                  "src": "2745:49:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 6087,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11485,
                          "src": "2819:3:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 6088,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2819:10:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 6089,
                        "name": "underlyingAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6054,
                        "src": "2831:16:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6084,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5869,
                        "src": "2804:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$11470",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 6086,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 11424,
                      "src": "2804:14:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 6090,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2804:44:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 6091,
                  "nodeType": "ExpressionStatement",
                  "src": "2804:44:11"
                }
              ]
            },
            "documentation": "@dev ISavingStrategy.redeemAll implementation",
            "id": 6093,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 6050,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 6049,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 10901,
                  "src": "2526:9:11",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2526:9:11"
              }
            ],
            "name": "redeemAll",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6048,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2514:2:11"
            },
            "returnParameters": {
              "id": 6055,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6052,
                  "name": "savingsAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6093,
                  "src": "2553:21:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6051,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2553:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6054,
                  "name": "underlyingAmount",
                  "nodeType": "VariableDeclaration",
                  "scope": 6093,
                  "src": "2576:24:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6053,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2576:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2552:49:11"
            },
            "scope": 6094,
            "src": "2496:359:11",
            "stateMutability": "nonpayable",
            "superFunction": 6132,
            "visibility": "external"
          }
        ],
        "scope": 6095,
        "src": "315:2543:11"
      }
    ],
    "src": "0:2859:11"
  },
  "compiler": {
    "name": "solc",
    "version": "0.5.12+commit.7709ece9.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.0.21",
  "updatedAt": "2020-04-22T17:31:54.528Z",
  "devdoc": {
    "methods": {
      "accrueInterest()": {
        "details": "ISavingStrategy.accrueInterest implementation"
      },
      "exchangeRateStored()": {
        "details": "ISavingStrategy.exchangeRateStored implementation"
      },
      "investUnderlying(uint256)": {
        "details": "ISavingStrategy.investUnderlying implementation"
      },
      "isOwner()": {
        "details": "Returns true if the caller is the current owner."
      },
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "redeemAll()": {
        "details": "ISavingStrategy.redeemAll implementation"
      },
      "redeemUnderlying(uint256)": {
        "details": "ISavingStrategy.redeemUnderlying implementation"
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner.     * NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      },
      "underlying()": {
        "details": "ISavingStrategy.underlying implementation"
      }
    }
  },
  "userdoc": {
    "methods": {}
  }
}