{
  "contractName": "AbstractGoodStaking",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "intrestToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "intrestTokenValue",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "tokenValue",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "tokenPrecisionLoss",
          "type": "uint256"
        }
      ],
      "name": "InterestCollected",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "staker",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "remainingBalance",
          "type": "uint256"
        }
      ],
      "name": "StakeWithdraw",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "staker",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Staked",
      "type": "event"
    },
    {
      "constant": true,
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "stakers",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "stakedToken",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "lastStake",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "stake",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [],
      "name": "withdrawStake",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "currentTokenWorth",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "currentUBIInterest",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        }
      ],
      "name": "collectUBIInterest",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"intrestToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"intrestTokenValue\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenValue\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenPrecisionLoss\",\"type\":\"uint256\"}],\"name\":\"InterestCollected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remainingBalance\",\"type\":\"uint256\"}],\"name\":\"StakeWithdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"collectUBIInterest\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"currentTokenWorth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"currentUBIInterest\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"stake\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"stakers\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stakedToken\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastStake\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawStake\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{\"collectUBIInterest(address)\":{\"details\":\"collect gained interest by fundmanager\",\"params\":{\"recipient\":\"of intrestToken gains\"},\"return\":\"Intrest gained on lending the tokens.Intrest gained on lending the tokens in terms of token rate.Token's precision loss due to decimal difference.average intrest donation ratio.\"},\"currentTokenWorth()\":{\"details\":\"calculates the holding of intrestToken by staking contract in terms of token value.\",\"return\":\"It will return the token worth of intrest token that contract is holding.\"},\"currentUBIInterest()\":{\"details\":\"calculates the tokenGain, intrestTokenGain and precisionLossToken\",\"return\":\"Intrest gained on lending the tokens.Intrest gained on lending the tokens in terms of token rate.Token's precision loss due to decimal difference.\"},\"stake(uint256)\":{\"details\":\"stake some tokens\",\"params\":{\"amount\":\"of Tokens to stake\"}},\"withdrawStake()\":{\"details\":\"withdraw staked tokens\"}},\"title\":\"Abstract contract that holds all the data, events and functions for staking contract. The staking contract will inherit this interface\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/stakingModel/contracts/AbstractGoodStaking.sol\":\"AbstractGoodStaking\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/stakingModel/contracts/AbstractGoodStaking.sol\":{\"keccak256\":\"0xc643ae3414da5106369e6ccef59e2d48cddf24a84a4c1d19aeba40f40e3e04c6\",\"urls\":[\"bzz-raw://c60810ba3a3a92532ddd129c99ad727dc23d6f8fe94050796bde02f5f54cc21a\",\"dweb:/ipfs/QmQ92c7u8vi5Dc56MqeVx6hJsEjx3GFgBC47hKMHzbVwij\"]}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b506101ce806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806317e49ca114610067578063374559901461008d5780639168ae72146100df578063a694fc3a1461011e578063bed9d8611461013d578063e0b3f30514610145575b600080fd5b61006f61015f565b60408051938452602084019290925282820152519081900360600190f35b6100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610169565b6040805194855260208501939093528383019190915263ffffffff166060830152519081900360800190f35b610105600480360360208110156100f557600080fd5b50356001600160a01b0316610176565b6040805192835260208301919091528051918290030190f35b61013b6004803603602081101561013457600080fd5b503561018f565b005b61013b610192565b61014d610194565b60408051918252519081900360200190f35b6000806000909192565b6000806000809193509193565b6000602081905290815260409020805460019091015482565b50565b565b60009056fea265627a7a723158207b1b07cbf211ba7d5e4209100e6084c0328c2dfbe8fcb11b01529ba35925488b64736f6c63430005100032",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100625760003560e01c806317e49ca114610067578063374559901461008d5780639168ae72146100df578063a694fc3a1461011e578063bed9d8611461013d578063e0b3f30514610145575b600080fd5b61006f61015f565b60408051938452602084019290925282820152519081900360600190f35b6100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610169565b6040805194855260208501939093528383019190915263ffffffff166060830152519081900360800190f35b610105600480360360208110156100f557600080fd5b50356001600160a01b0316610176565b6040805192835260208301919091528051918290030190f35b61013b6004803603602081101561013457600080fd5b503561018f565b005b61013b610192565b61014d610194565b60408051918252519081900360200190f35b6000806000909192565b6000806000809193509193565b6000602081905290815260409020805460019091015482565b50565b565b60009056fea265627a7a723158207b1b07cbf211ba7d5e4209100e6084c0328c2dfbe8fcb11b01529ba35925488b64736f6c63430005100032",
  "sourceMap": "184:3472:20:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;184:3472:20;;;;;;;",
  "deployedSourceMap": "184:3472:20:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;184:3472:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2190:156;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2706:180;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2706:180:20;-1:-1:-1;;;;;2706:180:20;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;523:41;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;523:41:20;-1:-1:-1;;;;;523:41:20;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1491:42;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1491:42:20;;:::i;:::-;;1590:36;;;:::i;1833:63::-;;;:::i;:::-;;;;;;;;;;;;;;;;2190:156;2280:7;2301;2322;2190:156;;;:::o;2706:180::-;2800:7;2821;2842;2863:6;2706:180;;;;;:::o;523:41::-;;;;;;;;;;;;;;;;;;;;:::o;1491:42::-;;:::o;1590:36::-;:::o;1833:63::-;1885:7;1833:63;:::o",
  "source": "pragma solidity >0.5.4;\n\n/**\n * @title Abstract contract that holds all the data,\n * events and functions for staking contract.\n * The staking contract will inherit this interface\n */\ncontract AbstractGoodStaking {\n    /**\n     * @dev Structure to store staking details.\n     * It contains amount of tokens staked and blocknumber at which last staked.\n     */\n    struct Staker {\n        uint256 stakedToken;\n        uint256 lastStake;\n    }\n\n    /**\n     * @dev Mapping to store staking details for each user.\n     */\n    mapping(address => Staker) public stakers;\n\n    /**\n     * @dev Emitted when `staker` stake `value` tokens of `token`\n     */\n    event Staked(address indexed staker, address token, uint256 value);\n\n    /**\n     * @dev Emitted when `staker` withdraws their stake `value` tokens and contracts balance will\n     * be reduced to`remainingBalance`.\n     */\n    event StakeWithdraw(\n        address indexed staker,\n        address token,\n        uint256 value,\n        uint256 remainingBalance\n    );\n\n    /**\n     * @dev Emitted when fundmanager transfers intrest collected from defi protrocol.\n     * `recipient` will receive `intrestTokenValue` as intrest.\n     */\n    event InterestCollected(\n        address recipient,\n        address token,\n        address intrestToken,\n        uint256 intrestTokenValue,\n        uint256 tokenValue,\n        uint256 tokenPrecisionLoss\n    );\n\n    /**\n     * @dev stake some tokens\n     * @param amount of Tokens to stake\n     */\n    function stake(uint256 amount) external {}\n\n    /**\n     * @dev withdraw staked tokens\n     */\n    function withdrawStake() external {}\n\n    /**\n     * @dev calculates the holding of intrestToken by staking contract in terms of token value.\n     * @return It will return the token worth of intrest token that contract is holding.\n     */\n    function currentTokenWorth() external view returns (uint256) {}\n\n    /**\n     * @dev calculates the tokenGain, intrestTokenGain and precisionLossToken\n     * @return Intrest gained on lending the tokens.\n     * @return Intrest gained on lending the tokens in terms of token rate.\n     * @return Token's precision loss due to decimal difference.\n     */\n    function currentUBIInterest()\n        external\n        view\n        returns (\n            uint256,\n            uint256,\n            uint256\n        )\n    {}\n\n    /**\n     * @dev collect gained interest by fundmanager\n     * @param recipient of intrestToken gains\n     * @return Intrest gained on lending the tokens.\n     * @return Intrest gained on lending the tokens in terms of token rate.\n     * @return Token's precision loss due to decimal difference.\n     * @return average intrest donation ratio.\n     */\n    function collectUBIInterest(address recipient)\n        external\n        returns (\n            uint256,\n            uint256,\n            uint256,\n            uint32\n        )\n    {}\n\n    /**\n     * @dev Invests staked tokens to defi protocol.\n     * @param amount tokens staked.\n     */\n    function mint(uint256 amount) internal {}\n\n    /**\n     * @dev Redeem invested tokens from defi protocol.\n     * @param amount tokens to be redeemed.\n     */\n    function redeem(uint256 amount) internal {}\n\n    /**\n     * @dev Calculates exchange rate for token to intrest token from defi protocol.\n     * @return exchange rate.\n     */\n    function exchangeRate() internal view returns (uint256) {}\n\n    /**\n     * @dev Returns decimal value for token.\n     */\n    function tokenDecimal() internal view returns (uint256) {}\n\n    /**\n     * @dev Returns decimal value for intrest token.\n     */\n    function iTokenDecimal() internal view returns (uint256) {}\n}\n",
  "sourcePath": "/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/stakingModel/contracts/AbstractGoodStaking.sol",
  "ast": {
    "absolutePath": "/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/stakingModel/contracts/AbstractGoodStaking.sol",
    "exportedSymbols": {
      "AbstractGoodStaking": [
        3881
      ]
    },
    "id": 3882,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 3769,
        "literals": [
          "solidity",
          ">",
          "0.5",
          ".4"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:20"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": "@title Abstract contract that holds all the data,\nevents and functions for staking contract.\nThe staking contract will inherit this interface",
        "fullyImplemented": true,
        "id": 3881,
        "linearizedBaseContracts": [
          3881
        ],
        "name": "AbstractGoodStaking",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "canonicalName": "AbstractGoodStaking.Staker",
            "id": 3774,
            "members": [
              {
                "constant": false,
                "id": 3771,
                "name": "stakedToken",
                "nodeType": "VariableDeclaration",
                "scope": 3774,
                "src": "388:19:20",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 3770,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "388:7:20",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 3773,
                "name": "lastStake",
                "nodeType": "VariableDeclaration",
                "scope": 3774,
                "src": "417:17:20",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 3772,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "417:7:20",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "Staker",
            "nodeType": "StructDefinition",
            "scope": 3881,
            "src": "364:77:20",
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 3778,
            "name": "stakers",
            "nodeType": "VariableDeclaration",
            "scope": 3881,
            "src": "523:41:20",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Staker_$3774_storage_$",
              "typeString": "mapping(address => struct AbstractGoodStaking.Staker)"
            },
            "typeName": {
              "id": 3777,
              "keyType": {
                "id": 3775,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "531:7:20",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "523:26:20",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Staker_$3774_storage_$",
                "typeString": "mapping(address => struct AbstractGoodStaking.Staker)"
              },
              "valueType": {
                "contractScope": null,
                "id": 3776,
                "name": "Staker",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 3774,
                "src": "542:6:20",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Staker_$3774_storage_ptr",
                  "typeString": "struct AbstractGoodStaking.Staker"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": "@dev Emitted when `staker` stake `value` tokens of `token`",
            "id": 3786,
            "name": "Staked",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3785,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3780,
                  "indexed": true,
                  "name": "staker",
                  "nodeType": "VariableDeclaration",
                  "scope": 3786,
                  "src": "666:22:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3779,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "666:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3782,
                  "indexed": false,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3786,
                  "src": "690:13:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3781,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "690:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3784,
                  "indexed": false,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 3786,
                  "src": "705:13:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3783,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "705:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "665:54:20"
            },
            "src": "653:67:20"
          },
          {
            "anonymous": false,
            "documentation": "@dev Emitted when `staker` withdraws their stake `value` tokens and contracts balance will\nbe reduced to`remainingBalance`.",
            "id": 3796,
            "name": "StakeWithdraw",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3795,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3788,
                  "indexed": true,
                  "name": "staker",
                  "nodeType": "VariableDeclaration",
                  "scope": 3796,
                  "src": "909:22:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3787,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "909:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3790,
                  "indexed": false,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3796,
                  "src": "941:13:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3789,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "941:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3792,
                  "indexed": false,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 3796,
                  "src": "964:13:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3791,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "964:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3794,
                  "indexed": false,
                  "name": "remainingBalance",
                  "nodeType": "VariableDeclaration",
                  "scope": 3796,
                  "src": "987:24:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3793,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "987:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "899:118:20"
            },
            "src": "880:138:20"
          },
          {
            "anonymous": false,
            "documentation": "@dev Emitted when fundmanager transfers intrest collected from defi protrocol.\n`recipient` will receive `intrestTokenValue` as intrest.",
            "id": 3810,
            "name": "InterestCollected",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3809,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3798,
                  "indexed": false,
                  "name": "recipient",
                  "nodeType": "VariableDeclaration",
                  "scope": 3810,
                  "src": "1223:17:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3797,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1223:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3800,
                  "indexed": false,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3810,
                  "src": "1250:13:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3799,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1250:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3802,
                  "indexed": false,
                  "name": "intrestToken",
                  "nodeType": "VariableDeclaration",
                  "scope": 3810,
                  "src": "1273:20:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3801,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1273:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3804,
                  "indexed": false,
                  "name": "intrestTokenValue",
                  "nodeType": "VariableDeclaration",
                  "scope": 3810,
                  "src": "1303:25:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3803,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1303:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3806,
                  "indexed": false,
                  "name": "tokenValue",
                  "nodeType": "VariableDeclaration",
                  "scope": 3810,
                  "src": "1338:18:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3805,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1338:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3808,
                  "indexed": false,
                  "name": "tokenPrecisionLoss",
                  "nodeType": "VariableDeclaration",
                  "scope": 3810,
                  "src": "1366:26:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3807,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1366:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1213:185:20"
            },
            "src": "1190:209:20"
          },
          {
            "body": {
              "id": 3815,
              "nodeType": "Block",
              "src": "1531:2:20",
              "statements": []
            },
            "documentation": "@dev stake some tokens\n@param amount of Tokens to stake",
            "id": 3816,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "stake",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3813,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3812,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3816,
                  "src": "1506:14:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3811,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1506:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1505:16:20"
            },
            "returnParameters": {
              "id": 3814,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1531:0:20"
            },
            "scope": 3881,
            "src": "1491:42:20",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 3819,
              "nodeType": "Block",
              "src": "1624:2:20",
              "statements": []
            },
            "documentation": "@dev withdraw staked tokens",
            "id": 3820,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "withdrawStake",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3817,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1612:2:20"
            },
            "returnParameters": {
              "id": 3818,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1624:0:20"
            },
            "scope": 3881,
            "src": "1590:36:20",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 3825,
              "nodeType": "Block",
              "src": "1894:2:20",
              "statements": []
            },
            "documentation": "@dev calculates the holding of intrestToken by staking contract in terms of token value.\n@return It will return the token worth of intrest token that contract is holding.",
            "id": 3826,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "currentTokenWorth",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3821,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1859:2:20"
            },
            "returnParameters": {
              "id": 3824,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3823,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3826,
                  "src": "1885:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3822,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1885:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1884:9:20"
            },
            "scope": 3881,
            "src": "1833:63:20",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 3835,
              "nodeType": "Block",
              "src": "2344:2:20",
              "statements": []
            },
            "documentation": "@dev calculates the tokenGain, intrestTokenGain and precisionLossToken\n@return Intrest gained on lending the tokens.\n@return Intrest gained on lending the tokens in terms of token rate.\n@return Token's precision loss due to decimal difference.",
            "id": 3836,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "currentUBIInterest",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3827,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2217:2:20"
            },
            "returnParameters": {
              "id": 3834,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3829,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3836,
                  "src": "2280:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3828,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2280:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3831,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3836,
                  "src": "2301:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3830,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2301:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3833,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3836,
                  "src": "2322:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3832,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2322:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2266:73:20"
            },
            "scope": 3881,
            "src": "2190:156:20",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 3849,
              "nodeType": "Block",
              "src": "2884:2:20",
              "statements": []
            },
            "documentation": "@dev collect gained interest by fundmanager\n@param recipient of intrestToken gains\n@return Intrest gained on lending the tokens.\n@return Intrest gained on lending the tokens in terms of token rate.\n@return Token's precision loss due to decimal difference.\n@return average intrest donation ratio.",
            "id": 3850,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "collectUBIInterest",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3839,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3838,
                  "name": "recipient",
                  "nodeType": "VariableDeclaration",
                  "scope": 3850,
                  "src": "2734:17:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3837,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2734:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2733:19:20"
            },
            "returnParameters": {
              "id": 3848,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3841,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3850,
                  "src": "2800:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3840,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2800:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3843,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3850,
                  "src": "2821:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3842,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2821:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3845,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3850,
                  "src": "2842:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3844,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2842:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3847,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3850,
                  "src": "2863:6:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3846,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2863:6:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2786:93:20"
            },
            "scope": 3881,
            "src": "2706:180:20",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 3855,
              "nodeType": "Block",
              "src": "3035:2:20",
              "statements": []
            },
            "documentation": "@dev Invests staked tokens to defi protocol.\n@param amount tokens staked.",
            "id": 3856,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "mint",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3853,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3852,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3856,
                  "src": "3010:14:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3851,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3010:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3009:16:20"
            },
            "returnParameters": {
              "id": 3854,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3035:0:20"
            },
            "scope": 3881,
            "src": "2996:41:20",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3861,
              "nodeType": "Block",
              "src": "3199:2:20",
              "statements": []
            },
            "documentation": "@dev Redeem invested tokens from defi protocol.\n@param amount tokens to be redeemed.",
            "id": 3862,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "redeem",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3859,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3858,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3862,
                  "src": "3174:14:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3857,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3174:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3173:16:20"
            },
            "returnParameters": {
              "id": 3860,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3199:0:20"
            },
            "scope": 3881,
            "src": "3158:43:20",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3867,
              "nodeType": "Block",
              "src": "3393:2:20",
              "statements": []
            },
            "documentation": "@dev Calculates exchange rate for token to intrest token from defi protocol.\n@return exchange rate.",
            "id": 3868,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "exchangeRate",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3863,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3358:2:20"
            },
            "returnParameters": {
              "id": 3866,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3865,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3868,
                  "src": "3384:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3864,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3384:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3383:9:20"
            },
            "scope": 3881,
            "src": "3337:58:20",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3873,
              "nodeType": "Block",
              "src": "3518:2:20",
              "statements": []
            },
            "documentation": "@dev Returns decimal value for token.",
            "id": 3874,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "tokenDecimal",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3869,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3483:2:20"
            },
            "returnParameters": {
              "id": 3872,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3871,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3874,
                  "src": "3509:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3870,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3509:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3508:9:20"
            },
            "scope": 3881,
            "src": "3462:58:20",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3879,
              "nodeType": "Block",
              "src": "3652:2:20",
              "statements": []
            },
            "documentation": "@dev Returns decimal value for intrest token.",
            "id": 3880,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "iTokenDecimal",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3875,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3617:2:20"
            },
            "returnParameters": {
              "id": 3878,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3877,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3880,
                  "src": "3643:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3876,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3643:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3642:9:20"
            },
            "scope": 3881,
            "src": "3595:59:20",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 3882,
        "src": "184:3472:20"
      }
    ],
    "src": "0:3657:20"
  },
  "legacyAST": {
    "absolutePath": "/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/stakingModel/contracts/AbstractGoodStaking.sol",
    "exportedSymbols": {
      "AbstractGoodStaking": [
        3881
      ]
    },
    "id": 3882,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 3769,
        "literals": [
          "solidity",
          ">",
          "0.5",
          ".4"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:20"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": "@title Abstract contract that holds all the data,\nevents and functions for staking contract.\nThe staking contract will inherit this interface",
        "fullyImplemented": true,
        "id": 3881,
        "linearizedBaseContracts": [
          3881
        ],
        "name": "AbstractGoodStaking",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "canonicalName": "AbstractGoodStaking.Staker",
            "id": 3774,
            "members": [
              {
                "constant": false,
                "id": 3771,
                "name": "stakedToken",
                "nodeType": "VariableDeclaration",
                "scope": 3774,
                "src": "388:19:20",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 3770,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "388:7:20",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 3773,
                "name": "lastStake",
                "nodeType": "VariableDeclaration",
                "scope": 3774,
                "src": "417:17:20",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                },
                "typeName": {
                  "id": 3772,
                  "name": "uint256",
                  "nodeType": "ElementaryTypeName",
                  "src": "417:7:20",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "Staker",
            "nodeType": "StructDefinition",
            "scope": 3881,
            "src": "364:77:20",
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 3778,
            "name": "stakers",
            "nodeType": "VariableDeclaration",
            "scope": 3881,
            "src": "523:41:20",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Staker_$3774_storage_$",
              "typeString": "mapping(address => struct AbstractGoodStaking.Staker)"
            },
            "typeName": {
              "id": 3777,
              "keyType": {
                "id": 3775,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "531:7:20",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "523:26:20",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Staker_$3774_storage_$",
                "typeString": "mapping(address => struct AbstractGoodStaking.Staker)"
              },
              "valueType": {
                "contractScope": null,
                "id": 3776,
                "name": "Staker",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 3774,
                "src": "542:6:20",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_Staker_$3774_storage_ptr",
                  "typeString": "struct AbstractGoodStaking.Staker"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": "@dev Emitted when `staker` stake `value` tokens of `token`",
            "id": 3786,
            "name": "Staked",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3785,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3780,
                  "indexed": true,
                  "name": "staker",
                  "nodeType": "VariableDeclaration",
                  "scope": 3786,
                  "src": "666:22:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3779,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "666:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3782,
                  "indexed": false,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3786,
                  "src": "690:13:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3781,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "690:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3784,
                  "indexed": false,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 3786,
                  "src": "705:13:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3783,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "705:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "665:54:20"
            },
            "src": "653:67:20"
          },
          {
            "anonymous": false,
            "documentation": "@dev Emitted when `staker` withdraws their stake `value` tokens and contracts balance will\nbe reduced to`remainingBalance`.",
            "id": 3796,
            "name": "StakeWithdraw",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3795,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3788,
                  "indexed": true,
                  "name": "staker",
                  "nodeType": "VariableDeclaration",
                  "scope": 3796,
                  "src": "909:22:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3787,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "909:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3790,
                  "indexed": false,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3796,
                  "src": "941:13:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3789,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "941:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3792,
                  "indexed": false,
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "scope": 3796,
                  "src": "964:13:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3791,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "964:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3794,
                  "indexed": false,
                  "name": "remainingBalance",
                  "nodeType": "VariableDeclaration",
                  "scope": 3796,
                  "src": "987:24:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3793,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "987:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "899:118:20"
            },
            "src": "880:138:20"
          },
          {
            "anonymous": false,
            "documentation": "@dev Emitted when fundmanager transfers intrest collected from defi protrocol.\n`recipient` will receive `intrestTokenValue` as intrest.",
            "id": 3810,
            "name": "InterestCollected",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 3809,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3798,
                  "indexed": false,
                  "name": "recipient",
                  "nodeType": "VariableDeclaration",
                  "scope": 3810,
                  "src": "1223:17:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3797,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1223:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3800,
                  "indexed": false,
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "scope": 3810,
                  "src": "1250:13:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3799,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1250:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3802,
                  "indexed": false,
                  "name": "intrestToken",
                  "nodeType": "VariableDeclaration",
                  "scope": 3810,
                  "src": "1273:20:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3801,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1273:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3804,
                  "indexed": false,
                  "name": "intrestTokenValue",
                  "nodeType": "VariableDeclaration",
                  "scope": 3810,
                  "src": "1303:25:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3803,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1303:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3806,
                  "indexed": false,
                  "name": "tokenValue",
                  "nodeType": "VariableDeclaration",
                  "scope": 3810,
                  "src": "1338:18:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3805,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1338:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3808,
                  "indexed": false,
                  "name": "tokenPrecisionLoss",
                  "nodeType": "VariableDeclaration",
                  "scope": 3810,
                  "src": "1366:26:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3807,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1366:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1213:185:20"
            },
            "src": "1190:209:20"
          },
          {
            "body": {
              "id": 3815,
              "nodeType": "Block",
              "src": "1531:2:20",
              "statements": []
            },
            "documentation": "@dev stake some tokens\n@param amount of Tokens to stake",
            "id": 3816,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "stake",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3813,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3812,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3816,
                  "src": "1506:14:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3811,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1506:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1505:16:20"
            },
            "returnParameters": {
              "id": 3814,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1531:0:20"
            },
            "scope": 3881,
            "src": "1491:42:20",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 3819,
              "nodeType": "Block",
              "src": "1624:2:20",
              "statements": []
            },
            "documentation": "@dev withdraw staked tokens",
            "id": 3820,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "withdrawStake",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3817,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1612:2:20"
            },
            "returnParameters": {
              "id": 3818,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1624:0:20"
            },
            "scope": 3881,
            "src": "1590:36:20",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 3825,
              "nodeType": "Block",
              "src": "1894:2:20",
              "statements": []
            },
            "documentation": "@dev calculates the holding of intrestToken by staking contract in terms of token value.\n@return It will return the token worth of intrest token that contract is holding.",
            "id": 3826,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "currentTokenWorth",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3821,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1859:2:20"
            },
            "returnParameters": {
              "id": 3824,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3823,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3826,
                  "src": "1885:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3822,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1885:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1884:9:20"
            },
            "scope": 3881,
            "src": "1833:63:20",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 3835,
              "nodeType": "Block",
              "src": "2344:2:20",
              "statements": []
            },
            "documentation": "@dev calculates the tokenGain, intrestTokenGain and precisionLossToken\n@return Intrest gained on lending the tokens.\n@return Intrest gained on lending the tokens in terms of token rate.\n@return Token's precision loss due to decimal difference.",
            "id": 3836,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "currentUBIInterest",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3827,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2217:2:20"
            },
            "returnParameters": {
              "id": 3834,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3829,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3836,
                  "src": "2280:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3828,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2280:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3831,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3836,
                  "src": "2301:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3830,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2301:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3833,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3836,
                  "src": "2322:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3832,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2322:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2266:73:20"
            },
            "scope": 3881,
            "src": "2190:156:20",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 3849,
              "nodeType": "Block",
              "src": "2884:2:20",
              "statements": []
            },
            "documentation": "@dev collect gained interest by fundmanager\n@param recipient of intrestToken gains\n@return Intrest gained on lending the tokens.\n@return Intrest gained on lending the tokens in terms of token rate.\n@return Token's precision loss due to decimal difference.\n@return average intrest donation ratio.",
            "id": 3850,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "collectUBIInterest",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3839,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3838,
                  "name": "recipient",
                  "nodeType": "VariableDeclaration",
                  "scope": 3850,
                  "src": "2734:17:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3837,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2734:7:20",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2733:19:20"
            },
            "returnParameters": {
              "id": 3848,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3841,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3850,
                  "src": "2800:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3840,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2800:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3843,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3850,
                  "src": "2821:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3842,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2821:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3845,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3850,
                  "src": "2842:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3844,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2842:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3847,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3850,
                  "src": "2863:6:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 3846,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2863:6:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2786:93:20"
            },
            "scope": 3881,
            "src": "2706:180:20",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "external"
          },
          {
            "body": {
              "id": 3855,
              "nodeType": "Block",
              "src": "3035:2:20",
              "statements": []
            },
            "documentation": "@dev Invests staked tokens to defi protocol.\n@param amount tokens staked.",
            "id": 3856,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "mint",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3853,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3852,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3856,
                  "src": "3010:14:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3851,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3010:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3009:16:20"
            },
            "returnParameters": {
              "id": 3854,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3035:0:20"
            },
            "scope": 3881,
            "src": "2996:41:20",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3861,
              "nodeType": "Block",
              "src": "3199:2:20",
              "statements": []
            },
            "documentation": "@dev Redeem invested tokens from defi protocol.\n@param amount tokens to be redeemed.",
            "id": 3862,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "redeem",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3859,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3858,
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "scope": 3862,
                  "src": "3174:14:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3857,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3174:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3173:16:20"
            },
            "returnParameters": {
              "id": 3860,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3199:0:20"
            },
            "scope": 3881,
            "src": "3158:43:20",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3867,
              "nodeType": "Block",
              "src": "3393:2:20",
              "statements": []
            },
            "documentation": "@dev Calculates exchange rate for token to intrest token from defi protocol.\n@return exchange rate.",
            "id": 3868,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "exchangeRate",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3863,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3358:2:20"
            },
            "returnParameters": {
              "id": 3866,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3865,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3868,
                  "src": "3384:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3864,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3384:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3383:9:20"
            },
            "scope": 3881,
            "src": "3337:58:20",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3873,
              "nodeType": "Block",
              "src": "3518:2:20",
              "statements": []
            },
            "documentation": "@dev Returns decimal value for token.",
            "id": 3874,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "tokenDecimal",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3869,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3483:2:20"
            },
            "returnParameters": {
              "id": 3872,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3871,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3874,
                  "src": "3509:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3870,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3509:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3508:9:20"
            },
            "scope": 3881,
            "src": "3462:58:20",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 3879,
              "nodeType": "Block",
              "src": "3652:2:20",
              "statements": []
            },
            "documentation": "@dev Returns decimal value for intrest token.",
            "id": 3880,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "iTokenDecimal",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3875,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3617:2:20"
            },
            "returnParameters": {
              "id": 3878,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3877,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3880,
                  "src": "3643:7:20",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3876,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3643:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3642:9:20"
            },
            "scope": 3881,
            "src": "3595:59:20",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 3882,
        "src": "184:3472:20"
      }
    ],
    "src": "0:3657:20"
  },
  "compiler": {
    "name": "solc",
    "version": "0.5.16+commit.9c3226ce.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.2.2",
  "updatedAt": "2021-08-23T07:33:52.216Z",
  "devdoc": {
    "methods": {
      "collectUBIInterest(address)": {
        "details": "collect gained interest by fundmanager",
        "params": {
          "recipient": "of intrestToken gains"
        },
        "return": "Intrest gained on lending the tokens.Intrest gained on lending the tokens in terms of token rate.Token's precision loss due to decimal difference.average intrest donation ratio."
      },
      "currentTokenWorth()": {
        "details": "calculates the holding of intrestToken by staking contract in terms of token value.",
        "return": "It will return the token worth of intrest token that contract is holding."
      },
      "currentUBIInterest()": {
        "details": "calculates the tokenGain, intrestTokenGain and precisionLossToken",
        "return": "Intrest gained on lending the tokens.Intrest gained on lending the tokens in terms of token rate.Token's precision loss due to decimal difference."
      },
      "stake(uint256)": {
        "details": "stake some tokens",
        "params": {
          "amount": "of Tokens to stake"
        }
      },
      "withdrawStake()": {
        "details": "withdraw staked tokens"
      }
    },
    "title": "Abstract contract that holds all the data, events and functions for staking contract. The staking contract will inherit this interface"
  },
  "userdoc": {
    "methods": {}
  }
}